Add typefind element to pad menu

Allow to add and detect pad caps by typefind.
This commit is contained in:
Stéphane Cerveau 2017-05-21 22:55:30 +02:00
parent b8f3b20fa3
commit 2280d88b48
3 changed files with 29 additions and 9 deletions

View file

@ -545,6 +545,7 @@ void GraphDisplay::showContextMenu(QMouseEvent *event)
menu.addAction(new CustomMenuAction("Render", &menu)); menu.addAction(new CustomMenuAction("Render", &menu));
menu.addAction(new CustomMenuAction("Render anyway", &menu)); menu.addAction(new CustomMenuAction("Render anyway", &menu));
menu.addAction(new CustomMenuAction("Pad properties", &menu)); menu.addAction(new CustomMenuAction("Pad properties", &menu));
menu.addAction(new CustomMenuAction("typefind", "ElementName", &menu));
} }
else if(elementId != ((size_t)-1)) else if(elementId != ((size_t)-1))
{ {
@ -627,8 +628,8 @@ void GraphDisplay::showContextMenu(QMouseEvent *event)
requestPad(elementId); requestPad(elementId);
else if (pact -> getName() == "Remove selected") else if (pact -> getName() == "Remove selected")
removeSelected(); removeSelected();
else if(pact->getName() == "ElementName") else if (pact->getName() == "ElementName")
addPlugin(pact->text()); connectPlugin(elementId, pact->text());
} }
} }
} }
@ -672,11 +673,14 @@ void GraphDisplay::removePlugin(std::size_t id)
} }
} }
void GraphDisplay::addPlugin(const QString& name) 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) void GraphDisplay::showElementProperties(std::size_t id)
{ {
ElementInfo* element = getElement(id); ElementInfo* element = getElement(id);
@ -712,7 +716,6 @@ void GraphDisplay::renderPad(std::size_t elementId, std::size_t padId, bool caps
for (l = plugins_list; l != NULL; l = l->next) { for (l = plugins_list; l != NULL; l = l->next) {
Plugin* plugin = (Plugin*)(l->data); Plugin* plugin = (Plugin*)(l->data);
if (m_pGraph->CanConnect(element->m_name.c_str(), pad->m_name.c_str() , plugin->getName().toStdString().c_str())) {
if (m_pGraph->CanConnect(element->m_name.c_str(), pad->m_name.c_str() , plugin->getName().toStdString().c_str(), capsAny)) { 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); gchar* pluginName = m_pGraph->AddPlugin(plugin->getName().toStdString().c_str(), NULL);
m_pGraph->Connect(element->m_name.c_str(), pluginName); m_pGraph->Connect(element->m_name.c_str(), pluginName);

View file

@ -79,7 +79,7 @@ private:
QPoint getPadPosition(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 disconnect(std::size_t elementId, std::size_t padId);
void requestPad(std::size_t elementId); void requestPad(std::size_t elementId);
void addPlugin(const QString& name); void connectPlugin(std::size_t elementId, const QString& destElementName);
ElementInfo* getElement(std::size_t elementId); ElementInfo* getElement(std::size_t elementId);
PadInfo* getPad(std::size_t elementId, std::size_t padId); PadInfo* getPad(std::size_t elementId, std::size_t padId);

View file

@ -22,6 +22,16 @@ gchar* get_str_caps_limited(gchar* str)
return result; 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() GraphManager::GraphManager()
{ {
m_pGraph = gst_pipeline_new ("pipeline"); m_pGraph = gst_pipeline_new ("pipeline");
@ -227,6 +237,14 @@ bool GraphManager::Connect(const char *srcElement, const char *dstElement)
gboolean seekRes = gst_element_seek_simple(m_pGraph, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, 0); 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(src);
gst_object_unref(dst); gst_object_unref(dst);
@ -420,7 +438,7 @@ bool GraphManager::Play()
qDebug() << "state changing to Play was FAILED"; qDebug() << "state changing to Play was FAILED";
} }
return res == GST_STATE_PLAYING; return state == GST_STATE_PLAYING;
} }
@ -437,10 +455,9 @@ bool GraphManager::Pause()
qDebug() << "state changing to Pause was FAILED"; qDebug() << "state changing to Pause was FAILED";
} }
return res == GST_STATE_PAUSED; return state == GST_STATE_PAUSED;
} }
bool GraphManager::Stop() bool GraphManager::Stop()
{ {
GstStateChangeReturn res = gst_element_set_state(m_pGraph, GST_STATE_READY); GstStateChangeReturn res = gst_element_set_state(m_pGraph, GST_STATE_READY);