KShare/recording/recordingformats.cpp

108 lines
3.2 KiB
C++
Raw Normal View History

#include "recordingformats.hpp"
#include <QBuffer>
#include <QDateTime>
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QStandardPaths>
#include <QTimer>
#include <formats.hpp>
2017-06-13 14:15:37 +02:00
#include <notifications.hpp>
#include <platformbackend.hpp>
#include <settings.hpp>
#include <time.h>
#include <unistd.h>
2017-06-17 17:32:47 +02:00
#include <recording/encoders/encodersettings.hpp>
RecordingFormats::RecordingFormats(formats::Recording f) {
QString tmp = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
if (tmp.isEmpty()) {
validator = [](QSize) { return false; };
return;
}
tmpDir = QDir(tmp);
QString name
= QString("KShareTemp-") + QString::number(PlatformBackend::inst().pid()) + "-" + QTime::currentTime().toString();
tmpDir.mkdir(name);
tmpDir.cd(name);
iFormat = QImage::Format_RGB888;
path = tmpDir.absoluteFilePath("res." + formats::recordingFormatName(f).toLower());
finalizer = [&] {
delete enc;
if (interrupt || !frameAdded) {
2017-06-13 14:15:37 +02:00
tmpDir.removeRecursively();
2017-06-13 17:02:35 +02:00
return QByteArray();
2017-06-13 14:15:37 +02:00
}
QFile res(path);
if (!res.open(QFile::ReadOnly)) {
qCritical().noquote() << "Could not open resulting file: " << res.errorString();
return QByteArray();
}
QByteArray data = res.readAll();
return data;
};
validator = [&](QSize s) {
if (!enc) {
2017-06-13 14:15:37 +02:00
try {
2017-06-17 17:32:47 +02:00
auto es = EncoderSettings::inst().getSettings();
enc = new Encoder(path, s, es);
delete es;
2017-06-13 14:15:37 +02:00
if (!enc->isRunning()) {
delete enc;
return false;
}
} catch (std::runtime_error &e) {
// notifications::notify("KShare Video Encoder Error", e.what(),
// QSystemTrayIcon::Critical);
2017-06-13 14:15:37 +02:00
qCritical() << "Encoder error: " << e.what();
interrupt = true;
delete enc;
return false;
}
}
2017-06-17 17:32:47 +02:00
return !interrupt;
};
2017-06-13 14:15:37 +02:00
consumer = [&](QImage img) {
if (!interrupt) try {
frameAdded = true;
2017-06-13 14:15:37 +02:00
enc->addFrame(img);
} catch (std::runtime_error &e) {
// notifications::notify("KShare Video Encoder Error", e.what(),
// QSystemTrayIcon::Critical);
2017-06-13 14:15:37 +02:00
qCritical() << "Encoder error: " << e.what();
interrupt = true;
}
};
postUploadTask = [&] {
tmpDir.removeRecursively();
QScopedPointer<RecordingFormats> th(this);
};
anotherFormat = formats::recordingFormatName(f);
}
std::function<void(QImage)> RecordingFormats::getConsumer() {
return consumer;
}
2017-06-04 23:04:35 +02:00
std::function<QByteArray()> RecordingFormats::getFinalizer() {
return finalizer;
}
std::function<void()> RecordingFormats::getPostUploadTask() {
return postUploadTask;
}
std::function<bool(QSize)> RecordingFormats::getValidator() {
return validator;
}
QImage::Format RecordingFormats::getFormat() {
return iFormat;
}
QString RecordingFormats::getAnotherFormat() {
return anotherFormat;
}