3#if defined(QGC_HAS_ANY_GPU_PATH)
5#include <QtCore/QLoggingCategory>
6#include <QtCore/QMutexLocker>
11namespace GstContextBridge {
13const char* matchContextType(
const BridgeVTable& vt,
const char* type)
18 for (
int i = 0; i < vt.contextTypeCount; ++i) {
19 if (g_strcmp0(type, vt.contextTypes[i]) == 0) {
20 return vt.contextTypes[i];
31GstContext* snapshotContext(
const BridgeVTable& vt,
void* user,
const char* matched)
33 GstObject*
object =
nullptr;
35 QMutexLocker lock(&vt.mutex(user));
36 if (!vt.primeLocked(user)) {
39 object = vt.refObject(user, matched);
44 GstContext* ctx = vt.buildContext(user, matched,
object);
45 gst_object_unref(
object);
51GstBusSyncReply handleSyncMessage(
const BridgeVTable& vt,
void* user, GstMessage* message)
53 if (GST_MESSAGE_TYPE(message) != GST_MESSAGE_NEED_CONTEXT) {
56 const gchar* contextType =
nullptr;
57 if (!gst_message_parse_context_type(message, &contextType) || !contextType) {
60 const char* matched = matchContextType(vt, contextType);
64 GstElement* element = GST_ELEMENT(GST_MESSAGE_SRC(message));
69 GstContext* ctx = snapshotContext(vt, user, matched);
73 gst_element_set_context(element, ctx);
74 gst_context_unref(ctx);
77 vt.onHandoff(user, element, matched);
79 qCDebug(vt.cat(user)) <<
"Provided" << vt.apiName << matched <<
"context to" << GST_ELEMENT_NAME(element);
83 gst_message_unref(message);
87bool answerContextQuery(
const BridgeVTable& vt,
void* user, GstQuery* query)
89 if (!query || GST_QUERY_TYPE(query) != GST_QUERY_CONTEXT) {
92 const gchar* contextType =
nullptr;
93 if (!gst_query_parse_context_type(query, &contextType) || !contextType) {
96 const char* matched = matchContextType(vt, contextType);
101 GstContext* ctx = snapshotContext(vt, user, matched);
105 gst_query_set_context(query, ctx);
106 gst_context_unref(ctx);
110void registerBridge(
const QLoggingCategory& cat,
const char* apiName, GstBusSyncReply (*handler)(GstMessage*),
115 const auto h = GstContextBridgeRegistry::registerBridgeHandler(handler);
116 const auto r = GstContextBridgeRegistry::registerResetCallback(reset);
117 if ((h == GstContextBridgeRegistry::kInvalidHandle) || (r == GstContextBridgeRegistry::kInvalidHandle)) {
118 qCWarning(cat) << apiName <<
"bridge registration incomplete (registry full); GPU path inactive";
struct _GstElement GstElement