[gst-debugger] gst-debugger: add filtering for gststructure
- From: Marcin Kolny <mkolny src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gst-debugger] gst-debugger: add filtering for gststructure
- Date: Tue, 15 Sep 2015 21:46:31 +0000 (UTC)
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]