diff --git a/media-video/qwinff/additional-files/qwinff.rdef.in b/media-video/qwinff/additional-files/qwinff.rdef.in new file mode 100644 index 000000000..8d709cb9d --- /dev/null +++ b/media-video/qwinff/additional-files/qwinff.rdef.in @@ -0,0 +1,14 @@ + +resource app_flags B_ARGV_ONLY; + +resource app_version { + major = @MAJOR@, + middle = @MIDDLE@, + minor = @MINOR@, + variety = B_APPV_FINAL, + internal = 0, + short_info = "QWinFF", + long_info = "A GUI for FFMPEG" +}; + +resource app_signature "application/x-vnd.qwinff"; diff --git a/media-video/qwinff/patches/qwinff-0.2.1.patchset b/media-video/qwinff/patches/qwinff-0.2.1.patchset new file mode 100644 index 000000000..2d422a7e6 --- /dev/null +++ b/media-video/qwinff/patches/qwinff-0.2.1.patchset @@ -0,0 +1,478 @@ +From 6febcd95e5edc992baccddcdc78a56560fbe58d3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= +Date: Mon, 30 Apr 2018 11:10:53 +0200 +Subject: Applied patches from rpmfusion + + +diff --git a/src/converter/conversionparameters.cpp b/src/converter/conversionparameters.cpp +index 8a44f6e..ee07e0c 100644 +--- a/src/converter/conversionparameters.cpp ++++ b/src/converter/conversionparameters.cpp +@@ -132,7 +132,7 @@ void ConversionParameters::copyConfigurationFrom(const ConversionParameters &src + } + + ConversionParameters +-ConversionParameters::fromFFmpegParameters(const QString ¶ms_str) ++ConversionParameters::fromFFmpegParameters(const QString &globals_str, const QString ¶ms_str) + { + ConversionParameters result; + QStringList args = params_str.split(" ", QString::SkipEmptyParts); +@@ -148,13 +148,14 @@ ConversionParameters::fromFFmpegParameters(const QString ¶ms_str) + } + } + ++ result.ffmpeg_globals = globals_str; + result.ffmpeg_options = args.join(" "); // unrecognized arguments + + return result; + } + + ConversionParameters +-ConversionParameters::fromFFmpegParameters(const char *params_str) ++ConversionParameters::fromFFmpegParameters(const char *globals_str, const char *params_str) + { +- return fromFFmpegParameters(QString(params_str)); ++ return fromFFmpegParameters(QString(globals_str), QString(params_str)); + } +diff --git a/src/converter/conversionparameters.h b/src/converter/conversionparameters.h +index d7ecdf4..080a692 100644 +--- a/src/converter/conversionparameters.h ++++ b/src/converter/conversionparameters.h +@@ -30,6 +30,7 @@ public: + int threads; ///< how many threads to use in conversion + + bool disable_audio; ++ bool copy_audio; + int audio_bitrate; + int audio_sample_rate; + bool audio_keep_sample_rate; ///< whether to keep original audio sample rate +@@ -37,6 +38,7 @@ public: + int audio_volume; ///< output volume in binary percent (256 is normal, 512 is double) + + bool disable_video; ++ bool copy_video; + bool video_same_quality; ///< whether to keep all video quality (-sameq option in ffmpeg) + bool video_deinterlace; + int video_bitrate; +@@ -49,6 +51,7 @@ public: + /* FFmpeg Specific Options */ + /*! Additional options passed to the ffmpeg transcoder. + These options will be overriden by other specific options. */ ++ QString ffmpeg_globals; + QString ffmpeg_options; + + /* MEncoder Specific Options */ +@@ -75,8 +78,8 @@ public: + + /*! Generate a ConversionParameters from ffmpeg command line options. + This function ignores input and output file options. */ +- static ConversionParameters fromFFmpegParameters(const QString& params_str); +- static ConversionParameters fromFFmpegParameters(const char *params_str); ++ static ConversionParameters fromFFmpegParameters(const QString& globals_str, const QString& params_str); ++ static ConversionParameters fromFFmpegParameters(const char *globals_str, const char *params_str); + + ConversionParameters() + { +diff --git a/src/converter/ffmpeginterface.cpp b/src/converter/ffmpeginterface.cpp +index 395e379..2397d85 100644 +--- a/src/converter/ffmpeginterface.cpp ++++ b/src/converter/ffmpeginterface.cpp +@@ -130,6 +130,9 @@ namespace inner { + const int CODEC_DESC = 3; + + ffmpeg_codec_info.clear(); ++ audio_encoders.push_back("copy"); ++ video_encoders.push_back("copy"); ++ subtitle_encoders.push_back("copy"); + while (ffmpeg_process.canReadLine()) { + QString line(ffmpeg_process.readLine()); + ffmpeg_codec_info.append(line); +@@ -361,6 +364,14 @@ QStringList FFmpegInterface::Private::getOptionList(const ConversionParameters & + // overwrite if file exists + list.append("-y"); + ++ /* ==== Additional Global Options ==== */ ++ if (!o.ffmpeg_globals.isEmpty()) { ++ QList additional_globals = ++ o.ffmpeg_globals.split(" ", QString::SkipEmptyParts); ++ foreach (QString opt, additional_globals) ++ list.append(opt); ++ } ++ + if (!bNeedsAudioFilter) { + /* in this configuration, input is read from file + arguments: -i +@@ -403,6 +414,9 @@ QStringList FFmpegInterface::Private::getOptionList(const ConversionParameters & + // Audio Options + if (o.disable_audio) { + list.append("-an"); // no audio ++ } else if (o.copy_audio) { // copy audio data (no re-encode) ++ list.append("-acodec"); ++ list.append("copy"); + } else { // audio enabled + + // audio bitrate in kb/s +@@ -444,6 +458,9 @@ QStringList FFmpegInterface::Private::getOptionList(const ConversionParameters & + // Video Options + if (o.disable_video || !probe.hasVideo()) { + list.append("-vn"); // no video ++ } else if (o.copy_video) { // copy video data (no re-encode) ++ list.append("-vcodec"); ++ list.append("copy"); + } else { // video enabled + + // same video quality as source +diff --git a/src/converter/presets.cpp b/src/converter/presets.cpp +index 8449b61..960197c 100644 +--- a/src/converter/presets.cpp ++++ b/src/converter/presets.cpp +@@ -128,6 +128,12 @@ bool Presets::Private::readElementData(QXmlStreamReader &xml, Preset& target) + + if (property_name == "label") { + target.label = property_value; ++ } else if (property_name == "globals") { ++ Version ffmpegVersion(FFmpegInterface::getFFmpegVersionInfo()); ++ if (versionrange_str.isEmpty() ++ || VersionRange(versionrange_str).containsVersion(ffmpegVersion)) { ++ target.globals = property_value; ++ } + } else if (property_name == "params") { + Version ffmpegVersion(FFmpegInterface::getFFmpegVersionInfo()); + if (versionrange_str.isEmpty() +@@ -154,9 +160,9 @@ void Presets::Private::removeUnavailablePresets() + if (!FFmpegInterface::getSubtitleEncoders(subtitle_encoders)) + Q_ASSERT(subtitle_encoders.isEmpty()); + +- QRegExp audio_codec_pattern("-acodec\\s+([^ ]+)"); +- QRegExp video_codec_pattern("-vcodec\\s+([^ ]+)"); +- QRegExp subtitle_codec_pattern("-scodec\\s+([^ ]+)"); ++ QRegExp audio_codec_pattern("-(c:a|codec:a|acodec)\\s+([^ ]+)"); ++ QRegExp video_codec_pattern("-(c:v|codec:v|vcodec)\\s+([^ ]+)"); ++ QRegExp subtitle_codec_pattern("-(c:s|codec:s|scodec)\\s+([^ ]+)"); + + QMultiMap::iterator it = presets.begin(); + while (it!=presets.end()) { +@@ -165,21 +171,21 @@ void Presets::Private::removeUnavailablePresets() + + // Check unavailable audio presets + if (audio_codec_pattern.indexIn(params) != -1) { +- if (!audio_encoders.contains(audio_codec_pattern.cap(1))) { ++ if (!audio_encoders.contains(audio_codec_pattern.cap(2))) { + remove = true; + } + } + + // Check unavailable video presets + if (!remove && video_codec_pattern.indexIn(params) != -1) { +- if (!video_encoders.contains(video_codec_pattern.cap(1))) { ++ if (!video_encoders.contains(video_codec_pattern.cap(2))) { + remove = true; + } + } + + // Check unavailable subtitle presets + if (!remove && subtitle_codec_pattern.indexIn(params) != -1) { +- if (!subtitle_encoders.contains(subtitle_codec_pattern.cap(1))) { ++ if (!subtitle_encoders.contains(subtitle_codec_pattern.cap(2))) { + remove = true; + } + } +diff --git a/src/converter/presets.h b/src/converter/presets.h +index 4b8c488..02b12d1 100644 +--- a/src/converter/presets.h ++++ b/src/converter/presets.h +@@ -28,6 +28,7 @@ public: + QString extension; + QString label; + QString category; ++ QString globals; + QString parameters; + + /*! Sorting requires less-than operator. +diff --git a/src/presets.xml b/src/presets.xml +index 2683de7..127d69a 100644 +--- a/src/presets.xml ++++ b/src/presets.xml +@@ -1,6 +1,36 @@ + + + ++ ++ ++ ++ -strict strict ++ -map 0 -vcodec copy -acodec copy -scodec copy ++ mkv ++ Matroska ++ ++ ++ ++ -strict strict ++ -map 0 -q:v 2 -c:v libx264 -preset slow -s 896:504 -c:a copy -scodec copy ++ mkv ++ Matroska ++ ++ ++ ++ -strict strict ++ -map 0 -q:v 2 -c:v libx264 -preset slow -s 1280:720 -c:a copy -scodec copy ++ mkv ++ Matroska ++ ++ ++ ++ -strict strict ++ -map 0 -q:v 2 -c:v libx264 -preset slow -s 1920:1080 -c:a copy -scodec copy ++ mkv ++ Matroska ++ ++ + + + +diff --git a/src/ui/addtaskwizard.cpp b/src/ui/addtaskwizard.cpp +index d683093..b50f3ba 100644 +--- a/src/ui/addtaskwizard.cpp ++++ b/src/ui/addtaskwizard.cpp +@@ -256,7 +256,7 @@ void AddTaskWizard::slotPresetSelected(int index) + if (!m_presets->findPresetById(id, preset)) { + return; // assert false + } +- *m_current_param = ConversionParameters::fromFFmpegParameters(preset.parameters); ++ *m_current_param = ConversionParameters::fromFFmpegParameters(preset.globals, preset.parameters); + } + + // This function is executed when the users presses "Finish" +diff --git a/src/ui/conversionparameterdialog.cpp b/src/ui/conversionparameterdialog.cpp +index d58561d..3537c82 100644 +--- a/src/ui/conversionparameterdialog.cpp ++++ b/src/ui/conversionparameterdialog.cpp +@@ -59,6 +59,10 @@ ConversionParameterDialog::ConversionParameterDialog(QWidget *parent) : + connect(ui->btnPreview, SIGNAL(clicked()), + this, SLOT(preview_time_selection())); + connect(ui->btnInteractiveCutting, SIGNAL(clicked()), SLOT(interactive_cutting())); ++ connect(ui->chkDisableAudio, SIGNAL(toggled(bool)), SLOT(audio_tab_update_enabled_widgets())); ++ connect(ui->chkCopyAudio, SIGNAL(toggled(bool)), SLOT(audio_tab_update_enabled_widgets())); ++ connect(ui->chkDisableVideo, SIGNAL(toggled(bool)), SLOT(video_tab_update_enabled_widgets())); ++ connect(ui->chkCopyVideo, SIGNAL(toggled(bool)), SLOT(video_tab_update_enabled_widgets())); + + // Hide speed-changing options if sox is not available. + m_enableAudioProcessing = AudioFilter::available(); +@@ -126,10 +130,12 @@ AbstractPreviewer *ConversionParameterDialog::create_previewer() + void ConversionParameterDialog::read_fields(const ConversionParameters& param) + { + // Additional Options ++ ui->txtFFmpegGlobals->setPlainText(param.ffmpeg_globals); + ui->txtFFmpegOptions->setPlainText(param.ffmpeg_options); + + // Audio Options + ui->chkDisableAudio->setChecked(param.disable_audio); ++ ui->chkCopyAudio->setChecked(param.copy_audio); + + ui->spinAudioBitrate->setValue(param.audio_bitrate); + +@@ -144,6 +150,7 @@ void ConversionParameterDialog::read_fields(const ConversionParameters& param) + + // Video Options + ui->chkDisableVideo->setChecked(param.disable_video); ++ ui->chkCopyVideo->setChecked(param.copy_video); + + ui->spinVideoBitrate->setValue(param.video_bitrate); + +@@ -207,10 +214,12 @@ void ConversionParameterDialog::read_fields(const ConversionParameters& param) + void ConversionParameterDialog::write_fields(ConversionParameters& param) + { + // Additional Options +- param = param.fromFFmpegParameters(ui->txtFFmpegOptions->toPlainText()); ++ param = param.fromFFmpegParameters(ui->txtFFmpegGlobals->toPlainText(), ++ ui->txtFFmpegOptions->toPlainText()); + + // Audio Options + param.disable_audio = ui->chkDisableAudio->isChecked(); ++ param.copy_audio = ui->chkCopyAudio->isChecked(); + param.audio_sample_rate = ui->cbAudioSampleRate->currentText().toInt(); + param.audio_bitrate = ui->spinAudioBitrate->value(); + param.audio_channels = ui->spinChannels->value(); +@@ -218,6 +227,7 @@ void ConversionParameterDialog::write_fields(ConversionParameters& param) + + // Video Options + param.disable_video = ui->chkDisableVideo->isChecked(); ++ param.copy_video = ui->chkCopyVideo->isChecked(); + param.video_bitrate = ui->spinVideoBitrate->value(); + param.video_same_quality = ui->chkVideoSameQuality->isChecked(); + param.video_deinterlace = ui->chkDeinterlace->isChecked(); +@@ -249,3 +259,23 @@ void ConversionParameterDialog::write_fields(ConversionParameters& param) + } + + } ++ ++void ConversionParameterDialog::audio_tab_update_enabled_widgets() ++{ ++ bool disable_audio = ui->chkDisableAudio->isChecked(); ++ bool copy_audio = ui->chkCopyAudio->isChecked(); ++ ++ ui->chkDisableAudio->setEnabled(true); // always enabled ++ ui->chkCopyAudio->setEnabled(!disable_audio); ++ ui->groupAudioOptions->setEnabled(!disable_audio && !copy_audio); ++} ++ ++void ConversionParameterDialog::video_tab_update_enabled_widgets() ++{ ++ bool disable_video= ui->chkDisableVideo->isChecked(); ++ bool copy_video = ui->chkCopyVideo->isChecked(); ++ ++ ui->chkDisableVideo->setEnabled(true); // always enabled ++ ui->chkCopyVideo->setEnabled(!disable_video); ++ ui->groupVideoOptions->setEnabled(!disable_video && !copy_video); ++} +diff --git a/src/ui/conversionparameterdialog.h b/src/ui/conversionparameterdialog.h +index ca44e59..4e88f1a 100644 +--- a/src/ui/conversionparameterdialog.h ++++ b/src/ui/conversionparameterdialog.h +@@ -51,6 +51,8 @@ private slots: + void preview_time_selection(); + void interactive_cutting(); + AbstractPreviewer *create_previewer(); ++ void audio_tab_update_enabled_widgets(); ++ void video_tab_update_enabled_widgets(); + + private: + Ui::ConversionParameterDialog *ui; +diff --git a/src/ui/conversionparameterdialog.ui b/src/ui/conversionparameterdialog.ui +index da88f88..1f73f4f 100644 +--- a/src/ui/conversionparameterdialog.ui ++++ b/src/ui/conversionparameterdialog.ui +@@ -33,11 +33,22 @@ + + + +- +- +- Disable Audio +- +- ++ ++ ++ ++ ++ Disable Audio ++ ++ ++ ++ ++ ++ ++ Copy Audio (Do not re-encode) ++ ++ ++ ++ + + + +@@ -173,11 +184,22 @@ + + + +- +- +- Disable Video +- +- ++ ++ ++ ++ ++ Disable Video ++ ++ ++ ++ ++ ++ ++ Copy Video (Do not re-encode) ++ ++ ++ ++ + + + +@@ -497,6 +519,20 @@ + FFmpeg + + ++ ++ ++ ++ ++ ++ Additional FFmpeg Global Options ++ ++ ++ ++ ++ ++ ++ ++ + + + +@@ -533,7 +569,6 @@ + + + +- chkDisableAudio + cbAudioSampleRate + spinAudioBitrate + spinChannels +@@ -547,7 +582,6 @@ + spinCropBottom + txtFFmpegOptions + buttonBox +- chkDisableVideo + + + +@@ -585,37 +619,5 @@ + + + +- +- chkDisableAudio +- toggled(bool) +- groupAudioOptions +- setDisabled(bool) +- +- +- 113 +- 56 +- +- +- 229 +- 266 +- +- +- +- +- chkDisableVideo +- toggled(bool) +- groupVideoOptions +- setDisabled(bool) +- +- +- 236 +- 56 +- +- +- 227 +- 270 +- +- +- + + +-- +2.16.2 + diff --git a/media-video/qwinff/qwinff-0.2.1.recipe b/media-video/qwinff/qwinff-0.2.1.recipe new file mode 100644 index 000000000..df58fbd35 --- /dev/null +++ b/media-video/qwinff/qwinff-0.2.1.recipe @@ -0,0 +1,73 @@ +SUMMARY="A GUI for FFMPEG" +DESCRIPTION="FFmpeg can read audio and video files in various formats and \ +convert them into other formats. QwinFF features an intuitive graphical \ +interface and a rich set of presets to help you convert media files within a \ +few clicks. Advanced users can also adjust conversion parameters in detail." +HOMEPAGE="https://qwinff.github.io/" +COPYRIGHT="2011 Timothy Lin" +LICENSE="GNU GPL v3" +REVISION="1" +SOURCE_URI="https://downloads.sf.net/qwinff/qwinff_$portVersion.tar.gz" +CHECKSUM_SHA256="b9f230b22e56c5ebd50a2b51dc9369df5006b1e3bf7cfcee819b7745c0d9fc18" +ADDITIONAL_FILES="qwinff.rdef.in" +PATCHES="qwinff-$portVersion.patchset" + +ARCHITECTURES="!x86_gcc2 ?x86 ?x86_64" +SECONDARY_ARCHITECTURES="?x86" + +PROVIDES=" + QwinFF$secondaryArchSuffix = $portVersion + app:QwinFF$secondaryArchSuffix = $portVersion + " +REQUIRES=" + haiku$secondaryArchSuffix + cmd:ffmpeg + cmd:ffprobe + cmd:ffplay + cmd:sox$secondaryArchSuffix + lib:libGL$secondaryArchSuffix + lib:libQt5Core$secondaryArchSuffix + lib:libQt5DBus$secondaryArchSuffix + lib:libQt5Gui$secondaryArchSuffix + lib:libQt5Network$secondaryArchSuffix + lib:libQt5OpenGL$secondaryArchSuffix + lib:libQt5Widgets$secondaryArchSuffix + " + +BUILD_REQUIRES=" + haiku${secondaryArchSuffix}_devel + devel:libQt5Core$secondaryArchSuffix + devel:libQt5Gui$secondaryArchSuffix + devel:libQt5Widgets$secondaryArchSuffix + " +BUILD_PREREQUIRES=" + cmd:qmake$secondaryArchSuffix >= 5 + cmd:make + cmd:gcc$secondaryArchSuffix + " + +BUILD() +{ + make $jobArgs PREFIX=$appsDir/QwinFF +} + +INSTALL() +{ + make PREFIX=$appsDir/QwinFF install + + mv $appsDir/QwinFF/bin/* $appsDir/QwinFF + mv $appsDir/QwinFF/qwinff $appsDir/QwinFF/QwinFF + rm -rf $appsDir/QwinFF/bin/ + + local MAJOR="`echo "$portVersion" | cut -d. -f1`" + local MIDDLE="`echo "$portVersion" | cut -d. -f2`" + local MINOR="`echo "$portVersion" | cut -d. -f3`" + sed \ + -e "s|@MAJOR@|$MAJOR|" \ + -e "s|@MIDDLE@|$MIDDLE|" \ + -e "s|@MINOR@|$MINOR|" \ + $portDir/additional-files/qwinff.rdef.in > qwinff.rdef + + addResourcesToBinaries qwinff.rdef $appsDir/QwinFF/QwinFF + addAppDeskbarSymlink $appsDir/QwinFF/QwinFF QwinFF +}