Skip to content

Commit

Permalink
Add a From field to Encode panel.
Browse files Browse the repository at this point in the history
This lets you choose to encode whatever is in the Source player, the
Playlist, the playlist as a batch, or the Timeline. It tries to adjust
the default choice based on today's behavior of timeline if timeline,
else playlist if playlist, else the clip/live source in player.
  • Loading branch information
ddennedy committed Feb 10, 2016
1 parent f9fe9c1 commit 79e80b3
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 41 deletions.
118 changes: 106 additions & 12 deletions src/docks/encodedock.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 Meltytech, LLC
* Copyright (c) 2012-2016 Meltytech, LLC
* Author: Dan Dennedy <dan@dennedy.org>
*
* This program is free software: you can redistribute it and/or modify
Expand Down Expand Up @@ -303,6 +303,35 @@ void EncodeDock::onProducerOpened()
ui->encodeButton->setText(tr("Encode File"));
else
ui->encodeButton->setText(tr("Capture File"));

ui->fromCombo->blockSignals(true);
ui->fromCombo->clear();
if (MAIN.multitrack())
ui->fromCombo->addItem(tr("Timeline"), "timeline");
if (MAIN.playlist() && MAIN.playlist()->count() > 0)
ui->fromCombo->addItem(tr("Playlist"), "playlist");
if (MAIN.playlist() && MAIN.playlist()->count() > 1)
ui->fromCombo->addItem(tr("Each Playlist Item"), "batch");
if (MLT.isClip() && MLT.producer() && MLT.producer()->is_valid()) {
if (MLT.producer()->get(kShotcutCaptionProperty)) {
ui->fromCombo->addItem(MLT.producer()->get(kShotcutCaptionProperty), "clip");
} else if (MLT.producer()->get("resource")) {
QFileInfo resource(MLT.producer()->get("resource"));
ui->fromCombo->addItem(resource.completeBaseName(), "clip");
} else {
ui->fromCombo->addItem(tr("Source"), "clip");
}
} else if (MLT.savedProducer() && MLT.savedProducer()->is_valid()) {
if (MLT.savedProducer()->get(kShotcutCaptionProperty)) {
ui->fromCombo->addItem(MLT.savedProducer()->get(kShotcutCaptionProperty), "clip");
} else if (MLT.savedProducer()->get("resource")) {
QFileInfo resource(MLT.savedProducer()->get("resource"));
ui->fromCombo->addItem(resource.completeBaseName(), "clip");
} else {
ui->fromCombo->addItem(tr("Source"), "clip");
}
}
ui->fromCombo->blockSignals(false);
}

void EncodeDock::loadPresets()
Expand Down Expand Up @@ -540,7 +569,7 @@ void EncodeDock::collectProperties(QDomElement& node, int realtime)
delete p;
}

MeltJob* EncodeDock::createMeltJob(const QString& target, int realtime, int pass)
MeltJob* EncodeDock::createMeltJob(Mlt::Service* service, const QString& target, int realtime, int pass)
{
// if image sequence, change filename to include number
QString mytarget = target;
Expand All @@ -559,7 +588,7 @@ MeltJob* EncodeDock::createMeltJob(const QString& target, int realtime, int pass
QString tmpName = tmp.fileName();
tmp.close();
tmpName.append(".mlt");
MAIN.saveXML(tmpName);
MLT.saveXML(tmpName, service);

// parse xml
QFile f1(tmpName);
Expand Down Expand Up @@ -613,7 +642,29 @@ MeltJob* EncodeDock::createMeltJob(const QString& target, int realtime, int pass

void EncodeDock::runMelt(const QString& target, int realtime)
{
m_immediateJob = createMeltJob(target, realtime);
Mlt::Service* service = fromProducer();
if (!service) {
// For each playlist item.
if (MAIN.playlist() && MAIN.playlist()->count() > 0) {
// Use the first playlist item.
QScopedPointer<Mlt::ClipInfo> info(MAIN.playlist()->clip_info(0));
if (!info) return;
QString xml = MLT.XML(info->producer);
QScopedPointer<Mlt::Producer> producer(
new Mlt::Producer(MLT.profile(), "xml-string", xml.toUtf8().constData()));
producer->set_in_and_out(info->frame_in, info->frame_out);
m_immediateJob = createMeltJob(producer.data(), target, realtime);
if (m_immediateJob) {
m_immediateJob->setIsStreaming(true);
connect(m_immediateJob, SIGNAL(finished(AbstractJob*,bool)), this, SLOT(onFinished(AbstractJob*,bool)));
m_immediateJob->start();
}
return;
} else {
service = MLT.producer();
}
}
m_immediateJob = createMeltJob(service, target, realtime);
if (m_immediateJob) {
m_immediateJob->setIsStreaming(true);
connect(m_immediateJob, SIGNAL(finished(AbstractJob*,bool)), this, SLOT(onFinished(AbstractJob*,bool)));
Expand All @@ -623,14 +674,44 @@ void EncodeDock::runMelt(const QString& target, int realtime)

void EncodeDock::enqueueMelt(const QString& target, int realtime)
{
int pass = ui->dualPassCheckbox->isEnabled() && ui->dualPassCheckbox->isChecked()? 1 : 0;
MeltJob* job = createMeltJob(target, realtime, pass);
if (job) {
JOBS.add(job);
if (pass) {
job = createMeltJob(target, realtime, 2);
if (job)
JOBS.add(job);
Mlt::Service* service = fromProducer();
if (!service) {
// For each playlist item.
if (MAIN.playlist() && MAIN.playlist()->count() > 1) {
QFileInfo fi(target);
int n = MAIN.playlist()->count();
int digits = QString::number(n + 1).size();
for (int i = 0; i < n; i++) {
QScopedPointer<Mlt::ClipInfo> info(MAIN.playlist()->clip_info(i));
if (!info) continue;
QString xml = MLT.XML(info->producer);
QScopedPointer<Mlt::Producer> producer(
new Mlt::Producer(MLT.profile(), "xml-string", xml.toUtf8().constData()));
producer->set_in_and_out(info->frame_in, info->frame_out);
QString filename = QString("%1/%2-%3.%4").arg(fi.path()).arg(fi.baseName())
.arg(i + 1, digits, 10, QChar('0')).arg(fi.completeSuffix());
int pass = ui->dualPassCheckbox->isEnabled() && ui->dualPassCheckbox->isChecked()? 1 : 0;
MeltJob* job = createMeltJob(producer.data(), filename, realtime, pass);
if (job) {
JOBS.add(job);
if (pass) {
job = createMeltJob(producer.data(), filename, realtime, 2);
if (job)
JOBS.add(job);
}
}
}
}
} else {
int pass = ui->dualPassCheckbox->isEnabled() && ui->dualPassCheckbox->isChecked()? 1 : 0;
MeltJob* job = createMeltJob(service, target, realtime, pass);
if (job) {
JOBS.add(job);
if (pass) {
job = createMeltJob(service, target, realtime, 2);
if (job)
JOBS.add(job);
}
}
}
}
Expand Down Expand Up @@ -702,6 +783,19 @@ void EncodeDock::resetOptions()
loadPresetFromProperties(preset);
}

Mlt::Service *EncodeDock::fromProducer() const
{
QString from = ui->fromCombo->currentData().toString();
if (from == "clip")
return MLT.isClip()? MLT.producer() : MLT.savedProducer();
else if (from == "playlist")
return MAIN.playlist();
else if (from == "timeline")
return MAIN.multitrack();
else
return 0;
}

static double getBufferSize(Mlt::Properties& preset, const char* property)
{
double size = preset.get_double(property);
Expand Down
8 changes: 6 additions & 2 deletions src/docks/encodedock.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2015 Meltytech, LLC
* Copyright (c) 2012-2016 Meltytech, LLC
* Author: Dan Dennedy <dan@dennedy.org>
*
* This program is free software: you can redistribute it and/or modify
Expand Down Expand Up @@ -32,6 +32,9 @@ namespace Ui {
}
class AbstractJob;
class MeltJob;
namespace Mlt {
class Service;
}

class PresetsProxyModel : public QSortFilterProxyModel
{
Expand Down Expand Up @@ -105,11 +108,12 @@ private slots:
void loadPresets();
Mlt::Properties* collectProperties(int realtime);
void collectProperties(QDomElement& node, int realtime);
MeltJob* createMeltJob(const QString& target, int realtime, int pass = 0);
MeltJob* createMeltJob(Mlt::Service* service, const QString& target, int realtime, int pass = 0);
void runMelt(const QString& target, int realtime = -1);
void enqueueMelt(const QString& target, int realtime);
void encode(const QString& target);
void resetOptions();
Mlt::Service* fromProducer() const;
};

#endif // ENCODEDOCK_H
86 changes: 59 additions & 27 deletions src/docks/encodedock.ui
Original file line number Diff line number Diff line change
Expand Up @@ -134,13 +134,13 @@
<rect>
<x>0</x>
<y>0</y>
<width>356</width>
<height>454</height>
<width>329</width>
<height>462</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>0</number>
<number>3</number>
</property>
<property name="leftMargin">
<number>6</number>
Expand All @@ -155,17 +155,21 @@
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<property name="spacing">
<number>6</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>8</number>
<layout class="QGridLayout" name="gridLayout_5">
<property name="verticalSpacing">
<number>3</number>
</property>
<item>
<item row="1" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>From</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Format</string>
Expand All @@ -175,21 +179,49 @@
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="formatCombo"/>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QComboBox" name="formatCombo"/>
</item>
<item>
<spacer name="horizontalSpacer_13">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer_13">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_19">
<item>
<widget class="QComboBox" name="fromCombo">
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_23">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
Expand Down
1 change: 1 addition & 0 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,7 @@ MainWindow::MainWindow()
connect(m_player, SIGNAL(profileChanged()), m_encodeDock, SLOT(onProfileChanged()));
connect(this, SIGNAL(profileChanged()), m_encodeDock, SLOT(onProfileChanged()));
connect(this, SIGNAL(profileChanged()), SLOT(onProfileChanged()));
connect(m_playlistDock->model(), SIGNAL(modified()), m_encodeDock, SLOT(onProducerOpened()));
m_encodeDock->onProfileChanged();

m_jobsDock = new JobsDock(this);
Expand Down

0 comments on commit 79e80b3

Please sign in to comment.