From a98035d63580a4c6951affe6ddbb04315cffa75c Mon Sep 17 00:00:00 2001 From: Jim Broadus Date: Sat, 30 Jan 2021 22:05:21 -0800 Subject: [PATCH] transcoder: Separate suitable element search from creation Split best element type search from Transcoder::CreateElementForMimeType into new FindBestElementForMimeType method. This will allow the setting dialog to determine the encoder element type before the pipeline is built. --- src/transcoder/transcoder.cpp | 24 ++++++++++++++++-------- src/transcoder/transcoder.h | 5 +++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/transcoder/transcoder.cpp b/src/transcoder/transcoder.cpp index af8fdb6dc..48168b85a 100644 --- a/src/transcoder/transcoder.cpp +++ b/src/transcoder/transcoder.cpp @@ -77,15 +77,13 @@ struct SuitableElement { int rank_; }; -GstElement* Transcoder::CreateElementForMimeType(const QString& element_type, - const QString& mime_type, - GstElement* bin) { - if (mime_type.isEmpty()) return nullptr; +SuitableElement Transcoder::FindBestElementForMimeType( + const QString& element_type, const QString& mime_type) { + if (element_type.isEmpty() || mime_type.isEmpty()) return SuitableElement(); // HACK: Force mp4mux because it doesn't set any useful src caps if (mime_type == "audio/mp4") { - LogLine(QString("Using '%1' (rank %2)").arg("mp4mux").arg(-1)); - return CreateElement("mp4mux", bin); + return SuitableElement("mp4mux", -1); } // Keep track of all the suitable elements we find and figure out which @@ -136,11 +134,21 @@ GstElement* Transcoder::CreateElementForMimeType(const QString& element_type, gst_plugin_feature_list_free(features); gst_caps_unref(target_caps); - if (suitable_elements_.isEmpty()) return nullptr; + if (suitable_elements_.isEmpty()) return SuitableElement(); // Sort by rank std::sort(suitable_elements_.begin(), suitable_elements_.end()); - const SuitableElement& best = suitable_elements_.last(); + return suitable_elements_.last(); +} + +GstElement* Transcoder::CreateElementForMimeType(const QString& element_type, + const QString& mime_type, + GstElement* bin) { + SuitableElement best = FindBestElementForMimeType(element_type, mime_type); + if (best.name_.isEmpty()) { + LogLine(tr("Suitable element not found")); + return nullptr; + } LogLine(QString("Using '%1' (rank %2)").arg(best.name_).arg(best.rank_)); diff --git a/src/transcoder/transcoder.h b/src/transcoder/transcoder.h index 138fefc9f..6d44ed443 100644 --- a/src/transcoder/transcoder.h +++ b/src/transcoder/transcoder.h @@ -29,6 +29,8 @@ #include "core/song.h" #include "engines/gstpipelinebase.h" +struct SuitableElement; + struct TranscoderPreset { TranscoderPreset() : type_(Song::Type_Unknown) {} TranscoderPreset(Song::FileType type, const QString& name, @@ -135,6 +137,9 @@ class Transcoder : public QObject { GstElement* bin = nullptr); void SetElementProperties(const QString& name, GObject* element); + static SuitableElement FindBestElementForMimeType(const QString& element_type, + const QString& mime_type); + static void NewPadCallback(GstElement*, GstPad* pad, gpointer data); static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage* msg, gpointer data);