[gst-debugger] gst-debugger: add filtering for gststructure



commit d9fde0ee2ba55d45a1cd5c0d60677a8daaadbb88
Author: Marcin Kolny <marcin kolny gmail com>
Date:   Tue Sep 15 23:46:15 2015 +0200

    gst-debugger: add filtering for gststructure

 src/gst-debugger/Makefile.am                     |    2 +
 src/gst-debugger/filter-parser/tokens.cpp        |    2 +-
 src/gst-debugger/filter-parser/tokens.h          |    2 +-
 src/gst-debugger/modules/bus_messages_module.cpp |   19 ++++++++
 src/gst-debugger/modules/bus_messages_module.h   |    2 +
 src/gst-debugger/modules/filter_utils.cpp        |   51 ++++++++++++++++++++++
 src/gst-debugger/modules/filter_utils.h          |   21 +++++++++
 src/gst-debugger/modules/pad_data_modules.cpp    |   35 +++++++++++++++
 src/gst-debugger/modules/pad_data_modules.h      |   11 ++++-
 9 files changed, 142 insertions(+), 3 deletions(-)
---
diff --git a/src/gst-debugger/Makefile.am b/src/gst-debugger/Makefile.am
index 34474ec..29d213b 100644
--- a/src/gst-debugger/Makefile.am
+++ b/src/gst-debugger/Makefile.am
@@ -49,6 +49,7 @@ gst_debugger_headers =                                        \
        modules/base_main_module.h                      \
        modules/bus_messages_module.h                   \
        modules/control_module.h                        \
+       modules/filter_utils.h                          \
        modules/gst_properties_module.h                 \
        modules/log_module.h                            \
        modules/main_module.h                           \
@@ -87,6 +88,7 @@ gst_debugger_ GST_API_VERSION@_SOURCES =              \
        models/gst_pipeline_model.cpp                   \
        modules/base_main_module.cpp                    \
        modules/bus_messages_module.cpp                 \
+       modules/filter_utils.cpp                        \
        modules/gst_properties_module.cpp               \
        modules/log_module.cpp                          \
        modules/main_module.cpp                         \
diff --git a/src/gst-debugger/filter-parser/tokens.cpp b/src/gst-debugger/filter-parser/tokens.cpp
index cb7a863..214de74 100644
--- a/src/gst-debugger/filter-parser/tokens.cpp
+++ b/src/gst-debugger/filter-parser/tokens.cpp
@@ -13,7 +13,7 @@
 TokenNumber::TokenNumber(const std::string &number)
  : Token(TokenType::NUMBER_LITERAL)
 {
-       value = atoi(number.c_str());
+       value = atoll(number.c_str());
 }
 
 TokenString::TokenString(const std::string &str)
diff --git a/src/gst-debugger/filter-parser/tokens.h b/src/gst-debugger/filter-parser/tokens.h
index c52108f..492de15 100644
--- a/src/gst-debugger/filter-parser/tokens.h
+++ b/src/gst-debugger/filter-parser/tokens.h
@@ -56,7 +56,7 @@ public:
        T get_value() const { return value; }
 };
 
-class TokenNumber : public Token<int>
+class TokenNumber : public Token<long long>
 {
 public:
        TokenNumber(const std::string &number);
diff --git a/src/gst-debugger/modules/bus_messages_module.cpp 
b/src/gst-debugger/modules/bus_messages_module.cpp
index aed9171..b1e088d 100644
--- a/src/gst-debugger/modules/bus_messages_module.cpp
+++ b/src/gst-debugger/modules/bus_messages_module.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "bus_messages_module.h"
+#include "filter_utils.h"
 
 #include "controller/controller.h"
 
@@ -74,3 +75,21 @@ void BusMessagesModule::bus_message_received_()
        row[columns.message] = message;
        delete qebm;
 }
+
+bool BusMessagesModule::filter_function(const Gtk::TreeModel::const_iterator& it)
+{
+       if (!filter_expression)
+               return true;
+
+       std::shared_ptr<TokenIdentifier> ident;
+       std::shared_ptr<TokenBase> value;
+
+       read_tokens_by_type(filter_expression, ident, value);
+
+       auto obj = it->get_value(columns.message);
+
+       if (obj == nullptr)
+               return true;
+
+       return filter_structure(gst_message_get_structure(obj), ident->get_value().c_str(), value);
+}
diff --git a/src/gst-debugger/modules/bus_messages_module.h b/src/gst-debugger/modules/bus_messages_module.h
index ed7e995..d401ca5 100644
--- a/src/gst-debugger/modules/bus_messages_module.h
+++ b/src/gst-debugger/modules/bus_messages_module.h
@@ -37,6 +37,8 @@ public:
        void load_details(Gtk::TreeView *view, const Gtk::TreeModel::Path &path) override;
 
        void set_controller(const std::shared_ptr<Controller> &controller) override;
+
+       bool filter_function(const Gtk::TreeModel::const_iterator& it) override;
 };
 
 #endif /* SRC_GST_DEBUGGER_MODULES_BUS_MESSAGES_MODULE_H_ */
diff --git a/src/gst-debugger/modules/filter_utils.cpp b/src/gst-debugger/modules/filter_utils.cpp
new file mode 100644
index 0000000..7f205dd
--- /dev/null
+++ b/src/gst-debugger/modules/filter_utils.cpp
@@ -0,0 +1,51 @@
+/*
+ * filter_utils.cpp
+ *
+ *  Created on: Sep 15, 2015
+ *      Author: loganek
+ */
+
+#include "filter_utils.h"
+
+#include <cstring>
+
+bool filter_structure(const GstStructure *structure, const gchar *field_name, const 
std::shared_ptr<TokenBase> &value)
+{
+       if (structure == nullptr)
+               return true;
+
+       if (!gst_structure_has_field(structure, field_name))
+               return false;
+
+       GType field_type = gst_structure_get_field_type(structure, field_name);
+
+       if (field_type == G_TYPE_STRING)
+               return strcmp(gst_structure_get_string(structure, field_name), 
std::static_pointer_cast<TokenString>(value)->get_value().c_str()) == 0;
+#define MAKE_FIELD_FILTER(GTYPE, CTYPE) \
+       if (field_type == GTYPE) { \
+               g ## CTYPE v; gst_structure_get_ ## CTYPE(structure, field_name, &v); \
+               return (long long)v == std::static_pointer_cast<TokenNumber>(value)->get_value(); \
+       }
+
+       MAKE_FIELD_FILTER(G_TYPE_INT, int)
+       MAKE_FIELD_FILTER(G_TYPE_UINT, uint)
+       MAKE_FIELD_FILTER(G_TYPE_INT64, int64)
+       MAKE_FIELD_FILTER(G_TYPE_UINT64, uint64)
+       MAKE_FIELD_FILTER(G_TYPE_BOOLEAN, boolean)
+
+       return true;
+}
+
+void read_tokens_by_type(const std::shared_ptr<Expression> &filter_expression, 
std::shared_ptr<TokenIdentifier> &ident, std::shared_ptr<TokenBase> &value)
+{
+       if (filter_expression->left->get_type() == TokenType::IDENTIFIER)
+       {
+               ident = std::static_pointer_cast<TokenIdentifier>(filter_expression->left);
+               value = filter_expression->right;
+       }
+       else
+       {
+               ident = std::static_pointer_cast<TokenIdentifier>(filter_expression->right);
+               value = filter_expression->left;
+       }
+}
diff --git a/src/gst-debugger/modules/filter_utils.h b/src/gst-debugger/modules/filter_utils.h
new file mode 100644
index 0000000..b2721dc
--- /dev/null
+++ b/src/gst-debugger/modules/filter_utils.h
@@ -0,0 +1,21 @@
+/*
+ * filter_utils.h
+ *
+ *  Created on: Sep 15, 2015
+ *      Author: loganek
+ */
+
+#ifndef SRC_GST_DEBUGGER_MODULES_FILTER_UTILS_H_
+#define SRC_GST_DEBUGGER_MODULES_FILTER_UTILS_H_
+
+#include "filter-parser/parser.h"
+
+#include <gst/gst.h>
+
+#include <memory>
+
+bool filter_structure(const GstStructure *structure, const gchar *field_name, const 
std::shared_ptr<TokenBase> &value);
+
+void read_tokens_by_type(const std::shared_ptr<Expression> &filter_expression, 
std::shared_ptr<TokenIdentifier> &ident, std::shared_ptr<TokenBase> &value);
+
+#endif /* SRC_GST_DEBUGGER_MODULES_FILTER_UTILS_H_ */
diff --git a/src/gst-debugger/modules/pad_data_modules.cpp b/src/gst-debugger/modules/pad_data_modules.cpp
index f231f5e..d8624e0 100644
--- a/src/gst-debugger/modules/pad_data_modules.cpp
+++ b/src/gst-debugger/modules/pad_data_modules.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "pad_data_modules.h"
+#include "filter_utils.h"
 
 #include "dialogs/buffer_data_dialog.h"
 
@@ -87,6 +88,20 @@ PadWatch_WatchType PadDataModule<T>::get_watch_type() const
        }
 }
 
+template<typename T>
+bool PadDataModule<T>::filter_function(const Gtk::TreeModel::const_iterator& it)
+{
+       if (!filter_expression)
+               return true;
+
+       std::shared_ptr<TokenIdentifier> ident;
+       std::shared_ptr<TokenBase> value;
+
+       read_tokens_by_type(filter_expression, ident, value);
+
+       return filter_structure(get_gst_structure(it), ident->get_value().c_str(), value);
+}
+
 GstEvent* EventModule::deserialize(const std::string &payload)
 {
        return gst_event_deserialize(payload.c_str(), payload.length());
@@ -110,6 +125,16 @@ void EventModule::display_details(const Glib::RefPtr<Gst::MiniObject>& obj, cons
        append_details_from_structure(structure);
 }
 
+const GstStructure* EventModule::get_gst_structure(const Gtk::TreeModel::const_iterator &it) const
+{
+       auto obj = it->get_value(columns.object);
+
+       if (obj == nullptr)
+               return nullptr;
+
+       return gst_event_get_structure(obj);
+}
+
 GstQuery* QueryModule::deserialize(const std::string &payload)
 {
        return gst_query_deserialize(payload.c_str(), payload.length());
@@ -126,6 +151,16 @@ void QueryModule::display_details(const Glib::RefPtr<Gst::MiniObject>& obj, cons
        append_details_from_structure(structure);
 }
 
+const GstStructure* QueryModule::get_gst_structure(const Gtk::TreeModel::const_iterator &it) const
+{
+       auto obj = it->get_value(columns.object);
+
+       if (obj == nullptr)
+               return nullptr;
+
+       return gst_query_get_structure(obj);
+}
+
 GstBuffer* BufferModule::deserialize(const std::string &payload)
 {
        return gst_buffer_deserialize(payload.c_str(), payload.length());
diff --git a/src/gst-debugger/modules/pad_data_modules.h b/src/gst-debugger/modules/pad_data_modules.h
index 011abc3..45b62e1 100644
--- a/src/gst-debugger/modules/pad_data_modules.h
+++ b/src/gst-debugger/modules/pad_data_modules.h
@@ -28,7 +28,6 @@ public:
 template<typename T>
 class PadDataModule : public BaseMainModule
 {
-       PadDataListModelColumns<T> columns;
        GstreamerInfo_InfoType info_type;
 
        virtual T* deserialize(const std::string &payload) = 0;
@@ -37,10 +36,16 @@ class PadDataModule : public BaseMainModule
        void qebm_received_();
 
 protected:
+       PadDataListModelColumns<T> columns;
+
        PadWatch_WatchType get_watch_type() const;
 
        virtual void display_details(const Glib::RefPtr<Gst::MiniObject> &obj, const Glib::ustring &pad_path) 
= 0;
 
+       bool filter_function(const Gtk::TreeModel::const_iterator& it) override;
+
+       virtual const GstStructure* get_gst_structure(const Gtk::TreeModel::const_iterator& it) const { 
return nullptr; }
+
 public:
        PadDataModule(GstreamerInfo_InfoType info_type);
 
@@ -57,6 +62,8 @@ class EventModule : public PadDataModule<GstEvent>
 
        void display_details(const Glib::RefPtr<Gst::MiniObject>& obj, const Glib::ustring &pad_path) 
override;
 
+       const GstStructure* get_gst_structure(const Gtk::TreeModel::const_iterator &it) const override;
+
 public:
        EventModule() : PadDataModule<GstEvent>(GstreamerInfo_InfoType_EVENT) {}
 
@@ -68,6 +75,8 @@ class QueryModule : public PadDataModule<GstQuery>
 
        void display_details(const Glib::RefPtr<Gst::MiniObject>& obj, const Glib::ustring &pad_path) 
override;
 
+       const GstStructure* get_gst_structure(const Gtk::TreeModel::const_iterator &it) const override;
+
 public:
        QueryModule() : PadDataModule<GstQuery>(GstreamerInfo_InfoType_QUERY) {}
 };


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]