Introduce Plugin and PluginsList class

Allow to have an object with name and rank for the plugin
Can sort the list.
This commit is contained in:
Stéphane Cerveau 2017-05-18 22:54:05 +02:00
parent d435c85092
commit 3de6d7f74e
6 changed files with 166 additions and 97 deletions

View file

@ -1,4 +1,5 @@
#include "GraphManager.h"
#include "PluginsList.h"
#include <QDebug>
#include <QString>
@ -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;

View file

@ -7,6 +7,7 @@
#include <vector>
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;
};

View file

@ -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<ElementInfo> 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;

View file

@ -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;
};

View file

@ -14,71 +14,104 @@
#include <QDebug>
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<m_pPlugins -> 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++;
}
}

View file

@ -1,8 +1,6 @@
#ifndef PLUGINS_LIST_H_
#define PLUGINS_LIST_H_
#include <QDialog>
#include <QLabel>
#include <QListWidgetItem>
@ -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;
};