From 3de6d7f74ee99e257687ca6b08059b04001e50ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Cerveau?= Date: Thu, 18 May 2017 22:54:05 +0200 Subject: [PATCH] Introduce Plugin and PluginsList class Allow to have an object with name and rank for the plugin Can sort the list. --- src/GraphManager.cpp | 11 +-- src/GraphManager.h | 4 + src/MainWindow.cpp | 26 ++----- src/MainWindow.h | 4 +- src/PluginsList.cpp | 171 ++++++++++++++++++++++++++++--------------- src/PluginsList.h | 47 ++++++++++-- 6 files changed, 166 insertions(+), 97 deletions(-) diff --git a/src/GraphManager.cpp b/src/GraphManager.cpp index 19d696f..c89bdba 100644 --- a/src/GraphManager.cpp +++ b/src/GraphManager.cpp @@ -1,4 +1,5 @@ #include "GraphManager.h" +#include "PluginsList.h" #include #include @@ -24,12 +25,12 @@ gchar* get_str_caps_limited(gchar* str) GraphManager::GraphManager() { m_pGraph = gst_pipeline_new ("pipeline"); + m_pluginsList = new PluginsList(); } - GraphManager::~GraphManager() { - + delete m_pluginsList; } QString GraphManager::getPadCaps(ElementInfo* elementInfo, PadInfo* padInfo, ePadCapsSubset subset, bool afTruncated) @@ -114,7 +115,6 @@ bool GraphManager::AddPlugin(const char *plugin, const char *name) } } - if(isFile) { QString path; @@ -158,8 +158,6 @@ bool GraphManager::AddPlugin(const char *plugin, const char *name) } } - - } bool res = gst_bin_add(GST_BIN(m_pGraph), pel); @@ -436,9 +434,6 @@ bool GraphManager::Stop() return res == GST_STATE_CHANGE_SUCCESS; } - - - double GraphManager::GetPosition() { gint64 current, duration; diff --git a/src/GraphManager.h b/src/GraphManager.h index 8ee88c4..82f63df 100644 --- a/src/GraphManager.h +++ b/src/GraphManager.h @@ -7,6 +7,7 @@ #include class QString; +class PluginsList; enum ePadCapsSubset { PAD_CAPS_ALLOWED = 0, @@ -97,6 +98,7 @@ public: double GetPosition(); bool SetPosition(double); + PluginsList* getPluginsList() { return m_pluginsList;} bool Play(); bool Pause(); @@ -105,6 +107,8 @@ public: QString getPadCaps(ElementInfo* elementInfo, PadInfo* padInfo, ePadCapsSubset subset, bool afTruncated = false); GstElement *m_pGraph; + PluginsList *m_pluginsList; + }; diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index d03f92e..13e9317 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -165,30 +165,26 @@ MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags): setCentralWidget(pscroll); m_pstatusBar = new QStatusBar; setStatusBar(m_pstatusBar); - m_pluginList = new PluginsList(this); - m_pluginList->setModal(false); + m_pluginListDlg = new PluginsListDialog(m_pGraph->getPluginsList(), this); + m_pluginListDlg->setModal(false); restoreGeometry(CustomSettings::mainWindowGeometry()); startTimer(100); } - MainWindow::~MainWindow() { CustomSettings::saveMainWindowGeometry(saveGeometry()); - delete m_pluginList; + delete m_pluginListDlg; } - void MainWindow::AddPlugin() { - m_pluginList->m_pGraph = m_pGraph.data(); - m_pluginList->show(); + m_pluginListDlg->setGraph(m_pGraph.data()); + m_pluginListDlg->show(); std::vector info = m_pGraph -> GetInfo(); m_pGraphDisplay -> update(info); } - - void MainWindow::OpenMediaFile() { QString dir = CustomSettings::lastIODirectory(); @@ -229,28 +225,24 @@ void MainWindow::OpenMediaUri() } - void MainWindow::Play() { qDebug() << "Play"; m_pGraph -> Play(); } - void MainWindow::Pause() { qDebug() << "Pause"; m_pGraph -> Pause(); } - void MainWindow::Stop() { qDebug() << "Stop"; m_pGraph -> Stop(); } - void MainWindow::Flush() { qDebug() << "Flush"; @@ -272,8 +264,6 @@ void MainWindow::ClearGraph() PipelineIE::Clear(m_pGraph); } - - void MainWindow::Seek(int val) { if(m_pGraph -> SetPosition((double)(val) / m_pslider -> maximum())) @@ -282,7 +272,6 @@ void MainWindow::Seek(int val) qDebug() << "Seek to" << val << "was FAILED"; } - void MainWindow::timerEvent(QTimerEvent *) { GstState state; @@ -326,8 +315,6 @@ void MainWindow::timerEvent(QTimerEvent *) m_pGraphDisplay -> update(m_pGraph -> GetInfo()); } - - void MainWindow::Save() { if(m_fileName.isEmpty()) @@ -343,7 +330,6 @@ void MainWindow::Save() } } - void MainWindow::SaveAs() { QString dir = CustomSettings::lastIODirectory(); @@ -360,7 +346,6 @@ void MainWindow::SaveAs() } } - void MainWindow::Open() { QString dir = CustomSettings::lastIODirectory(); @@ -377,7 +362,6 @@ void MainWindow::Open() } } - void MainWindow::About() { QString message; diff --git a/src/MainWindow.h b/src/MainWindow.h index 4791eb5..8c4ada2 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -15,7 +15,7 @@ #include "GraphManager.h" class GraphDisplay; -class PluginsList; +class PluginsListDialog; class MainWindow: public QMainWindow { @@ -52,7 +52,7 @@ class MainWindow: public QMainWindow QSlider *m_pslider; QString m_fileName; - PluginsList *m_pluginList; + PluginsListDialog *m_pluginListDlg; }; diff --git a/src/PluginsList.cpp b/src/PluginsList.cpp index 4f00935..5654498 100644 --- a/src/PluginsList.cpp +++ b/src/PluginsList.cpp @@ -14,71 +14,104 @@ #include -namespace +static gint plugins_sort_cb (gconstpointer a, gconstpointer b) { - GList* GetPluginsList() - { - std::size_t num = 0; - GList *plugins; - GList* plugins_list = NULL; - GstRegistry *registry; + Plugin* p1 = (Plugin*)a; + Plugin* p2 = (Plugin*)b; + qDebug() << "Sort p1: " << p1 -> getName() << " and p2: " << p2 -> getName(); + if (p1->getRank() > p2->getRank()) + return 1; + else if (p1->getRank() == p2->getRank()) { + return 0; + } else { + return -1; + } +} + +PluginsList::PluginsList() +{ + init(); +} + +PluginsList::~PluginsList() +{ + g_list_free(m_pluginsList); +} + +void PluginsList::init() +{ + std::size_t num = 0; + GList *plugins; + m_pluginsList = NULL; + GstRegistry *registry; #if GST_VERSION_MAJOR >= 1 - registry = gst_registry_get(); + registry = gst_registry_get(); #else - registry = gst_registry_get_default(); + registry = gst_registry_get_default(); #endif - plugins = gst_registry_get_plugin_list(registry); - while(plugins) - { - GstPlugin *plugin; - plugin = (GstPlugin *) (plugins->data); - plugins = g_list_next (plugins); + plugins = gst_registry_get_plugin_list(registry); + while(plugins) + { + GstPlugin *plugin; + plugin = (GstPlugin *) (plugins->data); + plugins = g_list_next (plugins); #if GST_VERSION_MAJOR >= 1 - registry = gst_registry_get(); + registry = gst_registry_get(); #else - registry = gst_registry_get_default(); + registry = gst_registry_get_default(); #endif - GList *features = gst_registry_get_feature_list_by_plugin (registry, - gst_plugin_get_name (plugin)); + GList *features = gst_registry_get_feature_list_by_plugin (registry, + gst_plugin_get_name (plugin)); - while(features) - { - GstPluginFeature *feature; - feature = GST_PLUGIN_FEATURE (features->data); - if(GST_IS_ELEMENT_FACTORY (feature)) - { - GstElementFactory *factory; - factory = GST_ELEMENT_FACTORY (feature); - plugins_list = g_list_append(plugins_list, GST_OBJECT_NAME (factory)); - num++; - } + while(features) + { + GstPluginFeature *feature; + feature = GST_PLUGIN_FEATURE (features->data); + if(GST_IS_ELEMENT_FACTORY (feature)) + { + GstElementFactory *factory; + factory = GST_ELEMENT_FACTORY (feature); + int rank = gst_plugin_feature_get_rank(GST_PLUGIN_FEATURE(factory)); + Plugin* p = new Plugin(GST_OBJECT_NAME (factory), rank); + m_pluginsList = g_list_append(m_pluginsList, p); + num++; + } - features = g_list_next (features); - } - } - return plugins_list; - } + features = g_list_next (features); + } + } +} - void InitPluginsList(QListWidget *plwgt) - { - GList* plugins_list = GetPluginsList(); - GList* l; - GstElementFactory* factory; - std::size_t num = 0; +GList* PluginsList::getSortedByRank() +{ + GList* sorted_list = g_list_sort(m_pluginsList, plugins_sort_cb); + return sorted_list; +} - for (l = plugins_list; l != NULL; l = l->next) - { - plwgt -> addItem((gchar*)l->data); - num++; +GList* PluginsList::getPluginListByCaps(GstPadDirection direction, GstCaps* caps) +{ + GList * caps_plugins_list = NULL; + GList *l,*p; - // do something with l->data - } - } -}; + for (l = m_pluginsList; l != NULL; l = l->next) { + Plugin* plugin = (Plugin*)(l->data); + GstElementFactory* factory = gst_element_factory_find(plugin->getName().toStdString().c_str()); + if (factory) { + const GList* pads = gst_element_factory_get_static_pad_templates(factory); + for (p = (GList*)pads; p != NULL; p = p->next) { + GstStaticPadTemplate* padTemplate = (GstStaticPadTemplate*)(p->data); + if (padTemplate->direction == direction && gst_caps_can_intersect(caps, padTemplate->static_caps.caps)) + caps_plugins_list = g_list_append(caps_plugins_list, plugin); + } + } + } + return caps_plugins_list; +} -PluginsList::PluginsList(QWidget *pwgt, Qt::WindowFlags f): +PluginsListDialog::PluginsListDialog(PluginsList* pluginList, QWidget *pwgt, Qt::WindowFlags f): QDialog(pwgt, f) -,m_pGraph(NULL) +, m_pPluginsList(pluginList) +, m_pGraph(NULL) { m_pPlugins = new QListWidget; m_pPlugins->setSortingEnabled(true); @@ -95,7 +128,7 @@ QDialog(pwgt, f) phblay -> addWidget(m_pPlugins, 1); phblay -> addWidget(pscroll, 2); - InitPluginsList(m_pPlugins); + InitPluginsList(); QHBoxLayout *phblayFind = new QHBoxLayout; @@ -124,8 +157,13 @@ QDialog(pwgt, f) installEventFilter(this); } +PluginsListDialog::~PluginsListDialog() +{ + if (m_pPluginsList) + delete m_pPluginsList; +} -void PluginsList::showInfo(QListWidgetItem *pitem, QListWidgetItem *previous) +void PluginsListDialog::showInfo(QListWidgetItem *pitem, QListWidgetItem *previous) { qDebug() << "Show Info: " << pitem -> text(); m_plblInfo -> clear(); @@ -201,8 +239,7 @@ void PluginsList::showInfo(QListWidgetItem *pitem, QListWidgetItem *previous) m_plblInfo -> setText(descr); } - -void PluginsList::insert(QListWidgetItem *pitem) +void PluginsListDialog::insert(QListWidgetItem *pitem) { if(!pitem) { qDebug() << "Do not insert null item"; @@ -218,9 +255,7 @@ void PluginsList::insert(QListWidgetItem *pitem) } } - - -bool PluginsList::eventFilter(QObject *obj, QEvent *event) +bool PluginsListDialog::eventFilter(QObject *obj, QEvent *event) { if (event -> type() == QEvent::KeyPress) { @@ -236,8 +271,7 @@ bool PluginsList::eventFilter(QObject *obj, QEvent *event) return QDialog::eventFilter(obj, event); } - -void PluginsList::filterPlagins(const QString &text) +void PluginsListDialog::filterPlagins(const QString &text) { for(std::size_t i=0; i count(); i++) { @@ -248,5 +282,20 @@ void PluginsList::filterPlagins(const QString &text) else pitem -> setHidden(true); } - +} + +void PluginsListDialog::InitPluginsList() +{ + if (!m_pPluginsList) + m_pPluginsList = new PluginsList (); + + GList* plugins_list = m_pPluginsList->getList(); + GList* l; + std::size_t num = 0; + + for (l = plugins_list; l != NULL; l = l->next) { + Plugin* plugin = (Plugin*)(l->data); + m_pPlugins->addItem(plugin->getName()); + num++; + } } diff --git a/src/PluginsList.h b/src/PluginsList.h index ae46453..1730796 100644 --- a/src/PluginsList.h +++ b/src/PluginsList.h @@ -1,8 +1,6 @@ #ifndef PLUGINS_LIST_H_ #define PLUGINS_LIST_H_ - - #include #include #include @@ -11,17 +9,54 @@ #include "GraphManager.h" -class PluginsList: public QDialog +class Plugin +{ +public: + Plugin(const QString& name, int rank): + m_name(name), + m_rank(rank) + { + } + const QString getName() { return m_name;} + int getRank() { return m_rank;} + +private: + const QString m_name; + int m_rank; + +}; + +class PluginsList +{ +public: + PluginsList(); + ~PluginsList(); + + GList* getList() { return m_pluginsList;} + GList* getSortedByRank(); + GList* getPluginListByCaps(GstPadDirection direction, GstCaps* caps); + +private: + void init(); + +GList* m_pluginsList; +}; + + +class PluginsListDialog: public QDialog { Q_OBJECT public: - PluginsList(QWidget *pwgt = NULL, Qt::WindowFlags f = Qt::Window); + PluginsListDialog(PluginsList* pluginList, QWidget *pwgt = NULL, Qt::WindowFlags f = Qt::Window); + ~PluginsListDialog(); - GraphManager *m_pGraph; + void setGraph(GraphManager* graph) { m_pGraph = graph;} protected: bool eventFilter(QObject *obj, QEvent *ev); +private: + void InitPluginsList(); public slots: void showInfo(QListWidgetItem *current, QListWidgetItem *previous); @@ -33,6 +68,8 @@ private slots: private: QLabel *m_plblInfo; QListWidget *m_pPlugins; + PluginsList *m_pPluginsList; + GraphManager *m_pGraph; };