Usually this is exactly what you want/need. If, however, your Avisynth
script outputs image data with a higher chroma resolution, e.g. YUY2
(4:2:2), then the conversion to YV12 (4:2:0) will discard some of the
-information. In that case, if you want/need to keep the full chroma
+information. In that case, and if you want/need to keep the full chroma
resolution of your Avisynth script's output, you will have to pass the
"-csp" switch to Avs2YUV as a custom parameter! Use "-csp I422" for
-YUV 4:2:2 (YV16) and use "-csp I444" for YUV 4:4:4 (YV24). Note,
-however, that Avisynth 2.5 did NOT support YV16/YV24, so you need to
-use Avisynth 2.6 or Avs2YUV will fail! Also be aware that x264 itself
-will convert any YV16 or YV24 input back to YV12, if you don't pass the
-suitable "--csp-output i422/i444" switch as a custom parameter to x264!
+YUV 4:2:2 (YV16) and use "-csp I444" for YUV 4:4:4 (YV24). Please note
+that Avs2YUV can NOT pass through the "packed" YUY2 format. Thus it has
+to be converted to the "planar" YV16 format. As both, YUY2 and YV16,
+are YUV 4:2:2 formats, converting from YUY2 to YV16 is a lossless
+operation. Note, however, that Avisynth 2.5 did NOT support YV16/YV24,
+so you need to use Avisynth 2.6; otherwise Avs2YUV will fail to do the
+conversion! Also be aware that the x264 encoder itself will convert any
+YV16 or YV24 input back to the YV12 format, if you don't pass the
+suitable "--output-csp i422/i444" switch to x264 as a custom parameter!
+In short, to encode YUY2 from Avisynth, you have to pass "-csp I422" to
+Avs2YUV and "--output-csp i422" to x264 to avoid 4:2:0 downsampling.
9. Command-line Syntax
<x>0</x>
<y>0</y>
<width>640</width>
- <height>611</height>
+ <height>614</height>
</rect>
</property>
<property name="windowTitle">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_10">
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
<property name="toolTip">
<string>All command-line parameters you enter here will be passed to x264 unmodified and unchecked. Some parameters are forbidden, as they are reserved for the GUI.</string>
</property>
</spacer>
</item>
<item>
- <widget class="QLabel" name="iconNotification">
+ <widget class="QLabel" name="iconNotificationX264">
<property name="toolTip">
<string>Your custom parameters will be ignored entirely, if you don't fix them!</string>
</property>
</spacer>
</item>
<item>
- <widget class="QLabel" name="labelNotification">
+ <widget class="QLabel" name="labelNotificationX264">
<property name="palette">
<palette>
<active>
</layout>
</item>
<item>
- <widget class="QLineEdit" name="editCustomParams">
+ <widget class="QLineEdit" name="editCustomX264Params">
<property name="font">
<font>
<family>Lucida Console</family>
</widget>
</item>
<item>
+ <spacer name="verticalSpacer_11">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>3</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QLabel" name="label_11">
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
<property name="text">
<string>Custom Avs2YUV Parameters:</string>
</property>
</widget>
</item>
<item>
+ <spacer name="horizontalSpacer_12">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="iconNotificationAvs2YUV">
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../res/resources.qrc">:/buttons/error.png</pixmap>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_13">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>6</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="labelNotificationAvs2YUV">
+ <property name="palette">
+ <palette>
+ <active>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>170</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </active>
+ <inactive>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>170</red>
+ <green>0</green>
+ <blue>0</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </inactive>
+ <disabled>
+ <colorrole role="WindowText">
+ <brush brushstyle="SolidPattern">
+ <color alpha="255">
+ <red>120</red>
+ <green>120</green>
+ <blue>120</blue>
+ </color>
+ </brush>
+ </colorrole>
+ </disabled>
+ </palette>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Invalid parameter entered!</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<spacer name="horizontalSpacer_11">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<tabstop>cbxPreset</tabstop>
<tabstop>cbxTuning</tabstop>
<tabstop>cbxProfile</tabstop>
- <tabstop>editCustomParams</tabstop>
+ <tabstop>editCustomX264Params</tabstop>
<tabstop>checkBoxRun</tabstop>
<tabstop>buttonAccept</tabstop>
<tabstop>buttonCancel</tabstop>
m_icon->hide();
}
- virtual State validate(QString &input, int &pos) const
- {
- static const char* p[] = {"B", "o", "h", "p", "q", "fps", "frames", "preset", "tune", "profile",
- "stdin", "crf", "bitrate", "qp", "pass", "stats", "output", "help","quiet", NULL};
-
- bool invalid = false;
-
- for(size_t i = 0; p[i] && (!invalid); i++)
- {
- invalid = invalid || checkParam(input, QString::fromLatin1(p[i]));
- }
-
- return invalid ? QValidator::Intermediate : QValidator::Acceptable;
- }
+ virtual State validate(QString &input, int &pos) const = 0;
virtual void fixup(QString &input) const
{
protected:
QLabel *const m_notifier, *const m_icon;
- bool checkParam(const QString &input, const QString ¶m) const
+ bool checkParam(const QString &input, const QString ¶m, const bool doubleMinus) const
{
static const char c[20] = {' ', '*', '?', '<', '>', '/', '\\', '"', '\'', '!', '+', '#', '&', '%', '=', ',', ';', '.', 'ยด', '`'};
+ const QString prefix = doubleMinus ? QLatin1String("--") : QLatin1String("-");
bool flag = false;
if(param.length() > 1)
{
- flag = flag || input.endsWith(QString("--%1").arg(param), Qt::CaseInsensitive);
+ flag = flag || input.endsWith(QString("%1%2").arg(prefix, param), Qt::CaseInsensitive);
for(size_t i = 0; i < sizeof(c); i++)
{
- flag = flag || input.contains(QString("--%1%2").arg(param, QChar::fromLatin1(c[i])), Qt::CaseInsensitive);
+ flag = flag || input.contains(QString("%1%2%3").arg(prefix, param, QChar::fromLatin1(c[i])), Qt::CaseInsensitive);
}
}
else
{
if(m_notifier)
{
- m_notifier->setText(tr("Invalid parameter: %1").arg((param.length() > 1) ? QString("--%1").arg(param) : QString("-%1").arg(param)));
+ m_notifier->setText(tr("Invalid parameter: %1").arg((param.length() > 1) ? QString("%1%2").arg(prefix, param) : QString("-%1").arg(param)));
if(m_notifier->isHidden()) m_notifier->show();
if(m_icon) { if(m_icon->isHidden()) m_icon->show(); }
}
}
};
+class StringValidatorX264 : public StringValidator
+{
+public:
+ StringValidatorX264(QLabel *notifier, QLabel *icon) : StringValidator(notifier, icon) {}
+
+ virtual State validate(QString &input, int &pos) const
+ {
+ static const char* p[] = {"B", "o", "h", "p", "q", "fps", "frames", "preset", "tune", "profile",
+ "stdin", "crf", "bitrate", "qp", "pass", "stats", "output", "help","quiet", NULL};
+
+ bool invalid = false;
+
+ for(size_t i = 0; p[i] && (!invalid); i++)
+ {
+ invalid = invalid || checkParam(input, QString::fromLatin1(p[i]), true);
+ }
+
+ return invalid ? QValidator::Intermediate : QValidator::Acceptable;
+ }
+};
+
+class StringValidatorAvs2YUV : public StringValidator
+{
+public:
+ StringValidatorAvs2YUV(QLabel *notifier, QLabel *icon) : StringValidator(notifier, icon) {}
+
+ virtual State validate(QString &input, int &pos) const
+ {
+ static const char* p[] = {"o", "frames", "seek", "raw", "hfyu", NULL};
+
+ bool invalid = false;
+
+ for(size_t i = 0; p[i] && (!invalid); i++)
+ {
+ invalid = invalid || checkParam(input, QString::fromLatin1(p[i]), false);
+ }
+
+ return invalid ? QValidator::Intermediate : QValidator::Acceptable;
+ }
+};
+
///////////////////////////////////////////////////////////////////////////////
// Constructor & Destructor
///////////////////////////////////////////////////////////////////////////////
connect(buttonDeleteTemplate, SIGNAL(clicked()), this, SLOT(deleteTemplateButtonClicked()));
//Setup validator
- editCustomParams->installEventFilter(this);
- editCustomParams->setValidator(new StringValidator(labelNotification, iconNotification));
- editCustomParams->clear();
+ editCustomX264Params->installEventFilter(this);
+ editCustomX264Params->setValidator(new StringValidatorX264(labelNotificationX264, iconNotificationX264));
+ editCustomX264Params->clear();
+ editCustomAvs2YUVParams->installEventFilter(this);
+ editCustomAvs2YUVParams->setValidator(new StringValidatorAvs2YUV(labelNotificationAvs2YUV, iconNotificationAvs2YUV));
+ editCustomAvs2YUVParams->clear();
//Install event filter
labelHelpScreenX264->installEventFilter(this);
connect(cbxPreset, SIGNAL(currentIndexChanged(int)), this, SLOT(configurationChanged()));
connect(cbxTuning, SIGNAL(currentIndexChanged(int)), this, SLOT(configurationChanged()));
connect(cbxProfile, SIGNAL(currentIndexChanged(int)), this, SLOT(configurationChanged()));
- connect(editCustomParams, SIGNAL(textChanged(QString)), this, SLOT(configurationChanged()));
+ connect(editCustomX264Params, SIGNAL(textChanged(QString)), this, SLOT(configurationChanged()));
+ connect(editCustomAvs2YUVParams, SIGNAL(textChanged(QString)), this, SLOT(configurationChanged()));
//Setup template selector
loadTemplateList();
buttonAccept->setFocus();
}
- labelNotification->hide();
- iconNotification->hide();
+ labelNotificationX264->hide();
+ iconNotificationX264->hide();
+ labelNotificationAvs2YUV->hide();
+ iconNotificationAvs2YUV->hide();
}
bool AddJobDialog::eventFilter(QObject *o, QEvent *e)
helpScreen->exec();
X264_DELETE(helpScreen);
}
- else if((o == editCustomParams) && (e->type() == QEvent::FocusOut))
+ else if((o == editCustomX264Params) && (e->type() == QEvent::FocusOut))
{
- editCustomParams->setText(editCustomParams->text().simplified());
+ editCustomX264Params->setText(editCustomX264Params->text().simplified());
}
else if((o == editCustomAvs2YUVParams) && (e->type() == QEvent::FocusOut))
{
QMessageBox::warning(this, tr("Not a File!"), tr("<nobr>Selected output file does not appear to be a valid file!</nobr>"));
return;
}
- if(!editCustomParams->hasAcceptableInput())
+ if(!editCustomX264Params->hasAcceptableInput())
{
int ret = QMessageBox::warning(this, tr("Invalid Params"), tr("<nobr>Your custom parameters are invalid and will be discarded!</nobr>"), QMessageBox::Ignore | QMessageBox::Cancel, QMessageBox::Cancel);
if(ret != QMessageBox::Ignore) return;
cbxPreset->blockSignals(true);
cbxTuning->blockSignals(true);
cbxProfile->blockSignals(true);
- editCustomParams->blockSignals(true);
+ editCustomX264Params->blockSignals(true);
+ editCustomAvs2YUVParams->blockSignals(true);
cbxRateControlMode->setCurrentIndex(options->rcMode());
spinQuantizer->setValue(options->quantizer());
updateComboBox(cbxPreset, options->preset());
updateComboBox(cbxTuning, options->tune());
updateComboBox(cbxProfile, options->profile());
- editCustomParams->setText(options->customX264());
+ editCustomX264Params->setText(options->customX264());
editCustomAvs2YUVParams->setText(options->customAvs2YUV());
cbxRateControlMode->blockSignals(false);
cbxPreset->blockSignals(false);
cbxTuning->blockSignals(false);
cbxProfile->blockSignals(false);
- editCustomParams->blockSignals(false);
+ editCustomX264Params->blockSignals(false);
+ editCustomAvs2YUVParams->blockSignals(false);
}
void AddJobDialog::saveOptions(OptionsModel *options)
options->setPreset(cbxPreset->model()->data(cbxPreset->model()->index(cbxPreset->currentIndex(), 0)).toString());
options->setTune(cbxTuning->model()->data(cbxTuning->model()->index(cbxTuning->currentIndex(), 0)).toString());
options->setProfile(cbxProfile->model()->data(cbxProfile->model()->index(cbxProfile->currentIndex(), 0)).toString());
- options->setCustomX264(editCustomParams->hasAcceptableInput() ? editCustomParams->text().simplified() : QString());
- options->setCustomAvs2YUV(editCustomAvs2YUVParams->text().simplified());
+ options->setCustomX264(editCustomX264Params->hasAcceptableInput() ? editCustomX264Params->text().simplified() : QString());
+ options->setCustomAvs2YUV(editCustomAvs2YUVParams->hasAcceptableInput() ? editCustomAvs2YUVParams->text().simplified() : QString());
}
QString AddJobDialog::makeFileFilter(void)