///////////////////////////////////////////////////////////////////////////////
// Simple x264 Launcher
-// Copyright (C) 2004-2014 LoRd_MuldeR <MuldeR2@GMX.de>
+// Copyright (C) 2004-2016 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// http://www.gnu.org/licenses/gpl-2.0.txt
///////////////////////////////////////////////////////////////////////////////
+//Internal
#include "global.h"
#include "model_jobList.h"
#include "thread_encode.h"
+#include "encoder_factory.h"
#include "model_options.h"
#include "model_preferences.h"
#include "resource.h"
+//MUtils
+#include <MUtils/Sound.h>
+
+//Qt
#include <QIcon>
#include <QFileInfo>
+#include <QSettings>
+
+static const char *KEY_ENTRY_COUNT = "entry_count";
+static const char *KEY_SOURCE_FILE = "source_file";
+static const char *KEY_OUTPUT_FILE = "output_file";
+static const char *KEY_ENC_OPTIONS = "enc_options";
+
+static const char *JOB_TEMPLATE = "job_%08x";
+
+#define VALID_INDEX(INDEX) ((INDEX).isValid() && ((INDEX).row() >= 0) && ((INDEX).row() < m_jobs.count()))
JobListModel::JobListModel(PreferencesModel *preferences)
{
QUuid id = m_jobs.takeFirst();
EncodeThread *thread = m_threads.value(id, NULL);
LogFileModel *logFile = m_logFile.value(id, NULL);
- X264_DELETE(thread);
- X264_DELETE(logFile);
+ MUTILS_DELETE(thread);
+ MUTILS_DELETE(logFile);
}
}
QModelIndex JobListModel::insertJob(EncodeThread *thread)
{
- QUuid id = thread->getId();
-
+ const QUuid id = thread->getId();
if(m_jobs.contains(id))
{
return QModelIndex();
}
- QString config = "N/A";
-
- switch(thread->options()->rcMode())
+ const AbstractEncoderInfo &encoderInfo = EncoderFactory::getEncoderInfo(thread->options()->encType());
+ QString config = encoderInfo.getName();
+ switch(encoderInfo.rcModeToType(thread->options()->rcMode()))
{
- case OptionsModel::RCMode_CRF:
- config = QString("CRF@%1").arg(QString::number(thread->options()->quantizer()));
- break;
- case OptionsModel::RCMode_CQ:
- config = QString("CQ@%1").arg(QString::number(qRound(thread->options()->quantizer())));
+ case AbstractEncoderInfo::RC_TYPE_QUANTIZER:
+ config.append(QString(", %1@%2").arg(encoderInfo.rcModeToString(thread->options()->rcMode()), QString::number(qRound(thread->options()->quantizer()))));
break;
- case OptionsModel::RCMode_2Pass:
- config = QString("2Pass@%1").arg(QString::number(thread->options()->bitrate()));
- break;
- case OptionsModel::RCMode_ABR:
- config = QString("ABR@%1").arg(QString::number(thread->options()->bitrate()));
+ case AbstractEncoderInfo::RC_TYPE_RATE_KBPS:
+ case AbstractEncoderInfo::RC_TYPE_MULTIPASS:
+ config.append(QString(", %1@%2").arg(encoderInfo.rcModeToString(thread->options()->rcMode()), QString::number(thread->options()->bitrate())));
break;
}
int n = 2;
QString jobName = QString("%1 (%2)").arg(QFileInfo(thread->sourceFileName()).completeBaseName().simplified(), config);
-
forever
{
bool unique = true;
bool JobListModel::startJob(const QModelIndex &index)
{
- if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
+ if(VALID_INDEX(index))
{
QUuid id = m_jobs.at(index.row());
if(m_status.value(id) == JobStatus_Enqueued)
bool JobListModel::pauseJob(const QModelIndex &index)
{
- if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
+ if(VALID_INDEX(index))
{
QUuid id = m_jobs.at(index.row());
JobStatus status = m_status.value(id);
bool JobListModel::resumeJob(const QModelIndex &index)
{
- if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
+ if(VALID_INDEX(index))
{
QUuid id = m_jobs.at(index.row());
JobStatus status = m_status.value(id);
bool JobListModel::abortJob(const QModelIndex &index)
{
- if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
+ if(VALID_INDEX(index))
{
QUuid id = m_jobs.at(index.row());
if(m_status.value(id) == JobStatus_Indexing || m_status.value(id) == JobStatus_Running ||
bool JobListModel::deleteJob(const QModelIndex &index)
{
- if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
+ if(VALID_INDEX(index))
{
QUuid id = m_jobs.at(index.row());
if(m_status.value(id) == JobStatus_Completed || m_status.value(id) == JobStatus_Failed ||
m_logFile.remove(id);
m_details.remove(id);
endRemoveRows();
- X264_DELETE(thread);
- X264_DELETE(logFile);
+ MUTILS_DELETE(thread);
+ MUTILS_DELETE(logFile);
return true;
}
}
return false;
}
+bool JobListModel::moveJob(const QModelIndex &index, const int &direction)
+{
+ if(VALID_INDEX(index))
+ {
+ if((direction == MOVE_UP) && (index.row() > 0))
+ {
+ beginMoveRows(QModelIndex(), index.row(), index.row(), QModelIndex(), index.row() - 1);
+ m_jobs.swap(index.row(), index.row() - 1);
+ endMoveRows();
+ return true;
+ }
+ if((direction == MOVE_DOWN) && (index.row() < m_jobs.size() - 1))
+ {
+ beginMoveRows(QModelIndex(), index.row(), index.row(), QModelIndex(), index.row() + 2);
+ m_jobs.swap(index.row(), index.row() + 1);
+ endMoveRows();
+ return true;
+ }
+ }
+
+ return false;
+}
+
LogFileModel *JobListModel::getLogFile(const QModelIndex &index)
{
if(index.isValid() && index.row() >= 0 && index.row() < m_jobs.count())
m_status.insert(jobId, newStatus);
emit dataChanged(createIndex(index, 0), createIndex(index, 1));
- if(m_preferences->enableSounds())
+ if(m_preferences->getEnableSounds())
{
switch(newStatus)
{
case JobStatus_Completed:
- x264_play_sound(IDR_WAVE4, true);
+ MUtils::Sound::play_sound("tada", true);
break;
case JobStatus_Aborted:
- x264_play_sound(IDR_WAVE5, true);
+ MUtils::Sound::play_sound("shattering", true);
break;
case JobStatus_Failed:
- x264_play_sound(IDR_WAVE6, true);
+ MUtils::Sound::play_sound("failure", true);
break;
}
}
emit dataChanged(createIndex(index, 3), createIndex(index, 3));
}
}
+
+size_t JobListModel::saveQueuedJobs(void)
+{
+ const QString appDir = x264_data_path();
+ QSettings settings(QString("%1/queue.ini").arg(appDir), QSettings::IniFormat);
+
+ settings.clear();
+ settings.setValue(KEY_ENTRY_COUNT, 0);
+ size_t jobCounter = 0;
+
+ for(QList<QUuid>::ConstIterator iter = m_jobs.constBegin(); iter != m_jobs.constEnd(); iter++)
+ {
+ if(m_status.value(*iter) == JobStatus_Enqueued)
+ {
+ if(const EncodeThread *thread = m_threads.value(*iter))
+ {
+ settings.beginGroup(QString().sprintf(JOB_TEMPLATE, jobCounter++));
+ settings.setValue(KEY_SOURCE_FILE, thread->sourceFileName());
+ settings.setValue(KEY_OUTPUT_FILE, thread->outputFileName());
+
+ settings.beginGroup(KEY_ENC_OPTIONS);
+ OptionsModel::saveOptions(thread->options(), settings);
+
+ settings.endGroup();
+ settings.endGroup();
+
+ settings.setValue(KEY_ENTRY_COUNT, jobCounter);
+ }
+ }
+ }
+
+ settings.sync();
+ return jobCounter;
+}
+
+size_t JobListModel::loadQueuedJobs(const SysinfoModel *sysinfo)
+{
+ const QString appDir = x264_data_path();
+ QSettings settings(QString("%1/queue.ini").arg(appDir), QSettings::IniFormat);
+
+ bool ok = false;
+ const size_t jobCounter = settings.value(KEY_ENTRY_COUNT, 0).toUInt(&ok);
+
+ if((!ok) || (jobCounter < 1))
+ {
+ return 0;
+ }
+
+ const QStringList groups = settings.childGroups();
+ for(size_t i = 0; i < jobCounter; i++)
+ {
+ if(!groups.contains(QString().sprintf(JOB_TEMPLATE, i)))
+ {
+ return 0;
+ }
+ }
+
+ size_t jobsCreated = 0;
+ for(size_t i = 0; i < jobCounter; i++)
+ {
+ settings.beginGroup(QString().sprintf(JOB_TEMPLATE, i));
+ const QString sourceFileName = settings.value(KEY_SOURCE_FILE, QString()).toString().trimmed();
+ const QString outputFileName = settings.value(KEY_OUTPUT_FILE, QString()).toString().trimmed();
+
+ if(sourceFileName.isEmpty() || outputFileName.isEmpty())
+ {
+ settings.endGroup();
+ continue;
+ }
+
+ settings.beginGroup(KEY_ENC_OPTIONS);
+ OptionsModel options(sysinfo);
+ const bool okay = OptionsModel::loadOptions(&options, settings);
+
+ settings.endGroup();
+ settings.endGroup();
+
+ if(okay)
+ {
+ EncodeThread *thread = new EncodeThread(sourceFileName, outputFileName, &options, sysinfo, m_preferences);
+ insertJob(thread);
+ jobsCreated++;
+ }
+ }
+
+ return jobsCreated;
+}
+
+void JobListModel::clearQueuedJobs(void)
+{
+ const QString appDir = x264_data_path();
+ QSettings settings(QString("%1/queue.ini").arg(appDir), QSettings::IniFormat);
+ settings.clear();
+ settings.setValue(KEY_ENTRY_COUNT, 0);
+ settings.sync();
+}