Commit 948845ec authored by Vivek Yadav's avatar Vivek Yadav
Browse files

merge

parents 9e8f26cc 470c06fc
......@@ -14,5 +14,5 @@
</parameter>
<parameter type="bool" name="av.yuv" default="false">
<name>for YUV color</name>
</parameter>
</parameter>
</effect>
......@@ -23,8 +23,9 @@
</parameter>
<parameter type="constant" name="av.o" max="1" min="0" default="0.75" decimals="2">
<name>Opacity</name>
<parameter type="list" name="av.f" default="hex" paramlist="hex;dec">
</parameter>
<parameter type="list" name="av.f" default="hex" paramlist="hex;dec">
<paramlistdisplay>Hex,Dec</paramlistdisplay>
<name>Format</name>
</parameter>
</parameter>
</effect>
......@@ -4,7 +4,7 @@
<description>Remove blocking artifacts from input video.</description>
<author>libavfilter</author>
<parameter type="list" name="av.filter" default="strong" paramlist="weak;strong">
<paramlistdisplay>All,Y,U,V,Alpha,Red,Green,Blue</paramlistdisplay>
<paramlistdisplay>Weak,Strong</paramlistdisplay>
<name>Filter strength</name>
</parameter>
<parameter type="constant" name="av.block" default="8" min="4" max="512" factor="1">
......
......@@ -4,21 +4,22 @@
<description>Fill borders of the input video, without changing video stream dimensions. Sometimes video can have garbage at the four edges and you may not want to crop video input to keep size multiple of some number</description>
<author>libavfilter</author>
<parameter type="constant" name="av.left" default="0" min="0" max="%width/2" factor="1">
<name>Left</name>
</parameter>
<parameter type="constant" name="av.right" default="0" min="0" max="%width/2" factor="1">
<name>Right</name>
</parameter>
<name>Left</name>
</parameter>
<parameter type="constant" name="av.right" default="0" min="0" max="%width/2" factor="1">
<name>Right</name>
</parameter>
<parameter type="constant" name="av.top" default="0" min="0" max="%height/2" factor="1">
<name>Top</name>
</parameter>
<parameter type="constant" name="av.bottom" default="0" min="0" max="%height/2" factor="1">
<name>Bottom</name>
</parameter>
<parameter type="list" name="av.mode" default="smear" paramlist="smear;mirror;fixed">
<name>Top</name>
</parameter>
<parameter type="constant" name="av.bottom" default="0" min="0" max="%height/2" factor="1">
<name>Bottom</name>
</parameter>
<parameter type="list" name="av.mode" default="smear" paramlist="smear;mirror;fixed">
<paramlistdisplay>Smear,Mirror,Fixed</paramlistdisplay>
<name>Mode</name>
</parameter>
<parameter type="color" name="av.color" default="black">
<name>Color</name>
<name>Mode</name>
</parameter>
<parameter type="color" name="av.color" default="black">
<name>Color</name>
</parameter>
</effect>
......@@ -14,6 +14,6 @@
<name>Strength</name>
</parameter>
<parameter type="switch" name="av.use_bframe_qp" default="0" max="1" min="0">
<name>QP on B-Frames/name>
<name>QP on B-Frames</name>
</parameter>
</effect>
......@@ -9,7 +9,7 @@
<parameter type="constant" name="av.scale_height" default="12" min="0" max="40" factor="1">
<name>Scale height</name>
</parameter>
<parameter type="list" name="av.display_mode" default="parade" paramlist="overlay;stack;parade">
<parameter type="list" name="av.display_mode" default="stack" paramlist="overlay;stack;parade">
<paramlistdisplay>Overlay,Stack,Parade</paramlistdisplay>
<name>Display</name>
</parameter>
......@@ -17,12 +17,11 @@
<paramlistdisplay>Linear,Logarithmic</paramlistdisplay>
<name>Mode</name>
</parameter>
<parameter type="list" name="av.c" default="7" paramlist="0;1;2;3;4;5;6;7;8">
<paramlistdisplay>All,Y,U,YU,V,YV,UV,YUV,Alpha</paramlistdisplay>
<parameter type="list" name="av.c" default="1" paramlist="0;1;2;3;4;5;6;7;8">
<paramlistdisplay>All,Y,U,YU,V,YV,UV,All,Alpha</paramlistdisplay>
<name>Components to display</name>
</parameter>
</parameter>
<parameter type="constant" name="av.f" default="0.7" min="0" max="1" decimals="1">
<parameter type="constant" name="av.f" default="0.7" min="0" max="1" decimals="1">
<name>Foreground Opacity</name>
</parameter>
<parameter type="constant" name="av.b" default="0.5" min="0" max="1" decimals="1">
......
......@@ -16,4 +16,3 @@
<name>Temporal Chroma Strength</name>
</parameter>
</effect>
gi
......@@ -12,4 +12,5 @@
</parameter>
<parameter type="constant" name="av.scale_factor" default="2" min="2" max="4" factor="1">
<name>Scale factor for SRCNN</name>
</parameter>
</effect>
......@@ -10,4 +10,5 @@
<parameter type="list" name="av.out" default="arcd" paramlist="sbsl;sbsr;abl;abr;irl;irr;arbg;argg;arcg;arch;arcc;arcd;agmg;agmh;agmc;agmd;aybg;aybh;aybc;aybd;ml;mr;chl;chr;icl;icr;hdmi">
<paramlistdisplay>side by side parallel,side by side crosseye,above-below left top,above-below right top,interleaved rows (letf top),interleaved rows (right top),anaglyph red/blue gray,anaglyph red/green gray,anaglyph red/cyan gray,anaglyph red/cyan half colored,anaglyph red/cyan color,anaglyph red/cyan dubois,anaglyph green/magenta gray,anaglyph green/magenta half colored,anaglyph green/magenta colored,anaglyph green/magenta dubois,anaglyph yellow/blue gray,anaglyph yellow/blue half colored,anaglyph yellow/blue colored,anaglyph yellow/blue dubois,mono output left,mono output right,checkerboard left eye first,checkerboard right eye first,interleaved columns left eye first,interleaved columns right eye first,HDMI frame pack</paramlistdisplay>
<name>Output format</name>
</effect>
</parameter>
</effect>
......@@ -10,4 +10,5 @@
<parameter type="list" name="av.passthrough" default="none" paramlist="none;portrait;landscape">
<paramlistdisplay>None,Portrait,Landscape</paramlistdisplay>
<name>Override if</name>
</effect>
</parameter>
</effect>
......@@ -42,6 +42,11 @@ BoolParamWidget::BoolParamWidget(std::shared_ptr<AssetParameterModel> model, QMo
// emit the signal of the base class when appropriate
connect(this->m_checkBox, &QCheckBox::stateChanged, this, [this](int state) {
// To represent 'checked' status, Qt uses number '2', but
// the boolean parameters in MLT effects use number '1'
if (state == 2) {
state = 1;
}
emit valueChanged(m_index, QString::number(state), true); });
}
......
......@@ -3715,6 +3715,10 @@ void Bin::showTitleWidget(const std::shared_ptr<ProjectClip> &clip)
newprops.insert(QStringLiteral("kdenlive:duration"), clip->framesToTime(dia_ui.duration()));
}
}
if (clip->clipName().contains(i18n("(copy)"))) {
// We edited a duplicated title clip, update name from new content text
newprops.insert(QStringLiteral("kdenlive:clipname"), dia_ui.titleSuggest());
}
// trigger producer reload
newprops.insert(QStringLiteral("force_reload"), QStringLiteral("2"));
if (!path.isEmpty()) {
......
......@@ -1068,7 +1068,7 @@ void SubtitleModel::switchLocked()
m_subtitleFilter->set("kdenlive:locked", isLocked ? 0 : 1);
// En/disable snapping on lock
std::vector<std::weak_ptr<SnapInterface>> validSnapModels;
/*std::vector<std::weak_ptr<SnapInterface>> validSnapModels;
for (const auto &snapModel : m_regSnaps) {
if (auto ptr = snapModel.lock()) {
validSnapModels.push_back(snapModel);
......@@ -1093,7 +1093,7 @@ void SubtitleModel::switchLocked()
int id = m_selected.takeFirst();
updateSub(id, {SelectedRole});
}
}
}*/
}
......@@ -1117,3 +1117,11 @@ void SubtitleModel::loadProperties(QMap<QString, QString> subProperties)
++i;
}
}
void SubtitleModel::allSnaps(std::vector<int> &snaps)
{
for (const auto &subtitle : m_subtitleList) {
snaps.push_back(subtitle.first.frames(pCore->getCurrentFps()));
snaps.push_back(subtitle.second.second.frames(pCore->getCurrentFps()));
}
}
......@@ -137,6 +137,8 @@ public:
bool isLocked() const;
/** @brief Load some subtitle filter properties from file */
void loadProperties(QMap<QString, QString> subProperties);
/** @brief Add all subtitle items to snaps */
void allSnaps(std::vector<int> &snaps);
public slots:
/** @brief Function that parses through a subtitle file */
......
......@@ -80,6 +80,7 @@ void Core::build(bool isAppImage, const QString &MltPath)
qRegisterMetaType<audioShortVector>("audioShortVector");
qRegisterMetaType<QVector<double>>("QVector<double>");
qRegisterMetaType<QList<QAction*>>("QList<QAction*>");
qRegisterMetaType<MessageType>("MessageType");
qRegisterMetaType<stringMap>("stringMap");
qRegisterMetaType<audioByteArray>("audioByteArray");
......@@ -991,3 +992,9 @@ void Core::temporaryUnplug(QList<int> clipIds, bool hide)
{
pCore->window()->getMainTimeline()->controller()->temporaryUnplug(clipIds, hide);
}
void Core::transcodeFile(const QString url)
{
qDebug()<<"=== TRANSCODING: "<<url;
pCore->window()->slotTranscode({url});
}
......@@ -239,7 +239,8 @@ public:
void temporaryUnplug(QList<int> clipIds, bool hide);
/** @brief Returns the current doc's subtitle model. */
std::shared_ptr<SubtitleModel> getSubtitleModel(bool enforce = false);
/** @brief Transcode a video file. */
void transcodeFile(const QString url);
KSharedDataCache audioThumbCache;
private:
......
......@@ -1101,6 +1101,10 @@ void KdenliveSettingsDialog::updateSettings()
emit pCore->autoScrollChanged();
}
if (m_configTimeline.kcfg_pauseonseek->isChecked() != KdenliveSettings::pauseonseek()) {
KdenliveSettings::setPauseonseek(m_configTimeline.kcfg_pauseonseek->isChecked());
}
// Mimes
if (m_configEnv.kcfg_addedExtensions->text() != KdenliveSettings::addedExtensions()) {
// Update list
......
......@@ -113,6 +113,63 @@ void EffectStackModel::removeCurrentEffect()
}
}
void EffectStackModel::removeAllEffects(Fun &undo, Fun & redo)
{
QWriteLocker locker(&m_lock);
int current = -1;
if (auto srv = m_masterService.lock()) {
current = srv->get_int("kdenlive:activeeffect");
}
while (rootItem->childCount() > 0) {
std::shared_ptr<EffectItemModel> effect = std::static_pointer_cast<EffectItemModel>(rootItem->child(0));
int parentId = -1;
if (auto ptr = effect->parentItem().lock()) parentId = ptr->getId();
Fun local_undo = addItem_lambda(effect, parentId);
Fun local_redo = removeItem_lambda(effect->getId());
local_redo();
UPDATE_UNDO_REDO(local_redo, local_undo, undo, redo);
}
std::unordered_set<int> fadeIns = m_fadeIns;
std::unordered_set<int> fadeOuts = m_fadeOuts;
Fun undo_current = [this, current, fadeIns, fadeOuts]() {
if (auto srv = m_masterService.lock()) {
srv->set("kdenlive:activeeffect", current);
}
m_fadeIns = fadeIns;
m_fadeOuts = fadeOuts;
QVector<int> roles = {TimelineModel::EffectNamesRole};
if (!m_fadeIns.empty()) {
roles << TimelineModel::FadeInRole;
}
if (!m_fadeOuts.empty()) {
roles << TimelineModel::FadeOutRole;
}
emit dataChanged(QModelIndex(), QModelIndex(), roles);
pCore->updateItemKeyframes(m_ownerId);
return true;
};
Fun redo_current = [this]() {
if (auto srv = m_masterService.lock()) {
srv->set("kdenlive:activeeffect", -1);
}
QVector<int> roles = {TimelineModel::EffectNamesRole};
if (!m_fadeIns.empty()) {
roles << TimelineModel::FadeInRole;
}
if (!m_fadeOuts.empty()) {
roles << TimelineModel::FadeOutRole;
}
m_fadeIns.clear();
m_fadeOuts.clear();
emit dataChanged(QModelIndex(), QModelIndex(), roles);
pCore->updateItemKeyframes(m_ownerId);
return true;
};
redo_current();
PUSH_LAMBDA(redo_current, redo);
PUSH_LAMBDA(undo_current, undo);
}
void EffectStackModel::removeEffect(const std::shared_ptr<EffectItemModel> &effect)
{
qDebug() << "* * ** REMOVING EFFECT FROM STACK!!!\n!!!!!!!!!";
......
......@@ -144,6 +144,9 @@ public:
/* @brief Return true if an asset id is already added to this effect stack */
bool hasEffect(const QString &assetId) const;
/* @brief Remove all effects for this stack */
void removeAllEffects(Fun &undo, Fun & redo);
public slots:
/* @brief Delete an effect from the stack */
......
......@@ -419,21 +419,14 @@ bool LoadJob::startJob()
m_producer.reset();
}
qDebug()<<"=== MAX DURATION: "<<INT_MAX<<", DURATION: "<<(INT_MAX / 25 / 60);
QAction *ac = new QAction(i18n("Transcode"), this);
connect(ac, &QAction::triggered, [&]() {
pCore->transcodeFile(m_resource);
});
QList<QAction*>actions = {ac};
QMetaObject::invokeMethod(pCore.get(), "displayBinMessage", Qt::QueuedConnection, Q_ARG(QString, i18n("Cannot get duration for file %1", m_resource)),
Q_ARG(int, (int)KMessageWidget::Warning));
m_errorMessage.append(i18n("ERROR: Could not load clip %1: producer is invalid", m_resource));
return false;
}
if (m_producer->get_length() == INT_MAX && m_producer->get("eof") == QLatin1String("loop")) {
// This is a live source or broken clip
m_done = true;
m_successful = false;
if (m_producer) {
m_producer.reset();
}
qDebug()<<"=== MAX DURATION: "<<INT_MAX<<", DURATION: "<<(INT_MAX / 25 / 60);
QMetaObject::invokeMethod(pCore.get(), "displayBinMessage", Qt::QueuedConnection, Q_ARG(QString, i18n("Cannot get duration for file %1", m_resource)),
Q_ARG(int, (int)KMessageWidget::Warning));
Q_ARG(int, (int)KMessageWidget::Warning), Q_ARG(QList<QAction*>, actions));
m_errorMessage.append(i18n("ERROR: Could not load clip %1: producer is invalid", m_resource));
return false;
}
......
......@@ -322,6 +322,11 @@
<default>true</default>
</entry>
<entry name="pauseonseek" type="Bool">
<label>Pause playback when seeking.</label>
<default>true</default>
</entry>
<entry name="verticalzoom" type="Bool">
<label>Vertical drag in timeline ruler zooms.</label>
<default>false</default>
......@@ -911,6 +916,10 @@
<default>#000000</default>
</entry>
<entry name="showSubtitles" type="Bool">
<label>Show subtitle track.</label>
<default>false</default>
</entry>
<entry name="thumbColor1" type="Color">
<label>Color to draw even audio channels.</label>
......
......@@ -67,6 +67,7 @@
<Action name="delete_all_clip_markers" />
</Menu>
<Action name="auto_transition" />
<Action name="delete_effects" />
<Menu name="extract_audio" ><text>Extract Audio</text>
<ActionList name="audio_transcoders_list" />
</Menu>
......
......@@ -556,6 +556,7 @@ void MainWindow::init()
QMenu *timelineClipMenu = new QMenu(this);
timelineClipMenu->addAction(actionCollection()->action(QStringLiteral("edit_copy")));
timelineClipMenu->addAction(actionCollection()->action(QStringLiteral("paste_effects")));
timelineClipMenu->addAction(actionCollection()->action(QStringLiteral("delete_effects")));
timelineClipMenu->addAction(actionCollection()->action(QStringLiteral("group_clip")));
timelineClipMenu->addAction(actionCollection()->action(QStringLiteral("ungroup_clip")));
timelineClipMenu->addAction(actionCollection()->action(QStringLiteral("edit_item_duration")));
......@@ -1631,6 +1632,16 @@ void MainWindow::setupActions()
pasteEffects->setEnabled(false);
// "C" as data means this action should only be available for clips - not for compositions
pasteEffects->setData('C');
QAction *delEffects = new QAction(QIcon::fromTheme(QStringLiteral("edit-delete")), i18n("Delete Effects"), this);
addAction(QStringLiteral("delete_effects"), delEffects, QKeySequence(), clipActionCategory);
delEffects->setEnabled(false);
// "C" as data means this action should only be available for clips - not for compositions
delEffects->setData('C');
connect(delEffects, &QAction::triggered, [this]() {
getMainTimeline()->controller()->deleteEffects();
});
QAction *groupClip = addAction(QStringLiteral("group_clip"), i18n("Group Clips"), this, SLOT(slotGroupClips()),
QIcon::fromTheme(QStringLiteral("object-group")), Qt::CTRL + Qt::Key_G, clipActionCategory);
......@@ -4198,7 +4209,7 @@ void MainWindow::resetSubtitles()
{
// Hide subtitle track
m_buttonSubtitleEditTool->setChecked(false);
getMainTimeline()->showSubtitles = false;
KdenliveSettings::setShowSubtitles(false);
pCore->subtitleWidget()->setModel(nullptr);
if (pCore->currentDoc()) {
const QString workPath = pCore->currentDoc()->subTitlePath(false);
......@@ -4231,18 +4242,18 @@ void MainWindow::slotEditSubtitle(QMap<QString, QString> subProperties)
getMainTimeline()->controller()->subtitlesLockedChanged();
getMainTimeline()->controller()->subtitlesDisabledChanged();
}
getMainTimeline()->showSubtitles = true;
KdenliveSettings::setShowSubtitles(true);
m_buttonSubtitleEditTool->setChecked(true);
getMainTimeline()->connectSubtitleModel(true);
} else {
getMainTimeline()->showSubtitles = m_buttonSubtitleEditTool->isChecked();
KdenliveSettings::setShowSubtitles(m_buttonSubtitleEditTool->isChecked());
getMainTimeline()->connectSubtitleModel(false);
}
}
void MainWindow::slotAddSubtitle()
{
if (pCore->getSubtitleModel() == nullptr || !getMainTimeline()->showSubtitles) {
if (pCore->getSubtitleModel() == nullptr || !KdenliveSettings::showSubtitles()) {
slotEditSubtitle();
m_buttonSubtitleEditTool->setChecked(true);
}
......@@ -4261,7 +4272,7 @@ void MainWindow::slotLockSubtitle()
void MainWindow::slotImportSubtitle()
{
if (pCore->getSubtitleModel() == nullptr || !getMainTimeline()->showSubtitles) {
if (pCore->getSubtitleModel() == nullptr || !KdenliveSettings::showSubtitles()) {
slotEditSubtitle();
m_buttonSubtitleEditTool->setChecked(true);
}
......
......@@ -299,6 +299,7 @@ public slots:
/** @brief Open the online services search dialog. */
void slotDownloadResources();
void slotEditSubtitle(QMap<QString, QString> subProperties = {});
void slotTranscode(const QStringList &urls = QStringList());
private slots:
/** @brief Shows the shortcut dialog. */
......@@ -426,7 +427,6 @@ private slots:
void slotUpdateClipType(QAction *action);
void slotUpdateTimelineView(QAction *action);
void slotShowTimeline(bool show);
void slotTranscode(const QStringList &urls = QStringList());
void slotTranscodeClip();
/** @brief Archive project: creates a copy of the project file with all clips in a new folder. */
void slotArchiveProject();
......
......@@ -935,12 +935,16 @@ ClipPropertiesController::ClipPropertiesController(ClipController *controller, Q
connect(box, &QCheckBox::stateChanged, this, &ClipPropertiesController::slotEnableForce);
combo = new QComboBox(this);
combo->setObjectName(QStringLiteral("force_colorspace_value"));
combo->addItem(ProfileRepository::getColorspaceDescription(240), 240);
combo->addItem(ProfileRepository::getColorspaceDescription(601), 601);
combo->addItem(ProfileRepository::getColorspaceDescription(709), 709);
combo->addItem(ProfileRepository::getColorspaceDescription(240), 240);
combo->addItem(ProfileRepository::getColorspaceDescription(10), 10);
int force_colorspace = m_properties->get_int("force_colorspace");
m_originalProperties.insert(QStringLiteral("force_colorspace"), force_colorspace == 0 ? QStringLiteral("-") : QString::number(force_colorspace));
int colorspace = controller->videoCodecProperty(QStringLiteral("colorspace")).toInt();
if (colorspace == 9) {
colorspace = 10;
}
if (force_colorspace > 0) {
box->setChecked(true);
combo->setEnabled(true);
......
......@@ -1606,14 +1606,21 @@ void GLWidget::switchPlay(bool play, double speed)
if (m_id == Kdenlive::ClipMonitor && m_consumer->position() == m_producer->get_out() && speed > 0) {
m_producer->seek(0);
}
double current_speed = m_producer->get_speed();
m_producer->set_speed(speed);
if (speed <= 1. || speed > 6.) {
m_consumer->set("scrub_audio", 0);
} else {
m_consumer->set("scrub_audio", 1);
}
m_consumer->start();
m_consumer->set("refresh", 1);
if (qFuzzyIsNull(current_speed)) {
m_consumer->start();
m_consumer->set("refresh", 1);
} else {
// Speed change, purge to reduce latency
m_consumer->purge();
m_producer->seek(m_consumer->position() + (speed > 1. ? 1 : 0));
}
} else {
emit paused();
m_producer->set_speed(0);
......
......@@ -774,14 +774,60 @@ void Monitor::slotLoadClipZone(const QPoint &zone)
void Monitor::slotSetZoneStart()
{
m_glMonitor->getControllerProxy()->setZoneIn(m_glMonitor->getCurrentPos());
checkOverlay();
QPoint oldZone = m_glMonitor->getControllerProxy()->zone();
int currentIn = m_glMonitor->getCurrentPos();
int updatedZoneOut = -1;
if (currentIn > oldZone.y()) {
updatedZoneOut = qMin(m_glMonitor->duration(), currentIn + (oldZone.y() - oldZone.x()));
}
Fun undo_zone = [this, oldZone, updatedZoneOut]() {
m_glMonitor->getControllerProxy()->setZoneIn(oldZone.x());
if (updatedZoneOut > -1) {
m_glMonitor->getControllerProxy()->setZoneOut(oldZone.y());
}
checkOverlay();
return true;
};
Fun redo_zone = [this, currentIn, updatedZoneOut]() {
if (updatedZoneOut > -1) {
m_glMonitor->getControllerProxy()->setZoneOut(updatedZoneOut);
}
m_glMonitor->getControllerProxy()->setZoneIn(currentIn);
checkOverlay();
return true;
};
redo_zone();
pCore->pushUndo(undo_zone, redo_zone, i18n("Set Zone"));
}
void Monitor::slotSetZoneEnd()
{
m_glMonitor->getControllerProxy()->setZoneOut(m_glMonitor->getCurrentPos() + 1);
checkOverlay();
QPoint oldZone = m_glMonitor->getControllerProxy()->zone();
int currentOut = m_glMonitor->getCurrentPos() + 1;
int updatedZoneIn = -1;
if (currentOut < oldZone.x()) {
updatedZoneIn = qMax(0, currentOut - (oldZone.y() - oldZone.x()));
}
Fun undo_zone = [this, oldZone, updatedZoneIn]() {
m_glMonitor->getControllerProxy()->setZoneOut(oldZone.y());
if (updatedZoneIn > -1) {
m_glMonitor->getControllerProxy()->setZoneIn(oldZone.x());
}
checkOverlay();
return true;
};
Fun redo_zone = [this, currentOut, updatedZoneIn]() {
if (updatedZoneIn > -1) {
m_glMonitor->getControllerProxy()->setZoneIn(updatedZoneIn);
}
m_glMonitor->getControllerProxy()->setZoneOut(currentOut);
checkOverlay();
return true;
};
redo_zone();
pCore->pushUndo(undo_zone, redo_zone, i18n("Set Zone"));
}
// virtual
......@@ -1525,8 +1571,8 @@ void Monitor::slotOpenClip(const std::shared_ptr<ProjectClip> &controller, int i
if (activeStreams.size() > 1) {
m_glMonitor->getControllerProxy()->setAudioStream(i18np("%1 audio stream", "%1 audio streams", activeStreams.size()));
// TODO: Mix audio channels
} else {
m_glMonitor->getControllerProxy()->setAudioStream(m_controller->activeStreams().first());
} else if (!activeStreams.isEmpty()) {
m_glMonitor->getControllerProxy()->setAudioStream(activeStreams.first());
}
QAction *ac;
while (i.hasNext()) {
......@@ -2301,7 +2347,9 @@ void Monitor::processSeek(int pos)
if (!slotActivateMonitor()) {
return;
}
pause();
if (KdenliveSettings::pauseonseek()) {
pause();
}
m_glMonitor->requestSeek(pos);