mirror of
https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio.git
synced 2025-05-03 06:54:50 +00:00
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:
parent
d435c85092
commit
3de6d7f74e
6 changed files with 166 additions and 97 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue