Compare commits

...

16 Commits

Author SHA1 Message Date
Bernd Jordan
413e1b877e Merge branch 'work/fix_effects' into 'master'
Fix several effects

See merge request multimedia/kdenlive!769
2025-12-05 04:18:49 -08:00
Jean-Baptiste Mardelle
ddd31bbef7 When copy/paste between 2 kdenlive windows, correctly load bin clip effects 2025-12-05 12:36:07 +01:00
Bernd Jordan
e7b7d0e454 Merge branch kdenlive:master into work/fix_effects 2025-12-04 06:28:22 -08:00
Bernd Jordan
e39ccc8cea Enabled alpha for background/fill color 2025-12-02 05:50:00 -08:00
Bernd Jordan
bf8bfb6c99 Fixed accidental copy&paste action 2025-12-01 12:01:24 -08:00
Bernd Jordan
7a060f728a Merge branch kdenlive:master into work/fix_effects 2025-12-01 11:51:15 -08:00
Bernd Jordan
d03182d773 Updated description and list items
Added transform type and precision
2025-12-01 11:37:51 -08:00
Bernd Jordan
2c1c0a934e Updated description and list items 2025-12-01 11:29:32 -08:00
Bernd Jordan
e6eb96fe8e Updated description and list items 2025-12-01 11:27:23 -08:00
Bernd Jordan
614d3fe7b0 Updated description and list items 2025-12-01 11:24:44 -08:00
Bernd Jordan
8747b5d4cd Fixed typo 2025-12-01 11:19:36 -08:00
Bernd Jordan
caa9f1a97f Updated description and list items 2025-12-01 11:19:05 -08:00
Bernd Jordan
7037261170 Updated description and list items 2025-12-01 11:16:27 -08:00
Bernd Jordan
09e41c54fd Updated description and list items 2025-12-01 11:12:59 -08:00
Bernd Jordan
21a4c9b0cb Updated description and list items 2025-12-01 11:09:47 -08:00
Bernd Jordan
c0e370720f Updated description and list entries 2025-12-01 11:06:24 -08:00
15 changed files with 156 additions and 112 deletions

View File

@@ -2,14 +2,14 @@
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.allpass" id="avfilter.allpass" type="audio">
<name>Allpass</name>
<description>Apply a two-pole all-pass filter with central frequency (in Hz) frequency, and filter-width width. An all-pass filter changes the audios frequency to phase relationship without changing its frequency to amplitude relationship.</description>
<description>Apply a two-pole all-pass filter with central frequency and filter-width. An all-pass filter changes the audios frequency to phase relationship without changing its frequency to amplitude relationship.</description>
<author>libavfilter</author>
<parameter type="constant" name="av.f" default="3000" min="20" max="20000" suffix="Hz">
<name>Central frequency</name>
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Method</name>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" default="707.1" min="1" max="9999" decimals="2">
<name>Filter-width</name>
@@ -24,12 +24,12 @@
<name>Order</name>
<paramlistdisplay>1,2</paramlistdisplay>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -2,17 +2,17 @@
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.bandpass" id="avfilter.bandpass" type="audio">
<name>Band-pass</name>
<description>Apply a two-pole Butterworth band-pass filter with central frequency, and (3dB-point) band-width width. The csg option selects a constant skirt gain (peak gain = Q) instead of the default: constant 0dB peak gain. The filter roll off at 6dB per octave (20dB per decade). </description>
<description>Apply a two-pole Butterworth band-pass filter with central frequency and (3dB-point) band-width. The CSG option selects a constant skirt gain (peak gain = Q) instead of the default: constant 0dB peak gain. The filter roll off at 6dB per octave (20dB per decade). </description>
<author>libavfilter</author>
<parameter type="constant" name="av.f" default="3000" min="20" max="20000" suffix="Hz">
<name>Central Frequency</name>
</parameter>
<parameter type="bool" name="av.csg" default="0">
<name>Constant skirt gain</name>
<name>Constant Skirt Gain</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Method</name>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" default="0.5" min="1" max="9999" decimals="1">
<name>Filter-width</name>
@@ -23,12 +23,12 @@
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -2,14 +2,14 @@
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.bandreject" id="avfilter.bandreject" type="audio">
<name>Band-Reject</name>
<description>Apply a two-pole Butterworth band-reject filter with central frequency frequency, and (3dB-point) band-width width. The filter roll off at 6dB per octave (20dB per decade).</description>
<description>Apply a two-pole Butterworth band-reject filter with central frequency and (3dB-point) band-width. The filter roll off at 6dB per octave (20dB per decade).</description>
<author>libavfilter</author>
<parameter type="constant" name="av.f" default="3000" min="20" max="20000" suffix="Hz">
<name>Central frequency</name>
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Method</name>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" default="0.5" min="0.1" max="9999" decimals="1">
<name>Filter-width</name>
@@ -20,12 +20,12 @@
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -2,17 +2,17 @@
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.bass" id="avfilter.bass" type="audio">
<name>Bass</name>
<description>Apply a two-pole all-pass filter with central frequency (in Hz) frequency, and filter-width width. Boost or cut lower frequencies.</description>
<description>Boost or cut the bass (lower) frequencies of the audio using a two-pole shelving filter with a response similar to that of a standard hi-fis tone-controls. This is also known as shelving equalisation (EQ)</description>
<author>libavfilter</author>
<parameter type="constant" name="av.g" default="0" min="-20" max="20" suffix="dB">
<name>Gain</name>
</parameter>
<parameter type="constant" name="av.f" default="100" min="20" max="20000" suffix="Hz">
<name>Central frequency</name>
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Method</name>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" default="0.5" min="1" max="9999" decimals="2">
<name>Filter-width</name>
@@ -27,12 +27,12 @@
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -1,15 +1,15 @@
<?xml version="1.0"?>
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.equalizer" type="audio">
<effect xmlns="https://www.kdenlive.org" tag="avfilter.equalizer" id="avfilter.equalizer" type="audio">
<name>Audio Equalizer (avfilter)</name>
<description>Apply two-pole peaking equalization (EQ) filter</description>
<description>Apply two-pole peaking equalization (EQ) filter. With this filter, the signal-level at and around a selected frequency can be increased or decreased, whilst (unlike bandpass and bandreject filters) that at all other frequencies is unchanged.</description>
<author>libavfilter</author>
<parameter type="constant" name="av.f" max="24000" min="0" default="500">
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="q" paramlist="h;q;o;s;k">
<name>Width Type</name>
<paramlistdisplay>Hertz,Q-Factor,Octave,Slope,None</paramlistdisplay>
<paramlistdisplay>Hertz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" max="24000" min="1" default="100">
<name>Band Width</name>
@@ -20,4 +20,15 @@
<parameter type="constant" name="av.m" max="1" min="0" default="1" decimals="2">
<name>Mix</name>
</parameter>
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -2,14 +2,14 @@
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.highpass" id="avfilter.highpass" type="audio">
<name>High-pass</name>
<description>Apply a high-pass filter with 3dB point frequency.</description>
<description>Apply a high-pass filter with 3dB point frequency. The filter can be either single-pole, or double-pole (the default). The filter roll off at 6dB per pole per octave (20dB per pole per decade).</description>
<author>libavfilter</author>
<parameter type="constant" name="av.f" default="3000" min="20" max="20000" suffix="Hz">
<name>Central frequency</name>
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Type</name>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" default="707" min="100" max="99999" decimals="3">
<name>Filter-width</name>
@@ -24,12 +24,12 @@
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -2,14 +2,14 @@
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.highshelf" id="avfilter.highshelf" type="audio">
<name>High-shelf</name>
<description>Apply a high shelf filter.</description>
<description>Apply a high-shelf filter.</description>
<author>libavfilter</author>
<parameter type="constant" name="av.f" default="3000" min="20" max="20000" suffix="Hz">
<name>Central frequency</name>
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Type</name>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" default="0.5" min="0.1" max="9999" decimals="1">
<name>Filter-width</name>
@@ -27,12 +27,12 @@
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -2,14 +2,14 @@
<!DOCTYPE kpartgui>
<effect xmlns="https://www.kdenlive.org" tag="avfilter.lowpass" id="avfilter.lowpass" type="audio">
<name>Low-pass</name>
<description>Apply a low-pass filter with 3dB point frequency.</description>
<description>Apply a low-pass filter with 3dB point frequency. The filter can be either single-pole or double-pole (the default). The filter roll off at 6dB per pole per octave (20dB per pole per decade).</description>
<author>libavfilter</author>
<parameter type="animated" name="av.f" default="500" min="20" max="20000" suffix="Hz">
<name>Central frequency</name>
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Type</name>
<paramlistdisplay>Hz,Q-FActor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-FActor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="animated" name="av.w" default="0.707" min="0.001" max="9999" decimals="3">
<name>Filter-width</name>
@@ -24,12 +24,12 @@
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -5,11 +5,11 @@
<description>Apply a low shelf filter.</description>
<author>libavfilter</author>
<parameter type="constant" name="av.f" default="100" min="20" max="20000" suffix="Hz">
<name>Central frequency</name>
<name>Central Frequency</name>
</parameter>
<parameter type="list" name="av.t" default="h" paramlist="h;q;o;s;k">
<name>Type</name>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,KHz</paramlistdisplay>
<paramlistdisplay>Hz,Q-Factor,Octave,Slope,kHz</paramlistdisplay>
</parameter>
<parameter type="constant" name="av.w" default="0.5" min="0.1" max="9999" decimals="1">
<name>Filter-width</name>
@@ -27,12 +27,12 @@
<parameter type="bool" name="av.n" default="0">
<name>Normalize</name>
</parameter>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt">
<name>Transform type</name>
<paramlistdisplay>di,dii,tdii,latt</paramlistdisplay>
<parameter type="list" name="av.a" default="di" paramlist="di;dii;tdii;latt;svf;zdf">
<name>Transform Type</name>
<paramlistdisplay>DI,DII,TDII,LATT,State Variable Filter (SVF),Zero Delay Filter (ZDF)</paramlistdisplay>
</parameter>
<parameter type="list" name="av.r" default="auto" paramlist="auto;s16;s32;f32;f64">
<name>Filter precision</name>
<paramlistdisplay>Auto,s16,s32,f32,f64</paramlistdisplay>
<name>Filter Precision</name>
<paramlistdisplay>Auto,Signed 16-bit,Signed 32-bit,Float 32-bit,Float 64-bit</paramlistdisplay>
</parameter>
</effect>

View File

@@ -10,7 +10,7 @@
<parameter type="animated" name="av.shy" default="0" min="-2" max="2" decimals="3">
<name>Y-axis Shear Factor</name>
</parameter>
<parameter type="fixedcolor" name="av.c" default="0x000000" alpha="0">
<parameter type="fixedcolor" name="av.c" default="0x00000000" alpha="1">
<name>Background Fill Color</name>
</parameter>
<parameter type="list" name="av.interp" default="nearest" paramlist="nearest;bilinear">

View File

@@ -386,6 +386,28 @@ QDomElement EffectStackModel::rowToXml(int row, QDomDocument &document)
return container;
}
bool EffectStackModel::fromMltXml(const QDomElement &effectsXml)
{
QDomNodeList nodeList = effectsXml.elementsByTagName(QStringLiteral("filter"));
for (int i = 0; i < nodeList.count(); ++i) {
QDomElement node = nodeList.item(i).toElement();
if (!Xml::hasXmlProperty(node, QStringLiteral("kdenlive_id")) || Xml::hasXmlProperty(node, QStringLiteral("internal_added"))) {
// Internal effect, ignore
continue;
}
if (Xml::hasXmlProperty(node, QStringLiteral("kdenlive:builtin")) && Xml::getXmlProperty(node, QStringLiteral("disable")) == QLatin1String("1")) {
// Disabled built-in effect, ignore
continue;
}
const QString effectId = Xml::getXmlProperty(node, QStringLiteral("kdenlive_id"));
Fun undo = []() { return true; };
Fun redo = []() { return true; };
stringMap params = Xml::getXmlPropertyByWildcard(node, QString());
doAppendEffect(effectId, false, params, undo, redo);
}
return true;
}
bool EffectStackModel::fromXml(const QDomElement &effectsXml, Fun &undo, Fun &redo)
{
QDomNodeList nodeList = effectsXml.elementsByTagName(QStringLiteral("effect"));

View File

@@ -137,6 +137,8 @@ public:
QDomElement rowToXml(int row, QDomDocument &document);
/** @brief Load an effect stack from an XML representation */
bool fromXml(const QDomElement &effectsXml, Fun &undo, Fun &redo);
/** @brief Load an effect stack from an MLT XML representation */
bool fromMltXml(const QDomElement &effectsXml);
/** @brief Delete active effect from stack */
void removeCurrentEffect();

View File

@@ -69,6 +69,9 @@ ClipController::ClipController(const QString &clipId, const std::shared_ptr<Mlt:
} else {
m_controlUuid = QUuid::createUuid();
}
if (description.elementsByTagName(QStringLiteral("filter")).count() > 0) {
m_effectsToLoad = description;
}
}
}
@@ -123,56 +126,61 @@ void ClipController::addMasterProducer(const std::shared_ptr<Mlt::Producer> &pro
if (!m_masterProducer->is_valid()) {
m_masterProducer = std::shared_ptr<Mlt::Producer>(pCore->mediaUnavailable->cut());
qCDebug(KDENLIVE_LOG) << "// WARNING, USING INVALID PRODUCER";
} else {
setProducerProperty(QStringLiteral("kdenlive:id"), m_controllerBinId);
if (!m_properties->property_exists("kdenlive:control_uuid")) {
m_properties->set("kdenlive:control_uuid", m_controlUuid.toString().toUtf8().constData());
}
getInfoForProducer();
checkAudioVideo();
if (!m_hasMultipleVideoStreams && m_service.startsWith(QLatin1String("avformat")) && (m_clipType == ClipType::AV || m_clipType == ClipType::Video)) {
// Check if clip has multiple video streams
QList<int> videoStreams;
QList<int> audioStreams;
int aStreams = m_properties->get_int("meta.media.nb_streams");
for (int ix = 0; ix < aStreams; ++ix) {
char property[200];
snprintf(property, sizeof(property), "meta.media.%d.stream.type", ix);
QString type = m_properties->get(property);
if (type == QLatin1String("video")) {
QString key = QStringLiteral("meta.media.%1.codec.name").arg(ix);
QString codec_name = m_properties->get(key.toLatin1().constData());
if (codec_name == QLatin1String("png")) {
connectEffectStack();
return;
}
setProducerProperty(QStringLiteral("kdenlive:id"), m_controllerBinId);
if (!m_properties->property_exists("kdenlive:control_uuid")) {
m_properties->set("kdenlive:control_uuid", m_controlUuid.toString().toUtf8().constData());
}
getInfoForProducer();
checkAudioVideo();
if (!m_effectsToLoad.isNull()) {
m_effectStack->fromMltXml(m_effectsToLoad);
m_effectsToLoad.clear();
}
if (!m_hasMultipleVideoStreams && m_service.startsWith(QLatin1String("avformat")) && (m_clipType == ClipType::AV || m_clipType == ClipType::Video)) {
// Check if clip has multiple video streams
QList<int> videoStreams;
QList<int> audioStreams;
int aStreams = m_properties->get_int("meta.media.nb_streams");
for (int ix = 0; ix < aStreams; ++ix) {
char property[200];
snprintf(property, sizeof(property), "meta.media.%d.stream.type", ix);
QString type = m_properties->get(property);
if (type == QLatin1String("video")) {
QString key = QStringLiteral("meta.media.%1.codec.name").arg(ix);
QString codec_name = m_properties->get(key.toLatin1().constData());
if (codec_name == QLatin1String("png")) {
// This is a cover image, skip
qDebug() << "=== FOUND PNG COVER ART STREAM: " << ix;
setProducerProperty(QStringLiteral("kdenlive:coverartstream"), ix);
continue;
}
if (codec_name == QLatin1String("mjpeg")) {
key = QStringLiteral("meta.media.%1.stream.frame_rate").arg(ix);
QString fps = m_properties->get(key.toLatin1().constData());
if (fps.isEmpty()) {
key = QStringLiteral("meta.media.%1.codec.frame_rate").arg(ix);
fps = m_properties->get(key.toLatin1().constData());
}
if (fps == QLatin1String("90000")) {
// This is a cover image, skip
qDebug() << "=== FOUND PNG COVER ART STREAM: " << ix;
qDebug() << "=== FOUND MJPEG COVER ART STREAM: " << ix;
setProducerProperty(QStringLiteral("kdenlive:coverartstream"), ix);
continue;
}
if (codec_name == QLatin1String("mjpeg")) {
key = QStringLiteral("meta.media.%1.stream.frame_rate").arg(ix);
QString fps = m_properties->get(key.toLatin1().constData());
if (fps.isEmpty()) {
key = QStringLiteral("meta.media.%1.codec.frame_rate").arg(ix);
fps = m_properties->get(key.toLatin1().constData());
}
if (fps == QLatin1String("90000")) {
// This is a cover image, skip
qDebug() << "=== FOUND MJPEG COVER ART STREAM: " << ix;
setProducerProperty(QStringLiteral("kdenlive:coverartstream"), ix);
continue;
}
}
videoStreams << ix;
} else if (type == QLatin1String("audio")) {
audioStreams << ix;
}
videoStreams << ix;
} else if (type == QLatin1String("audio")) {
audioStreams << ix;
}
if (videoStreams.count() > 1) {
setProducerProperty(QStringLiteral("kdenlive:multistreams"), 1);
m_hasMultipleVideoStreams = true;
QMetaObject::invokeMethod(pCore->bin(), "processMultiStream", Qt::QueuedConnection, Q_ARG(QString, m_controllerBinId),
Q_ARG(QList<int>, videoStreams), Q_ARG(QList<int>, audioStreams));
}
}
if (videoStreams.count() > 1) {
setProducerProperty(QStringLiteral("kdenlive:multistreams"), 1);
m_hasMultipleVideoStreams = true;
QMetaObject::invokeMethod(pCore->bin(), "processMultiStream", Qt::QueuedConnection, Q_ARG(QString, m_controllerBinId),
Q_ARG(QList<int>, videoStreams), Q_ARG(QList<int>, audioStreams));
}
}
connectEffectStack();

View File

@@ -251,6 +251,7 @@ private:
/** @brief Temporarily store clip properties until producer is available */
QMap <QString, QVariant> m_tempProps;
QString m_controllerBinId;
QDomElement m_effectsToLoad;
/** @brief Build the audio info object */
void buildAudioInfo(int audioIndex);
};

View File

@@ -218,7 +218,7 @@ QMap<QString, QString> Xml::getXmlPropertyByWildcard(const QDomElement &element,
QDomNodeList params = element.elementsByTagName(QStringLiteral("property"));
for (int i = 0; i < params.count(); ++i) {
QDomElement e = params.item(i).toElement();
if (e.attribute(QStringLiteral("name")).startsWith(propertyName)) {
if (propertyName.isEmpty() || e.attribute(QStringLiteral("name")).startsWith(propertyName)) {
props.insert(e.attribute(QStringLiteral("name")), e.text());
}
}