15 changed files with 480 additions and 30 deletions
@ -0,0 +1,45 @@
|
||||
#include "encodersettings.hpp" |
||||
|
||||
#undef SETTINGS_INTERFACE |
||||
|
||||
#define SETTINGS_FIELD(f, n, d, t) f = settings::settings().value(n, d).value<t>(); |
||||
#define SETTINGS_INTERFACE(F, t) \ |
||||
t EncoderSettings::get##F() { \
|
||||
return F; \
|
||||
} \
|
||||
void EncoderSettings::set##F(t newf) { \
|
||||
F = newf; \
|
||||
} |
||||
|
||||
EncoderSettings::EncoderSettings() { |
||||
SETTINGS_FIELD(bitrate, "codec/bitrate", 400000, int); |
||||
SETTINGS_FIELD(gopSize, "codec/gopsize", 12, int); |
||||
SETTINGS_FIELD(h264Profile, "codec/h264Profile", "medium", QString); |
||||
SETTINGS_FIELD(h264Crf, "codec/h264Crf", 23, int); |
||||
SETTINGS_FIELD(vp9Lossless, "codec/vp9Lossless", false, bool); |
||||
SETTINGS_FIELD(imageQuality, "imageQuality", -1, int); |
||||
} |
||||
|
||||
SETTINGS_INTERFACE(bitrate, int) |
||||
SETTINGS_INTERFACE(gopSize, int) |
||||
SETTINGS_INTERFACE(h264Profile, QString) |
||||
SETTINGS_INTERFACE(h264Crf, int) |
||||
SETTINGS_INTERFACE(vp9Lossless, int) |
||||
SETTINGS_INTERFACE(imageQuality, int) |
||||
|
||||
EncoderSettings EncoderSettings::inst() { |
||||
static EncoderSettings e; |
||||
return e; |
||||
} |
||||
|
||||
#define SETTINGS_S_S(se) s->se = se; |
||||
|
||||
CodecSettings *EncoderSettings::getSettings() { |
||||
auto s = new CodecSettings; |
||||
SETTINGS_S_S(bitrate) |
||||
SETTINGS_S_S(gopSize) |
||||
SETTINGS_S_S(h264Profile) |
||||
SETTINGS_S_S(h264Crf) |
||||
SETTINGS_S_S(vp9Lossless) |
||||
return s; |
||||
} |
@ -0,0 +1,32 @@
|
||||
#ifndef ENCODERSETTINGS_HPP |
||||
#define ENCODERSETTINGS_HPP |
||||
|
||||
#include "encoder.hpp" |
||||
#include <settings.hpp> |
||||
#define SETTINGS_INTERFACE(F, t) \ |
||||
t get##F(); \
|
||||
void set##F(t newf); |
||||
|
||||
class EncoderSettings { |
||||
public: |
||||
EncoderSettings(); |
||||
|
||||
static EncoderSettings inst(); |
||||
CodecSettings *getSettings(); |
||||
SETTINGS_INTERFACE(bitrate, int) |
||||
SETTINGS_INTERFACE(gopSize, int) |
||||
SETTINGS_INTERFACE(h264Profile, QString) |
||||
SETTINGS_INTERFACE(h264Crf, int) |
||||
SETTINGS_INTERFACE(vp9Lossless, int) |
||||
SETTINGS_INTERFACE(imageQuality, int) |
||||
|
||||
private: |
||||
int bitrate; |
||||
int gopSize; |
||||
QString h264Profile; |
||||
int h264Crf; |
||||
int imageQuality; |
||||
bool vp9Lossless; |
||||
}; |
||||
|
||||
#endif // ENCODERSETTINGS_HPP
|
@ -0,0 +1,28 @@
|
||||
#include "encodersettingsdialog.hpp" |
||||
#include "encodersettings.hpp" |
||||
#include "ui_encodersettingsdialog.h" |
||||
#include <QCheckBox> |
||||
#include <QComboBox> |
||||
#include <QDialogButtonBox> |
||||
#include <QSpinBox> |
||||
|
||||
EncoderSettingsDialog::EncoderSettingsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::EncoderSettingsDialog) { |
||||
ui->setupUi(this); |
||||
setWindowTitle("KShare Encoder Settings"); |
||||
connect(ui->buttonBox, &QDialogButtonBox::accepted, [&] { |
||||
EncoderSettings::inst().setbitrate(ui->bitrate->value()); |
||||
EncoderSettings::inst().seth264Crf(ui->crf->value()); |
||||
EncoderSettings::inst().seth264Profile(ui->profileBox->currentText()); |
||||
EncoderSettings::inst().setvp9Lossless(ui->vp9Lossless->isChecked()); |
||||
EncoderSettings::inst().setgopSize(ui->gopSize->value()); |
||||
EncoderSettings::inst().setimageQuality(ui->defaultImageQuality->isChecked() ? -1 : ui->imageQuality->value()); |
||||
}); |
||||
} |
||||
|
||||
EncoderSettingsDialog::~EncoderSettingsDialog() { |
||||
delete ui; |
||||
} |
||||
|
||||
void EncoderSettingsDialog::on_defaultImageQuality_clicked(bool checked) { |
||||
ui->imageQuality->setEnabled(!checked); |
||||
} |
@ -0,0 +1,23 @@
|
||||
#ifndef ENCODERSETTINGSDIALOG_HPP |
||||
#define ENCODERSETTINGSDIALOG_HPP |
||||
|
||||
#include <QDialog> |
||||
|
||||
namespace Ui { |
||||
class EncoderSettingsDialog; |
||||
} |
||||
|
||||
class EncoderSettingsDialog : public QDialog { |
||||
Q_OBJECT |
||||
public: |
||||
explicit EncoderSettingsDialog(QWidget *parent = 0); |
||||
~EncoderSettingsDialog(); |
||||
|
||||
private slots: |
||||
void on_defaultImageQuality_clicked(bool checked); |
||||
|
||||
private: |
||||
Ui::EncoderSettingsDialog *ui; |
||||
}; |
||||
|
||||
#endif // ENCODERSETTINGSDIALOG_HPP
|
@ -0,0 +1,278 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<ui version="4.0"> |
||||
<class>EncoderSettingsDialog</class> |
||||
<widget class="QDialog" name="EncoderSettingsDialog"> |
||||
<property name="geometry"> |
||||
<rect> |
||||
<x>0</x> |
||||
<y>0</y> |
||||
<width>503</width> |
||||
<height>446</height> |
||||
</rect> |
||||
</property> |
||||
<property name="windowTitle"> |
||||
<string>Dialog</string> |
||||
</property> |
||||
<layout class="QVBoxLayout" name="verticalLayout"> |
||||
<item> |
||||
<widget class="QGroupBox" name="groupBox_2"> |
||||
<property name="title"> |
||||
<string>Image Encoder Settings</string> |
||||
</property> |
||||
<layout class="QGridLayout" name="gridLayout_2"> |
||||
<item row="2" column="0"> |
||||
<widget class="QSpinBox" name="imageQuality"> |
||||
<property name="enabled"> |
||||
<bool>false</bool> |
||||
</property> |
||||
<property name="maximum"> |
||||
<number>100</number> |
||||
</property> |
||||
<property name="value"> |
||||
<number>0</number> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="1" column="0" colspan="3"> |
||||
<widget class="QLabel" name="label_5"> |
||||
<property name="text"> |
||||
<string><html><head/><body><p><a href="http://doc.qt.io/qt-5/qpixmap.html#save"><span style=" text-decoration: underline; color:#007af4;">Quality</span></a></p></body></html></string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="2" column="1" colspan="2"> |
||||
<widget class="QCheckBox" name="defaultImageQuality"> |
||||
<property name="text"> |
||||
<string>Format default</string> |
||||
</property> |
||||
<property name="checked"> |
||||
<bool>true</bool> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QGroupBox" name="groupBox"> |
||||
<property name="title"> |
||||
<string>Video Encoder Settings</string> |
||||
</property> |
||||
<layout class="QGridLayout" name="gridLayout"> |
||||
<item row="4" column="0"> |
||||
<widget class="QTabWidget" name="videoTabs"> |
||||
<property name="currentIndex"> |
||||
<number>2</number> |
||||
</property> |
||||
<widget class="QWidget" name="hTab"> |
||||
<property name="layoutDirection"> |
||||
<enum>Qt::LeftToRight</enum> |
||||
</property> |
||||
<attribute name="title"> |
||||
<string>h264/h265</string> |
||||
</attribute> |
||||
<layout class="QFormLayout" name="verticalLayout"> |
||||
<item row="0" column="0"> |
||||
<widget class="QLabel" name="label"> |
||||
<property name="text"> |
||||
<string><html><head/><body><p><a href="https://trac.ffmpeg.org/wiki/Encode/H.264#crf"><span style=" text-decoration: underline; color:#007af4;">Preset</span></a></p></body></html></string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="0" column="1"> |
||||
<widget class="QComboBox" name="profileBox"> |
||||
<property name="currentText"> |
||||
<string>ultrafast</string> |
||||
</property> |
||||
<item> |
||||
<property name="text"> |
||||
<string>ultrafast</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>superfast</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>veryfast</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>faster</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>fast</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>medium</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>slow</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>slower</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>veryslow</string> |
||||
</property> |
||||
</item> |
||||
<item> |
||||
<property name="text"> |
||||
<string>placebo</string> |
||||
</property> |
||||
</item> |
||||
</widget> |
||||
</item> |
||||
<item row="1" column="0"> |
||||
<widget class="QLabel" name="label_2"> |
||||
<property name="text"> |
||||
<string><html><head/><body><p><a href="https://trac.ffmpeg.org/wiki/Encode/H.264#crf"><span style=" text-decoration: underline; color:#007af4;">CRF</span></a></p></body></html></string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="1" column="1"> |
||||
<widget class="QSpinBox" name="crf"> |
||||
<property name="maximum"> |
||||
<number>51</number> |
||||
</property> |
||||
<property name="value"> |
||||
<number>23</number> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<widget class="QWidget" name="vpTab"> |
||||
<attribute name="title"> |
||||
<string>VP9</string> |
||||
</attribute> |
||||
<layout class="QFormLayout" name="verticalLayout"> |
||||
<item row="0" column="1"> |
||||
<widget class="QCheckBox" name="vp9Lossless"> |
||||
<property name="text"> |
||||
<string>Lossless (not recommended)</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<widget class="QWidget" name="gifTab"> |
||||
<attribute name="title"> |
||||
<string>GIF</string> |
||||
</attribute> |
||||
<layout class="QFormLayout" name="verticalLayout"> |
||||
<item row="0" column="0"> |
||||
<widget class="QLabel" name="label_3"> |
||||
<property name="text"> |
||||
<string>TODO: Find whatever configuration GIF can have in ffmpeg's libav</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</widget> |
||||
</item> |
||||
<item row="0" column="0"> |
||||
<widget class="QLabel" name="label_4"> |
||||
<property name="text"> |
||||
<string>Bitrate</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="1" column="0"> |
||||
<widget class="QDoubleSpinBox" name="bitrate"> |
||||
<property name="suffix"> |
||||
<string>kbps</string> |
||||
</property> |
||||
<property name="maximum"> |
||||
<double>999999.000000000000000</double> |
||||
</property> |
||||
<property name="value"> |
||||
<double>400.000000000000000</double> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="2" column="0"> |
||||
<widget class="QLabel" name="label_6"> |
||||
<property name="toolTip"> |
||||
<string>The number of pictures in a group of pictures, or 0 for intra only </string> |
||||
</property> |
||||
<property name="text"> |
||||
<string>GOP size</string> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
<item row="3" column="0"> |
||||
<widget class="QSpinBox" name="gopSize"> |
||||
<property name="minimum"> |
||||
<number>0</number> |
||||
</property> |
||||
<property name="value"> |
||||
<number>12</number> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
</item> |
||||
<item> |
||||
<widget class="QDialogButtonBox" name="buttonBox"> |
||||
<property name="orientation"> |
||||
<enum>Qt::Horizontal</enum> |
||||
</property> |
||||
<property name="standardButtons"> |
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> |
||||
</property> |
||||
</widget> |
||||
</item> |
||||
</layout> |
||||
</widget> |
||||
<resources/> |
||||
<connections> |
||||
<connection> |
||||
<sender>buttonBox</sender> |
||||
<signal>accepted()</signal> |
||||
<receiver>EncoderSettingsDialog</receiver> |
||||
<slot>accept()</slot> |
||||
<hints> |
||||
<hint type="sourcelabel"> |
||||
<x>227</x> |
||||
<y>518</y> |
||||
</hint> |
||||
<hint type="destinationlabel"> |
||||
<x>157</x> |
||||
<y>274</y> |
||||
</hint> |
||||
</hints> |
||||
</connection> |
||||
<connection> |
||||
<sender>buttonBox</sender> |
||||
<signal>rejected()</signal> |
||||
<receiver>EncoderSettingsDialog</receiver> |
||||
<slot>reject()</slot> |
||||
<hints> |
||||
<hint type="sourcelabel"> |
||||
<x>295</x> |
||||
<y>524</y> |
||||
</hint> |
||||
<hint type="destinationlabel"> |
||||
<x>286</x> |
||||
<y>274</y> |
||||
</hint> |
||||
</hints> |
||||
</connection> |
||||
</connections> |
||||
</ui> |
Loading…
Reference in new issue