[gst-debugger] gst-debugger: add plugins
- From: Marcin Kolny <mkolny src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gst-debugger] gst-debugger: add plugins
- Date: Wed, 14 Oct 2015 10:50:55 +0000 (UTC)
commit 936e012290100d0c2c36abe793e804ecd3940fca
Author: Marcin Kolny <marcin kolny gmail com>
Date: Wed Oct 14 11:00:27 2015 +0200
gst-debugger: add plugins
configure.ac | 8 ++-
src/gst-debugger/Makefile.am | 8 ++-
src/gst-debugger/addins/addins-interface.h | 44 ++++++++++++++
src/gst-debugger/addins/addins-notifier.h | 31 ++++++++++
src/gst-debugger/controller/addins_controller.cpp | 66 +++++++++++++++++++++
src/gst-debugger/controller/addins_controller.h | 40 +++++++++++++
src/gst-debugger/controller/controller.cpp | 15 +++++
src/gst-debugger/controller/controller.h | 6 +-
src/gst-debugger/main_window.cpp | 37 ++++++++++++
src/gst-debugger/main_window.h | 2 +
src/gst-debugger/ui/gst-debugger.glade | 28 +++++++++
11 files changed, 279 insertions(+), 6 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 6a3535c..5f636c6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -31,8 +31,6 @@ PKG_CHECK_MODULES(PROTOBUF, protobuf >= $PROTOBUF_VERSION)
PKG_CHECK_MODULES(PROTOBUF_C, libprotobuf-c >= $PROTOBUF_C_VERSION)
PKG_CHECK_MODULES(GVC, libgvc >= $GVC_VERSION)
-BOOST_REQUIRE([1.55])
-
AM_INIT_AUTOMAKE([1.11 check-news subdir-objects -Wall])
AM_SILENT_RULES([yes])
AM_MAINTAINER_MODE
@@ -71,6 +69,12 @@ AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
[The domain to use with gettext])
AM_GLIB_GNU_GETTEXT
+
+BOOST_REQUIRE([1.55])
+BOOST_SYSTEM
+BOOST_FILESYSTEM
+
+
GST_DEBUGGER_LOCALEDIR=[${datadir}/locale]
AC_SUBST(GST_DEBUGGER_LOCALEDIR)
diff --git a/src/gst-debugger/Makefile.am b/src/gst-debugger/Makefile.am
index 9e086da..b29b31d 100644
--- a/src/gst-debugger/Makefile.am
+++ b/src/gst-debugger/Makefile.am
@@ -30,6 +30,8 @@ gst_debugger_ GST_API_VERSION@_SOURCES = \
controller/connection_controller.h \
controller/tcp_client.cpp \
controller/tcp_client.h \
+ controller/addins_controller.cpp \
+ controller/addins_controller.h \
dialogs/connection_properties_dialog.cpp \
dialogs/connection_properties_dialog.h \
dialogs/remote_data_dialog.h \
@@ -92,10 +94,12 @@ gst_debugger_ GST_API_VERSION@_SOURCES = \
gvalue-converter/gvalue_enum.cpp \
gvalue-converter/gvalue_enum.h \
gvalue-converter/gvalue_flags.cpp \
- gvalue-converter/gvalue_flags.h
+ gvalue-converter/gvalue_flags.h \
+ addins/addins-interface.h \
+ addins/addins-notifier.h
-gst_debugger_ GST_API_VERSION@_LDFLAGS = $(GTKMM_LIBS) $(GSTMM_LIBS) $(GVC_LIBS) $(PROTOBUF_LIBS) -lX11
+gst_debugger_ GST_API_VERSION@_LDFLAGS = $(GTKMM_LIBS) $(GSTMM_LIBS) $(GVC_LIBS) $(PROTOBUF_LIBS) -lX11
$(BOOST_SYSTEM_LIBS) $(BOOST_FILESYSTEM_LIBS)
gst_debugger_ GST_API_VERSION@_LDADD = ../common/libgst-debugger-common-cpp- GST_DEBUGGER_API_VERSION@.la
gst_debugger_ GST_API_VERSION@_CXXFLAGS = $(GTKMM_CFLAGS) $(GSTMM_CFLAGS) $(GVC_CFLAGS)
-DGST_DEBUGGER_LOCALEDIR=\"${GST_DEBUGGER_LOCALEDIR}\"
gst_debugger_ GST_API_VERSION@_CPPFLAGS = $(GVC_CFLAGS) -I$(top_srcdir)/src/
diff --git a/src/gst-debugger/addins/addins-interface.h b/src/gst-debugger/addins/addins-interface.h
new file mode 100644
index 0000000..dd52b38
--- /dev/null
+++ b/src/gst-debugger/addins/addins-interface.h
@@ -0,0 +1,44 @@
+/*
+ * addins-interface.h
+ *
+ * Created on: Oct 13, 2015
+ * Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_ADDINS_ADDINS_INTERFACE_H_
+#define SRC_GST_DEBUGGER_ADDINS_ADDINS_INTERFACE_H_
+
+#include <addins/addins-notifier.h>
+
+#include <gtkmm/widget.h>
+
+#include <string>
+
+namespace GstDebugger {
+
+class Addin
+{
+ std::string name;
+
+protected:
+ Gtk::Widget *widget = nullptr;
+
+ virtual void create_widget() = 0;
+
+public:
+ Addin(const std::string &name, AddinsNotifier* notifier) : name(name) {}
+ virtual ~Addin() { delete widget; }
+
+ Gtk::Widget *get_widget()
+ {
+ if (widget == nullptr)
+ create_widget();
+ return widget;
+ }
+
+ std::string get_name() const { return name; }
+};
+
+}
+
+#endif /* SRC_GST_DEBUGGER_ADDINS_ADDINS_INTERFACE_H_ */
diff --git a/src/gst-debugger/addins/addins-notifier.h b/src/gst-debugger/addins/addins-notifier.h
new file mode 100644
index 0000000..0e8f811
--- /dev/null
+++ b/src/gst-debugger/addins/addins-notifier.h
@@ -0,0 +1,31 @@
+/*
+ * addins-notifier.h
+ *
+ * Created on: Oct 14, 2015
+ * Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_ADDINS_ADDINS_NOTIFIER_H_
+#define SRC_GST_DEBUGGER_ADDINS_ADDINS_NOTIFIER_H_
+
+#include <common/gstdebugger.pb.h>
+
+#include <gstreamermm.h>
+
+namespace GstDebugger {
+
+class AddinsNotifier
+{
+public:
+ virtual ~AddinsNotifier() {}
+
+ sigc::signal<void, const GstDebugger::QueryInfo&> on_query_received;
+ sigc::signal<void, const GstDebugger::BufferInfo&> on_buffer_received;
+ sigc::signal<void, const GstDebugger::EventInfo&> on_event_received;
+ sigc::signal<void, const GstDebugger::MessageInfo&> on_message_received;
+ sigc::signal<void, const GstDebugger::LogInfo&> on_log_received;
+};
+
+}
+
+#endif /* SRC_GST_DEBUGGER_ADDINS_ADDINS_NOTIFIER_H_ */
diff --git a/src/gst-debugger/controller/addins_controller.cpp
b/src/gst-debugger/controller/addins_controller.cpp
new file mode 100644
index 0000000..d89166c
--- /dev/null
+++ b/src/gst-debugger/controller/addins_controller.cpp
@@ -0,0 +1,66 @@
+/*
+ * addins_controller.cpp
+ *
+ * Created on: Oct 14, 2015
+ * Author: loganek
+ */
+
+#include "addins_controller.h"
+
+#include <boost/filesystem.hpp>
+
+void AddinsController::load_from_dir(const std::string &path)
+{
+ namespace fs = boost::filesystem;
+ fs::path someDir(path);
+ fs::directory_iterator end_iter;
+
+ if (!fs::exists(someDir) || !fs::is_directory(someDir))
+ return;
+
+ for( fs::directory_iterator dir_iter(someDir) ; dir_iter != end_iter ; ++dir_iter)
+ {
+ auto filename = dir_iter->path().generic_string();
+
+ if (fs::is_regular_file(dir_iter->status()) && g_str_has_suffix (filename.c_str(),
G_MODULE_SUFFIX))
+ {
+ load_module(filename);
+ }
+ }
+}
+
+void AddinsController::load_module(const std::string &filename)
+{
+ GstDebugger::Addin* (*create_addin)(GstDebugger::AddinsNotifier* notifier) = nullptr;
+ auto module = std::make_shared<Glib::Module>(filename);
+ if (!*module) return; // todo notify
+ bool ok = module->get_symbol("gst_debugger_addin_init", (void *&)create_addin);
+ if (!ok) return; // todo notify
+ AddinInfo nfo; nfo.module = module; nfo.addin =
std::shared_ptr<GstDebugger::Addin>(create_addin(this));
+ addins[filename] = nfo;
+}
+
+void AddinsController::reload_addins()
+{
+ bool found;
+ auto values = Glib::getenv("GST_DEBUGGER_PLUGIN_PATH", found);
+ if (!found) return;
+
+ gchar** paths = g_strsplit(values.c_str(), ";", -1);
+ int i = 0;
+ while (paths[i] != nullptr)
+ {
+ load_from_dir(paths[i++]);
+ }
+ g_strfreev(paths);
+
+ on_addins_reloaded();
+}
+
+std::vector<std::shared_ptr<GstDebugger::Addin>> AddinsController::get_addins() const
+{
+ std::vector<std::shared_ptr<GstDebugger::Addin>> a;
+ for (auto addin : addins)
+ a.push_back(addin.second.addin);
+ return a;
+}
diff --git a/src/gst-debugger/controller/addins_controller.h b/src/gst-debugger/controller/addins_controller.h
new file mode 100644
index 0000000..cd40ee4
--- /dev/null
+++ b/src/gst-debugger/controller/addins_controller.h
@@ -0,0 +1,40 @@
+/*
+ * addins_controller.h
+ *
+ * Created on: Oct 13, 2015
+ * Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_CONTROLLER_ADDINS_CONTROLLER_H_
+#define SRC_GST_DEBUGGER_CONTROLLER_ADDINS_CONTROLLER_H_
+
+#include "addins/addins-interface.h"
+#include "addins/addins-notifier.h"
+
+#include <glibmm.h>
+
+class AddinsController : public GstDebugger::AddinsNotifier
+{
+ struct AddinInfo
+ {
+ std::shared_ptr<Glib::Module> module;
+ std::shared_ptr<GstDebugger::Addin> addin;
+ };
+
+ std::map<std::string, AddinInfo> addins;
+
+ void load_from_dir(const std::string &path);
+
+ void load_module(const std::string &filename);
+
+public:
+ virtual ~AddinsController() {}
+
+ void reload_addins();
+
+ std::vector<std::shared_ptr<GstDebugger::Addin>> get_addins() const;
+
+ sigc::signal<void> on_addins_reloaded;
+};
+
+#endif /* SRC_GST_DEBUGGER_CONTROLLER_ADDINS_CONTROLLER_H_ */
diff --git a/src/gst-debugger/controller/controller.cpp b/src/gst-debugger/controller/controller.cpp
index 9793e5b..b7d536c 100644
--- a/src/gst-debugger/controller/controller.cpp
+++ b/src/gst-debugger/controller/controller.cpp
@@ -90,6 +90,21 @@ void Controller::process_frame(const GstDebugger::GStreamerData &data)
case GstDebugger::GStreamerData::kPadDynamicInfo:
update_pad_dynamic_info(data.pad_dynamic_info());
break;
+ case GstDebugger::GStreamerData::kQueryInfo:
+ on_query_received(data.query_info());
+ break;
+ case GstDebugger::GStreamerData::kEventInfo:
+ on_event_received(data.event_info());
+ break;
+ case GstDebugger::GStreamerData::kMessageInfo:
+ on_message_received(data.message_info());
+ break;
+ case GstDebugger::GStreamerData::kBufferInfo:
+ on_buffer_received(data.buffer_info());
+ break;
+ case GstDebugger::GStreamerData::kLogInfo:
+ on_log_received(data.log_info());
+ break;
}
}
diff --git a/src/gst-debugger/controller/controller.h b/src/gst-debugger/controller/controller.h
index 824ee00..14834d7 100644
--- a/src/gst-debugger/controller/controller.h
+++ b/src/gst-debugger/controller/controller.h
@@ -12,6 +12,7 @@
#include "connection_controller.h"
#include "command_factory.h"
#include "topology_controller.h"
+#include "addins_controller.h"
#include "models/gst_enum_model.h"
#include "models/gst_factory_model.h"
@@ -23,7 +24,8 @@ class Controller :
public std::enable_shared_from_this<Controller>,
public ConnectionController,
public CommandFactory,
- public TopologyController
+ public TopologyController,
+ public AddinsController
{
private:
IMainView *view;
@@ -73,7 +75,6 @@ public:
void log(const std::string &message);
sigc::signal<void> on_debug_categories_changed;
- sigc::signal<void, const GstDebugger::GStreamerData&> on_frame_received;
sigc::signal<void, const GstDebugger::Command&> on_confirmation_received;
sigc::signal<void, const Glib::ustring&, bool> on_enum_list_changed; /* enum name, true - add, false
- remove */
sigc::signal<void, const Glib::ustring&, bool> on_factory_list_changed;
@@ -81,6 +82,7 @@ public:
sigc::signal<void, std::shared_ptr<ElementModel>> on_model_changed;
sigc::signal<void, const GstDebugger::PropertyValue&> on_property_value_received;
sigc::signal<void> on_selected_object_changed;
+ sigc::signal<void, const GstDebugger::GStreamerData&> on_frame_received;
};
#endif /* SRC_GST_DEBUGGER_CONTROLLER_CONTROLLER_H_ */
diff --git a/src/gst-debugger/main_window.cpp b/src/gst-debugger/main_window.cpp
index fa0e81e..d7c0f9d 100644
--- a/src/gst-debugger/main_window.cpp
+++ b/src/gst-debugger/main_window.cpp
@@ -36,6 +36,12 @@ MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>
builder->get_widget("remoteKlassesMenuitem", remote_klasses);
remote_klasses->signal_activate().connect([this] { klasses_dialog->show(); });
+ builder->get_widget("addinsMenuItem", addins_menu_item);
+
+ Gtk::MenuItem *reload_addins_menu_item;
+ builder->get_widget("reloadAddinsMenuItem", reload_addins_menu_item);
+ reload_addins_menu_item->signal_activate().connect([this] { controller->reload_addins(); });
+
builder->get_widget("connectMenuItem", connect_menu_item);
connect_menu_item->signal_activate().connect(sigc::mem_fun(*this,
&MainWindow::connectMenuItem_activate_cb));
@@ -79,6 +85,9 @@ void MainWindow::set_controller(const std::shared_ptr<Controller> &controller)
this->controller = controller;
controller->on_connection_status_changed(sigc::mem_fun(*this,
&MainWindow::connection_status_changed));
+ controller->on_addins_reloaded.connect(sigc::mem_fun(*this, &MainWindow::addins_reloaded));
+
+ controller->reload_addins();
main_module->set_controller(controller);
graph_module->set_controller(controller);
@@ -126,3 +135,31 @@ void MainWindow::connection_status_changed(bool connected)
((Gtk::Label*)connect_menu_item->get_child())->set_text(_("Connect"));
}
}
+
+void MainWindow::addins_reloaded()
+{
+ static int plugin_val = 31337;
+ Gtk::Menu *sub_menu = addins_menu_item->get_submenu();
+
+ for (auto m : sub_menu->get_children())
+ if (GPOINTER_TO_INT(m->get_data("plugin-menu-item")) == plugin_val)
+ sub_menu->remove(*m);
+
+ addins_menu_item->set_submenu(*sub_menu);
+
+ for (auto addin : this->controller->get_addins())
+ {
+ auto v = Gtk::manage(new Gtk::MenuItem(addin->get_name(), true));
+ v->set_data("plugin-menu-item", GINT_TO_POINTER(plugin_val));
+ v->signal_activate().connect([addin] {
+ if (addin->get_widget()->is_visible()) return;
+ Gtk::Window *wnd = new Gtk::Window();
+ wnd->add(*addin->get_widget());
+ wnd->set_title(addin->get_name());
+ wnd->signal_delete_event().connect([wnd](GdkEventAny *){ delete wnd; return true; });
+ wnd->show_all();
+ });
+ sub_menu->prepend(*v);
+ }
+ sub_menu->show_all();
+}
diff --git a/src/gst-debugger/main_window.h b/src/gst-debugger/main_window.h
index 8c0e3ae..9c223ea 100644
--- a/src/gst-debugger/main_window.h
+++ b/src/gst-debugger/main_window.h
@@ -27,6 +27,7 @@ class MainWindow : public IMainView
void connectionPropertiesMenuItem_activate_cb();
void connectMenuItem_activate_cb();
void connection_status_changed(bool connected);
+ void addins_reloaded();
Glib::RefPtr<Gtk::Builder> builder;
Gtk::MenuItem *connection_properties;
@@ -36,6 +37,7 @@ class MainWindow : public IMainView
Gtk::MenuItem *connect_menu_item;
Gtk::MenuItem *about_menu_item;
Gtk::MenuItem *quit_menu_item;
+ Gtk::MenuItem *addins_menu_item;
Gtk::AboutDialog *about_dialog;
Gtk::Statusbar *main_statusbar;
diff --git a/src/gst-debugger/ui/gst-debugger.glade b/src/gst-debugger/ui/gst-debugger.glade
index ff574a9..bfbe169 100644
--- a/src/gst-debugger/ui/gst-debugger.glade
+++ b/src/gst-debugger/ui/gst-debugger.glade
@@ -110,6 +110,34 @@
</object>
</child>
<child>
+ <object class="GtkMenuItem" id="addinsMenuItem">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Addins</property>
+ <property name="use_underline">True</property>
+ <child type="submenu">
+ <object class="GtkMenu" id="menu5">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkSeparatorMenuItem" id="menuitem2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="reloadAddinsMenuItem">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Reload</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
<object class="GtkMenuItem" id="menuitem4">
<property name="visible">True</property>
<property name="can_focus">False</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]