Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qgst_bus.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qgst_bus_p.h"
5
7
8QGstBus::QGstBus(QGstBusHandle bus)
9 : QGstBusHandle{
10 std::move(bus),
11 }
12{
13 if (!get())
14 return;
15
16 GPollFD pollFd{};
17 gst_bus_get_pollfd(get(), &pollFd);
18 Q_ASSERT(pollFd.fd);
19
20#ifndef Q_OS_WIN
21 m_socketNotifier.setSocket(pollFd.fd);
22
23 QObject::connect(&m_socketNotifier, &QSocketNotifier::activated, &m_socketNotifier,
24 [this](QSocketDescriptor, QSocketNotifier::Type) {
25 this->processAllPendingMessages();
26 });
27
28 m_socketNotifier.setEnabled(true);
29#else
30 m_socketNotifier.setHandle(reinterpret_cast<Qt::HANDLE>(pollFd.fd));
31
32 QObject::connect(&m_socketNotifier, &QWinEventNotifier::activated, &m_socketNotifier,
33 [this](QWinEventNotifier::HANDLE) {
34 this->processAllPendingMessages();
35 });
36 m_socketNotifier.setEnabled(true);
37#endif
38
39 gst_bus_set_sync_handler(get(), (GstBusSyncHandler)syncGstBusFilter, this, nullptr);
40}
41
42QGstBus::QGstBus(GstBus *bus, QGstBusHandle::RefMode refmode)
43 : QGstBus{
45 bus,
46 refmode,
47 },
48 }
49{
50}
51
53{
54 close();
55}
56
58{
59 if (!get())
60 return;
61
62 gst_bus_set_sync_handler(get(), nullptr, nullptr, nullptr);
63 QGstBusHandle::close();
64}
65
66void QGstBus::installMessageFilter(QGstreamerSyncMessageFilter *filter)
67{
68 Q_ASSERT(filter);
69 QMutexLocker lock(&filterMutex);
70 if (!syncFilters.contains(filter))
71 syncFilters.append(filter);
72}
73
74void QGstBus::removeMessageFilter(QGstreamerSyncMessageFilter *filter)
75{
76 Q_ASSERT(filter);
77 QMutexLocker lock(&filterMutex);
78 syncFilters.removeAll(filter);
79}
80
82{
83 Q_ASSERT(filter);
84 if (!busFilters.contains(filter))
85 busFilters.append(filter);
86}
87
89{
90 Q_ASSERT(filter);
91 busFilters.removeAll(filter);
92}
93
94bool QGstBus::processNextPendingMessage(GstMessageType type,
95 std::optional<std::chrono::nanoseconds> timeout)
96{
97 if (!get())
98 return false;
99
100 GstClockTime gstTimeout = [&]() -> GstClockTime {
101 if (!timeout)
102 return GST_CLOCK_TIME_NONE; // block forever
103 return timeout->count();
104 }();
105
106 QGstreamerMessage message{
107 gst_bus_timed_pop_filtered(get(), gstTimeout, type),
108 QGstreamerMessage::HasRef,
109 };
110 if (!message)
111 return false;
112
113 for (QGstreamerBusMessageFilter *filter : std::as_const(busFilters)) {
114 if (filter->processBusMessage(message))
115 break;
116 }
117
118 return true;
119}
120
121void QGstBus::processAllPendingMessages()
122{
123 for (;;) {
124 bool messageHandled = processNextPendingMessage(GST_MESSAGE_ANY, std::chrono::nanoseconds{ 0 });
125
126 if (!messageHandled)
127 return;
128 }
129}
130
131GstBusSyncReply QGstBus::syncGstBusFilter(GstBus *bus, GstMessage *message, QGstBus *self)
132{
133 if (!message)
134 return GST_BUS_PASS;
135
136 QMutexLocker lock(&self->filterMutex);
137 Q_ASSERT(bus == self->get());
138
139 for (QGstreamerSyncMessageFilter *filter : std::as_const(self->syncFilters)) {
140 if (filter->processSyncMessage(QGstreamerMessage{ message, QGstreamerMessage::NeedsRef })) {
141 gst_message_unref(message);
142 return GST_BUS_DROP;
143 }
144 }
145
146 return GST_BUS_PASS;
147}
148
149QT_END_NAMESPACE
void close()
Definition qgst_bus.cpp:57
void removeMessageFilter(QGstreamerBusMessageFilter *)
Definition qgst_bus.cpp:88
bool processNextPendingMessage(GstMessageType type=GST_MESSAGE_ANY, std::optional< std::chrono::nanoseconds > timeout={})
Definition qgst_bus.cpp:94
void removeMessageFilter(QGstreamerSyncMessageFilter *)
Definition qgst_bus.cpp:74
QGstBus(GstBus *, QGstBusHandle::RefMode)
Definition qgst_bus.cpp:42
void installMessageFilter(QGstreamerSyncMessageFilter *)
Definition qgst_bus.cpp:66
void installMessageFilter(QGstreamerBusMessageFilter *)
Definition qgst_bus.cpp:81
Combined button and popup list for selecting options.