[gst-debugger] gst-debugger: add plugins



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]