Merge pull request #34 from virinext/PR-19

Pr 19
This commit is contained in:
dabrain34 2017-05-21 23:01:46 +02:00 committed by GitHub
commit 606b1bb3eb
11 changed files with 435 additions and 196 deletions

View file

@ -28,7 +28,8 @@ HEADERS += src/PluginsList.h \
src/PadProperties.h \
src/PipelineIE.h \
src/CustomSettings.h \
src/SeekSlider.h
src/SeekSlider.h \
src/CustomMenuAction.h
SOURCES += src/main.cpp \
src/PluginsList.cpp \
@ -39,4 +40,5 @@ SOURCES += src/main.cpp \
src/PadProperties.cpp \
src/PipelineIE.cpp \
src/CustomSettings.cpp \
src/SeekSlider.cpp
src/SeekSlider.cpp \
src/CustomMenuAction.cpp

13
src/CustomMenuAction.cpp Normal file
View file

@ -0,0 +1,13 @@
#include "CustomMenuAction.h"
CustomMenuAction::CustomMenuAction(const QString& displayName, QObject * parent)
:QAction(displayName, parent)
, m_name(displayName)
{
}
CustomMenuAction::CustomMenuAction(const QString& displayName, const QString& name, QObject * parent)
:QAction(displayName, parent)
, m_name(name)
{
}

22
src/CustomMenuAction.h Normal file
View file

@ -0,0 +1,22 @@
#ifndef CUSTOM_MENU_ACTION_H_
#define CUSTOM_MENU_ACTION_H_
#include <QAction>
class CustomMenuAction: public QAction
{
public:
CustomMenuAction(const QString& displayName, QObject * parent);
CustomMenuAction(const QString& displayName, const QString& name, QObject * parent);
QString getName() { return m_name;}
private:
QString m_name;
};
#endif //CUSTOM_MENU_ACTION_H_

View file

@ -15,6 +15,8 @@
#include "ElementProperties.h"
#include "PadProperties.h"
#include "CustomMenuAction.h"
#include "PluginsList.h"
#define PAD_SIZE 8
#define PAD_SIZE_ACTION 16
@ -41,9 +43,12 @@ ElementInfo* GraphDisplay::getElement(std::size_t elementId)
return element;
}
PadInfo* GraphDisplay::getPad(ElementInfo* element, std::size_t padId)
PadInfo* GraphDisplay::getPad(std::size_t elementId, std::size_t padId)
{
PadInfo* pad = NULL;
ElementInfo* element = getElement(elementId);
if (!element)
return NULL;
std::size_t j=0;
for(; j<element->m_pads.size(); j++)
if(element->m_pads[j].m_id == padId) {
@ -72,7 +77,6 @@ void GraphDisplay::updateDisplayInfoIds()
}
}
void GraphDisplay::update(const std::vector <ElementInfo> &info)
{
bool needUpdate = false;
@ -121,7 +125,6 @@ void GraphDisplay::update(const std::vector <ElementInfo> &info)
}
}
void GraphDisplay::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
@ -191,7 +194,6 @@ void GraphDisplay::paintEvent(QPaintEvent *event)
}
}
GraphDisplay::ElementDisplayInfo GraphDisplay::calculateOnePosition(const ElementInfo &info)
{
ElementDisplayInfo displayInfo;
@ -344,8 +346,6 @@ void GraphDisplay::mousePressEvent(QMouseEvent *event)
m_displayInfo[i].m_isSelected = false;
}
void GraphDisplay::mouseReleaseEvent (QMouseEvent *event)
{
if(m_moveInfo.m_action == MakeConnect)
@ -410,7 +410,7 @@ void GraphDisplay::mouseReleaseEvent (QMouseEvent *event)
msg += QString(infoDst.m_name.c_str()) + ":" + dstPad;
msg += " was FAILED";
QMessageBox::warning(this, "Coonection failed", msg);
QMessageBox::warning(this, "Connection failed", msg);
}
m_info = m_pGraph -> GetInfo();
@ -466,7 +466,6 @@ exit:
repaint();
}
void GraphDisplay::mouseMoveEvent(QMouseEvent *event)
{
if(m_moveInfo.m_action == MoveComponent)
@ -480,14 +479,11 @@ void GraphDisplay::mouseMoveEvent(QMouseEvent *event)
{
QRect newRect = m_displayInfo[i].m_rect;
newRect.adjust(dx, dy, dx, dy);
if(contentsRect().contains(newRect))
m_displayInfo[i].m_rect = newRect;
break;
}
}
}
if(m_moveInfo.m_action != None)
@ -498,19 +494,16 @@ void GraphDisplay::mouseMoveEvent(QMouseEvent *event)
std::size_t elementId, padId;
getIdByPosition(event -> pos(), elementId, padId);
if (padId != ((size_t)-1)) {
ElementInfo* element = getElement(elementId);
PadInfo* pad = getPad(element, padId);
QString caps = m_pGraph->getPadCaps(element,pad,PAD_CAPS_ALL,true);
setToolTip(caps);
ElementInfo* element = getElement(elementId);
PadInfo* pad = getPad(elementId, padId);
QString caps = m_pGraph->getPadCaps(element,pad,PAD_CAPS_ALL,true);
setToolTip(caps);
}
else
setToolTip("");
setToolTip("");
}
}
void GraphDisplay::keyPressEvent(QKeyEvent* event)
{
if(event -> key() == Qt::Key_Delete)
@ -542,26 +535,32 @@ void GraphDisplay::showContextMenu(QMouseEvent *event)
if(selectedCount > 1)
{
QAction *pact = menu.addAction("Remove selected");
CustomMenuAction *pact = new CustomMenuAction("Remove selected", &menu);
menu.addAction(pact);
if(isActive)
pact -> setDisabled(true);
}
else if(padId != ((size_t)-1))
menu.addAction("Pad properties");
else if(padId != ((size_t)-1)) {
menu.addAction(new CustomMenuAction("Render", &menu));
menu.addAction(new CustomMenuAction("Render anyway", &menu));
menu.addAction(new CustomMenuAction("Pad properties", &menu));
menu.addAction(new CustomMenuAction("typefind", "ElementName", &menu));
}
else if(elementId != ((size_t)-1))
{
menu.addAction("Element properties");
QAction *pact = menu.addAction("Remove");
menu.addAction(new CustomMenuAction("Element properties", &menu));
QAction *pact = new CustomMenuAction("Remove", &menu);
menu.addAction(pact);
if(isActive)
pact -> setDisabled(true);
pact = menu.addAction("Request pad...");
pact = new CustomMenuAction("Request pad...", &menu);
menu.addAction(pact);
}
else
{
for(std::size_t i=0; i<m_info.size(); i++)
{
for(std::size_t j=0; j<m_info[i].m_connections.size(); j++)
@ -590,12 +589,13 @@ void GraphDisplay::showContextMenu(QMouseEvent *event)
double distance = std::abs((int)(dy * x0 - dx * y0 + x2 * y1 - y2 * x1));
distance = distance / sqrt(dy * dy + dx * dx);
if(distance < 5)
{
if (distance < 5) {
elementId = m_info[i].m_id;
padId = m_info[i].m_pads[j].m_id;
QAction *pact = menu.addAction("Disconnect");
QAction *pact = new CustomMenuAction("Disconnect", &menu);
menu.addAction(pact);
if(isActive)
pact -> setDisabled(true);
@ -610,26 +610,30 @@ void GraphDisplay::showContextMenu(QMouseEvent *event)
if(!menu.isEmpty())
{
QAction *pact = menu.exec(event -> globalPos());
if(pact)
{
if(pact -> text() == "Remove")
CustomMenuAction *pact = (CustomMenuAction*)menu.exec(event -> globalPos());
if (pact) {
if (pact -> getName() == "Remove")
removePlugin(elementId);
else if(pact -> text() == "Element properties")
else if (pact -> getName() == "Element properties")
showElementProperties(elementId);
else if(pact -> text() == "Pad properties")
else if (pact -> getName() == "Pad properties")
showPadProperties(elementId, padId);
else if(pact -> text() == "Disconnect")
else if (pact -> getName() == "Render")
renderPad(elementId, padId, true);
else if (pact -> getName() == "Render anyway")
renderPad(elementId, padId, false);
else if (pact -> getName() == "Disconnect")
disconnect(elementId, padId);
else if(pact -> text() == "Request pad...")
else if (pact -> getName() == "Request pad...")
requestPad(elementId);
else if(pact -> text() == "Remove selected")
else if (pact -> getName() == "Remove selected")
removeSelected();
else if (pact->getName() == "ElementName")
connectPlugin(elementId, pact->text());
}
}
}
void GraphDisplay::removeSelected()
{
GstState state;
@ -656,39 +660,32 @@ void GraphDisplay::removeSelected()
void GraphDisplay::removePlugin(std::size_t id)
{
std::size_t i=0;
for(; i<m_info.size(); i++)
ElementInfo* element = getElement(id);
if(element)
{
if(m_info[i].m_id == id)
break;
}
if(i < m_info.size())
{
if(m_pGraph -> RemovePlugin(m_info[i].m_name.c_str()))
if(m_pGraph -> RemovePlugin(element->m_name.c_str()))
{
std::vector<ElementInfo> info = m_pGraph -> GetInfo();
update(info);
}
else
QMessageBox::warning(this, "Element removing problem", "Element `" + QString(m_info[i].m_name.c_str()) + "` remowing was FAILED");
QMessageBox::warning(this, "Element removing problem", "Element `" + QString(element->m_name.c_str()) + "` remowing was FAILED");
}
}
void GraphDisplay::connectPlugin(std::size_t elementId, const QString& name)
{
ElementInfo* element = getElement(elementId);
gchar* pluginName = m_pGraph->AddPlugin(name.toStdString().c_str(), NULL);
m_pGraph->Connect(element->m_name.c_str(), pluginName);
g_free(pluginName);
}
void GraphDisplay::showElementProperties(std::size_t id)
{
std::size_t i=0;
for(; i<m_info.size(); i++)
{
if(m_info[i].m_id == id)
break;
}
if(i < m_info.size())
{
ElementProperties *pprops = new ElementProperties(m_pGraph, m_info[i].m_name.c_str());
ElementInfo* element = getElement(id);
if (element) {
ElementProperties *pprops = new ElementProperties(m_pGraph,element->m_name.c_str());
pprops -> setAttribute(Qt::WA_QuitOnClose, false);
pprops -> show();
}
@ -696,27 +693,37 @@ void GraphDisplay::showElementProperties(std::size_t id)
void GraphDisplay::showPadProperties(std::size_t elementId, std::size_t padId)
{
std::size_t i=0;
for(; i<m_info.size(); i++)
{
if(m_info[i].m_id == elementId)
break;
ElementInfo* element = getElement(elementId);
PadInfo* pad = getPad(elementId, padId);
if (pad) {
PadProperties *pprops = new PadProperties(m_pGraph, element->m_name.c_str(), pad->m_name.c_str());
pprops -> setAttribute(Qt::WA_QuitOnClose, false);
pprops -> show();
}
}
if(i < m_info.size())
{
std::size_t j=0;
for(; j<m_info[i].m_pads.size(); j++)
if(m_info[i].m_pads[j].m_id == padId)
break;
void GraphDisplay::renderPad(std::size_t elementId, std::size_t padId, bool capsAny)
{
ElementInfo* element = getElement(elementId);
PadInfo* pad = getPad(elementId, padId);
if(j < m_info[i].m_pads.size())
{
PadProperties *pprops = new PadProperties(m_pGraph, m_info[i].m_name.c_str(), m_info[i].m_pads[j].m_name.c_str());
pprops -> setAttribute(Qt::WA_QuitOnClose, false);
pprops -> show();
}
}
if(!element || !pad)
qDebug() << "element or pad is unreachable";
PluginsList* pluginList = new PluginsList();
GList* plugins_list = pluginList->getSortedByRank();
GList* l;
for (l = plugins_list; l != NULL; l = l->next) {
Plugin* plugin = (Plugin*)(l->data);
if (m_pGraph->CanConnect(element->m_name.c_str(), pad->m_name.c_str() , plugin->getName().toStdString().c_str(), capsAny)) {
gchar* pluginName = m_pGraph->AddPlugin(plugin->getName().toStdString().c_str(), NULL);
m_pGraph->Connect(element->m_name.c_str(), pluginName);
g_free(pluginName);
break;
}
}
delete pluginList;
}
void GraphDisplay::disconnect(size_t elementId, size_t padId)
@ -785,14 +792,13 @@ void GraphDisplay::disconnect(size_t elementId, size_t padId)
return;
m_pGraph -> Disconnect(src.c_str(), srcPad.c_str(), dst.c_str(), dstPad.c_str());
m_pGraph->Disconnect(src.c_str(), srcPad.c_str(), dst.c_str(), dstPad.c_str());
m_info = m_pGraph -> GetInfo();
updateDisplayInfoIds();
repaint();
}
void GraphDisplay::requestPad(std::size_t elementId)
{
QStringList labels;
@ -806,15 +812,10 @@ void GraphDisplay::requestPad(std::size_t elementId)
ptwgt -> setSelectionBehavior(QAbstractItemView::SelectRows);
ptwgt -> setEditTriggers(QAbstractItemView::NoEditTriggers);
ElementInfo* elementInfo = getElement(elementId);
GstElement *element = NULL;
for(std::size_t i=0; i<m_info.size(); i++)
{
if(m_info[i].m_id == elementId)
{
element = gst_bin_get_by_name(GST_BIN(m_pGraph -> m_pGraph), m_info[i].m_name.c_str());
break;
}
}
if(elementInfo)
element = gst_bin_get_by_name(GST_BIN(m_pGraph -> m_pGraph),elementInfo->m_name.c_str());
if(!element)
{
@ -947,8 +948,6 @@ void GraphDisplay::getIdByPosition(const QPoint &pos, std::size_t &elementId, st
}
}
QPoint GraphDisplay::getPadPosition(std::size_t elementId, std::size_t padId)
{
QPoint res;

View file

@ -72,15 +72,17 @@ private:
void showContextMenu(QMouseEvent *event);
void showElementProperties(std::size_t id);
void showPadProperties(std::size_t elementId, std::size_t padId);
void renderPad(std::size_t elementId, std::size_t padId, bool capsAny);
void removePlugin(std::size_t id);
void removeSelected();
void getIdByPosition(const QPoint &pos, std::size_t &elementId, std::size_t &padId);
QPoint getPadPosition(std::size_t elementId, std::size_t padId);
void disconnect(std::size_t elementId, std::size_t padId);
void requestPad(std::size_t elementId);
void connectPlugin(std::size_t elementId, const QString& destElementName);
ElementInfo* getElement(std::size_t elementId);
PadInfo* getPad(ElementInfo* element, std::size_t padId);
PadInfo* getPad(std::size_t elementId, std::size_t padId);
std::vector <ElementInfo> m_info;
std::vector <ElementDisplayInfo> m_displayInfo;

View file

@ -1,4 +1,5 @@
#include "GraphManager.h"
#include "PluginsList.h"
#include <QDebug>
#include <QString>
@ -21,15 +22,25 @@ gchar* get_str_caps_limited(gchar* str)
return result;
}
static void
typefind_have_type_callback (GstElement * typefind,
guint probability, GstCaps * caps, GraphManager * thiz)
{
gchar *caps_description = gst_caps_to_string (caps);
qDebug() << "Found caps " << caps_description << " with probability " << probability;
g_free(caps_description);
thiz->Pause();
}
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)
@ -92,11 +103,11 @@ QString GraphManager::getPadCaps(ElementInfo* elementInfo, PadInfo* padInfo, ePa
return padCaps;
}
bool GraphManager::AddPlugin(const char *plugin, const char *name)
gchar* GraphManager::AddPlugin(const char *plugin, const char *name)
{
GstElement *pel = gst_element_factory_make(plugin, name);
if(!pel)
return false;
return NULL;
if(GST_IS_URI_HANDLER(pel))
{
@ -114,14 +125,13 @@ bool GraphManager::AddPlugin(const char *plugin, const char *name)
}
}
if(isFile)
{
QString path;
QString dir = CustomSettings::lastIODirectory();
if(gst_uri_handler_get_uri_type(GST_URI_HANDLER(pel)) == GST_URI_SRC)
path = QFileDialog::getOpenFileName(NULL, "Open Source File...", dir);
path = QFileDialog::getOpenFileName(NULL, "Open Media Source File...", dir);
else
path = QFileDialog::getSaveFileName(NULL, "Open Sink File...", dir);
@ -156,17 +166,18 @@ bool GraphManager::AddPlugin(const char *plugin, const char *name)
gst_uri_handler_set_uri(GST_URI_HANDLER(pel), uri.toStdString().c_str());
#endif
}
}
}
bool res = gst_bin_add(GST_BIN(m_pGraph), pel);
if(res)
if (res)
gst_element_sync_state_with_parent(pel);
else {
gst_object_unref(pel);
return NULL;
}
return res;
return gst_element_get_name(pel);
}
@ -201,7 +212,6 @@ bool GraphManager::OpenUri(const char *uri, const char *name)
return res;
}
bool GraphManager::Connect(const char *srcElement, const char *srcPad,
const char *dstElement, const char *dstPad)
{
@ -218,7 +228,28 @@ bool GraphManager::Connect(const char *srcElement, const char *srcPad,
return res;
}
bool GraphManager::Connect(const char *srcElement, const char *dstElement)
{
GstElement *src = gst_bin_get_by_name (GST_BIN(m_pGraph), srcElement);
GstElement *dst = gst_bin_get_by_name (GST_BIN(m_pGraph), dstElement);
bool res = gst_element_link(src, dst);
gboolean seekRes = gst_element_seek_simple(m_pGraph, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, 0);
/* add a callback to handle have-type signal */
if (g_str_has_prefix(dstElement,"typefindelement")) {
g_signal_connect (dst, "have-type",
G_CALLBACK (typefind_have_type_callback),
this);
Play();
}
gst_object_unref(src);
gst_object_unref(dst);
return res;
}
bool GraphManager::Disconnect(const char *srcElement, const char *srcPad,
const char *dstElement, const char *dstPad)
@ -235,7 +266,6 @@ bool GraphManager::Disconnect(const char *srcElement, const char *srcPad,
return true;
}
std::vector <ElementInfo> GraphManager::GetInfo()
{
std::vector <ElementInfo> res;
@ -264,7 +294,6 @@ std::vector <ElementInfo> GraphManager::GetInfo()
elementInfo.m_id = id;
id++;
gchar *name = gst_element_get_name(element);
elementInfo.m_name = name;
g_free(name);
@ -409,7 +438,7 @@ bool GraphManager::Play()
qDebug() << "state changing to Play was FAILED";
}
return res == GST_STATE_PLAYING;
return state == GST_STATE_PLAYING;
}
@ -426,19 +455,15 @@ bool GraphManager::Pause()
qDebug() << "state changing to Pause was FAILED";
}
return res == GST_STATE_PAUSED;
return state == GST_STATE_PAUSED;
}
bool GraphManager::Stop()
{
GstStateChangeReturn res = gst_element_set_state(m_pGraph, GST_STATE_READY);
return res == GST_STATE_CHANGE_SUCCESS;
}
double GraphManager::GetPosition()
{
gint64 current, duration;
@ -501,3 +526,84 @@ bool GraphManager::SetPosition(double pos)
return seekRes;
}
bool GraphManager::CanConnect(const char *srcName, const char *srcPadName, const char *destName, bool noANY)
{
bool ret = false;
bool added = false;
GstElement *dest = NULL;
GstElement *src = NULL;
GstPad* srcPad = NULL;
GstCaps* srcCaps = NULL;
GstElementFactory *destFactory = NULL;
src = gst_bin_get_by_name (GST_BIN(m_pGraph), srcName);
if (!src) {
qDebug() << "Unable to get the src element: " << srcName;
goto done;
}
srcPad = gst_element_get_static_pad(src, srcPadName);
if (!srcPad) {
qDebug() << "Unable to get the src pad";
goto done;
}
srcCaps = gst_pad_get_current_caps(srcPad);
if (!srcCaps) {
qDebug() << "Unable to get the current caps for pad:" << srcPadName;
srcCaps =gst_pad_get_pad_template_caps(srcPad);
if (!srcCaps) {
qDebug() << "Unable to get the template caps for pad:" << srcPadName;
goto done;
}
}
dest = gst_element_factory_make(destName, NULL);
if (!dest) {
qDebug() << "Unable to get the dest element: " << destName;
goto done;
}
destFactory = gst_element_get_factory(dest);
if (!destFactory) {
qDebug() << "Unable to get the dest factory";
goto done;
}
if (noANY && gst_element_factory_can_sink_any_caps(destFactory, srcCaps)) {
qDebug() << "The dest element " << destName << " can sink any caps";
goto done;
}
if(!gst_element_factory_can_sink_all_caps(destFactory, srcCaps)) {
gchar* caps_string = gst_caps_to_string(srcCaps);
qDebug() << "The dest element " << destName << " can not sink this caps: " << caps_string;
g_free (caps_string);
goto done;
}
added = gst_bin_add(GST_BIN(m_pGraph), dest);
if (!added) {
qDebug() << "Unable to add element to the bin";
goto done;
}
ret = gst_element_link(src,dest);
if (ret) {
qDebug() << "Can link elements src " << GST_OBJECT_NAME(src) << " with dest " << GST_OBJECT_NAME(dest);
gst_element_unlink(src,dest);
}
done:
if (added) {
gst_bin_remove(GST_BIN(m_pGraph), dest);
dest = NULL;
}
if (src)
gst_object_unref(src);
if (srcPad)
gst_object_unref(srcPad);
if (dest)
gst_object_unref(dest);
return ret;
}

View file

@ -7,6 +7,7 @@
#include <vector>
class QString;
class PluginsList;
enum ePadCapsSubset {
PAD_CAPS_ALLOWED = 0,
@ -84,10 +85,11 @@ public:
GraphManager();
~GraphManager();
bool AddPlugin(const char *plugin, const char *name);
gchar* AddPlugin(const char *plugin, const char *name);
bool RemovePlugin(const char *name);
bool Connect(const char *srcElement, const char *srcPad,
const char *dstElement, const char *dstPad);
bool Connect(const char *srcElement, const char *dstElement);
bool Disconnect(const char *srcElement, const char *srcPad,
const char *dstElement, const char *dstPad);
std::vector <ElementInfo> GetInfo();
@ -97,6 +99,9 @@ public:
double GetPosition();
bool SetPosition(double);
PluginsList* getPluginsList() { return m_pluginsList;}
bool CanConnect(const char *srcName,const char *srcPadName, const char *destName, bool noANY = true);
bool Play();
bool Pause();
@ -105,6 +110,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,53 +14,104 @@
#include <QDebug>
namespace
static gint plugins_sort_cb (gconstpointer a, gconstpointer b)
{
void InitPluginsList(QListWidget *plwgt)
{
std::size_t num = 0;
GList *plugins;
GstRegistry *registry;
#if GST_VERSION_MAJOR >= 1
registry = gst_registry_get();
#else
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);
#if GST_VERSION_MAJOR >= 1
registry = gst_registry_get();
#else
registry = gst_registry_get_default();
#endif
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);
plwgt -> addItem(GST_OBJECT_NAME (factory));
num++;
}
features = g_list_next (features);
}
}
}
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(QWidget *pwgt, Qt::WindowFlags f):
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();
#else
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);
#if GST_VERSION_MAJOR >= 1
registry = gst_registry_get();
#else
registry = gst_registry_get_default();
#endif
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);
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);
}
}
}
GList* PluginsList::getSortedByRank()
{
GList* sorted_list = g_list_sort(m_pluginsList, plugins_sort_cb);
return sorted_list;
}
GList* PluginsList::getPluginListByCaps(GstPadDirection direction, GstCaps* caps)
{
GList * caps_plugins_list = NULL;
GList *l,*p;
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;
}
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);
@ -77,7 +128,7 @@ QDialog(pwgt, f)
phblay -> addWidget(m_pPlugins, 1);
phblay -> addWidget(pscroll, 2);
InitPluginsList(m_pPlugins);
InitPluginsList();
QHBoxLayout *phblayFind = new QHBoxLayout;
@ -106,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();
@ -179,12 +235,11 @@ void PluginsList::showInfo(QListWidgetItem *pitem, QListWidgetItem *previous)
}
descr += "<b>Binary package</b>: " + QString(gst_plugin_get_package (plugin)) + "<br>";
descr += "<b>Origin URL</b>: " + QString(gst_plugin_get_origin (plugin)) + "<br>";
descr += "<b>Rank</b>: " + QString::number(gst_plugin_feature_get_rank(GST_PLUGIN_FEATURE(factory)));
m_plblInfo -> setText(descr);
}
void PluginsList::insert(QListWidgetItem *pitem)
void PluginsListDialog::insert(QListWidgetItem *pitem)
{
if(!pitem) {
qDebug() << "Do not insert null item";
@ -200,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)
{
@ -218,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++)
{
@ -230,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;
};