summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-03-08 12:30:22 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-03-19 13:37:01 +0000
commit0eb32bc4fe4c099ef5cc38a9841cda0d18c9691f (patch)
tree76ab7f04e9fd1496c9ac7bde29637d73dcca5a5c
parentedec1f8a4dbe6ed26f5996b1fbe24c4ee51c5585 (diff)
GStreamer: introduce templated cast functions to improve type safety
Small quality of life improvement when casting between gstreamer classes. Pick-to: 6.5 Change-Id: I466601888f07d467a4d976bf0d4bf09e7fa0a7d3 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit f8d2d0be8deacf0209847b8b4b428ffbe05fbc6a) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 984f0411e197c759ee3fcbf580541a8507dffb82)
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst_p.h61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/plugins/multimedia/gstreamer/common/qgst_p.h b/src/plugins/multimedia/gstreamer/common/qgst_p.h
index 1b066bbde..080e8e04c 100644
--- a/src/plugins/multimedia/gstreamer/common/qgst_p.h
+++ b/src/plugins/multimedia/gstreamer/common/qgst_p.h
@@ -40,6 +40,67 @@
QT_BEGIN_NAMESPACE
+namespace QGstImpl {
+
+template <typename T>
+struct GstObjectTraits
+{
+ // using Type = T;
+ // template <typename U>
+ // static bool isObjectOfType(U *);
+ // template <typename U>
+ // static T *cast(U *);
+};
+
+#define QGST_DEFINE_CAST_TRAITS(ClassName, MACRO_LABEL) \
+ template <> \
+ struct GstObjectTraits<ClassName> \
+ { \
+ using Type = ClassName; \
+ template <typename U> \
+ static bool isObjectOfType(U *arg) \
+ { \
+ return GST_IS_##MACRO_LABEL(arg); \
+ } \
+ template <typename U> \
+ static Type *cast(U *arg) \
+ { \
+ return GST_##MACRO_LABEL##_CAST(arg); \
+ } \
+ template <typename U> \
+ static Type *checked_cast(U *arg) \
+ { \
+ return GST_##MACRO_LABEL(arg); \
+ } \
+ }; \
+ static_assert(true, "ensure semicolon")
+
+QGST_DEFINE_CAST_TRAITS(GstPipeline, PIPELINE);
+QGST_DEFINE_CAST_TRAITS(GstElement, ELEMENT);
+QGST_DEFINE_CAST_TRAITS(GstBin, BIN);
+QGST_DEFINE_CAST_TRAITS(GstPad, PAD);
+
+#undef QGST_DEFINE_CAST_TRAITS
+
+} // namespace QGstImpl
+
+template <typename DestinationType, typename SourceType>
+DestinationType *qGstSafeCast(SourceType *arg)
+{
+ using Traits = QGstImpl::GstObjectTraits<DestinationType>;
+ if (Traits::isObjectOfType(arg))
+ return Traits::cast(arg);
+ return nullptr;
+}
+
+template <typename DestinationType, typename SourceType>
+DestinationType *qGstCheckedCast(SourceType *arg)
+{
+ using Traits = QGstImpl::GstObjectTraits<DestinationType>;
+ Q_ASSERT(Traits::isObjectOfType(arg));
+ return Traits::cast(arg);
+}
+
class QSize;
class QGstStructure;
class QGstCaps;