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