450{
452
454 options << "-c:v" << "libopenh264";
455 options <<
"-b:v" << QString::number(
ui->intOpenH264bitrate->value()) +
"k";
457 options <<
"-crf" << QString::number(
ui->intCRFH264->value());
458
459 const int presetIndex =
ui->cmbPresetH264->currentIndex();
460 options <<
"-preset" <<
m_d->presetsXH264[presetIndex].id();
461
462 const int profileIndex =
ui->cmbProfileH264->currentIndex();
463 options <<
"-profile:v" <<
m_d->profilesXH264[profileIndex].id();
464
465 if (
m_d->profilesXH264[profileIndex].id() ==
"high422") {
466 options << "-pix_fmt" << "yuv422p";
467 }
else if (
m_d->profilesXH264[profileIndex].id() ==
"high444") {
468 options << "-pix_fmt" << "yuv444p";
469 } else {
470 options << "-pix_fmt" << "yuv420p";
471 }
472
473
474
475
476
478 const bool enableHDR =
479 ui->chkUseHDRMetadata->isEnabled() &&
480 ui->chkUseHDRMetadata->isChecked();
481
482 if (enableHDR) {
483 options << "-colorspace" << "bt2020nc"
484 << "-color_trc" << "smpte2084"
485 << "-color_primaries" << "bt2020";
486 }
487
488 options << "-c:v" << "libx265";
489 options <<
"-crf" << QString::number(
ui->intCRFH265->value());
490
491 const int presetIndex =
ui->cmbPresetH265->currentIndex();
492 options <<
"-preset" <<
m_d->presetsXH264[presetIndex].id();
493
494 const int profileIndex =
ui->cmbProfileH265->currentIndex();
495 options <<
"-profile:v" <<
m_d->profilesXH265[profileIndex].id();
496
497 if (
m_d->profilesXH265[profileIndex].id() ==
"main") {
498 options << "-pix_fmt" << "yuv420p";
499 }
else if (
m_d->profilesXH265[profileIndex].id() ==
"main10") {
500 options << "-pix_fmt" << "yuv420p10le";
501 } else {
503 }
504
505 if (enableHDR) {
506 const QString metadataLine =
m_d->hdrMetadataOptions.generateFFMpegOptions();
507 options << metadataLine.split(" ");
508 }
509
511 options <<
"-b" << QString::number(
ui->intBitrate->value()) +
"k";
514 if (
ui->vp9Lossless->isChecked()) {
515 options << "-lossless" << "1";
516 } else {
517 options <<
"-b:v" << QString::number(
ui->vp9Mbits->value()) +
"M";
518 }
520 const QString ditherFilterString =
m_d->paletteDitherGIF[
ui->cmbPaletteuseDitherGIF->currentIndex() ].id();
521
522 options << "-f" << "gif"
523 <<
"-loop" << (
ui->gifLoop->isChecked() ?
"0":
"-1" )
524 <<
"-gifflags" << (
ui->gifTransDiff->isChecked() ?
"+transdiff":
"-transdiff" )
525 << "-palettegen" << QString("palettegen=stats_mode=%1%2")
526 .arg(
m_d->paletteGenModeGIF[
ui->cmbPalettegenStatsModeGIF->currentIndex() ].id())
527 .arg(
":reserve_transparent=" + QString(
ui->gifReserveTransparent->isChecked() ?
"1":
"0"))
528 << "-lavfi" << QString("[0:v][1:v]paletteuse=dither=%1%2%3")
529 .arg(ditherFilterString)
530 .arg(ditherFilterString ==
"bayer" ? (QString(
":bayer_scale=%1").arg(
ui->intPaletteuseBayerScaleGIF->
value()) ):
"" )
531 .arg(
":diff_mode=" +
m_d->paletteDiffModeGIF[
ui->cmbPaletteuseDiffModeGIF->currentIndex() ].id() );
532
534 const int predIndex =
ui->cmbPredAPNG->currentIndex();
535
536 options << "-f" << "apng"
537 <<
"-pred" <<
m_d->predAPNG[predIndex].id()
538 <<
"-plays" << (
ui->apngLoop->isChecked() ?
"0":
"1" );
539
541 const int presetIndex =
ui->cmbPresetWEBP->currentIndex();
542
543 options << "-f" << "webp"
544 <<
"-lossless" << (
ui->webpLossless->isChecked() ?
"1":
"0" )
545 <<
"-compression_level" << QString::number(
ui->intCompressWEBP->value())
546 <<
"-q:v" << QString::number(
ui->intQscaleWEBP->value())
547 <<
"-preset" <<
m_d->presetsWEBP[presetIndex].id()
548 <<
"-loop" << (
ui->webpLoop->isChecked() ?
"0":
"1" );
549
550 }
551
552 return options;
553}
float value(const T *src, size_t ch)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)