mirror of
https://gitlab.freedesktop.org/dabrain34/GstPipelineStudio.git
synced 2024-09-24 12:40:03 +00:00
commit
606b1bb3eb
11 changed files with 435 additions and 196 deletions
|
@ -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
13
src/CustomMenuAction.cpp
Normal 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
22
src/CustomMenuAction.h
Normal 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_
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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,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++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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