6#include <QtMultimedia/private/qcameradevice_p.h>
7#include <QtMultimedia/private/qpipewire_async_support_p.h>
8#include <QtMultimedia/private/qpipewire_cameracontextmanager_p.h>
9#include <QtMultimedia/private/qpipewire_cameranode_p.h>
10#include <QtMultimedia/private/qmultimedia_ranges_p.h>
11#include <QtCore/qcoreapplication.h>
12#include <QtCore/qloggingcategory.h>
13#include <QtCore/qthread.h>
15#include <spa/param/param.h>
95std::vector<SpaObjectVideoFormat> enumerateNodeFormats(QCameraContextManager &context,
98 using namespace std::chrono_literals;
99 QPipeWireInstance &pwInstance = context.pwInstance();
101 auto formats = std::make_shared<std::vector<SpaObjectVideoFormat>>();
103 auto onParam = [formats](
int , uint32_t , uint32_t , uint32_t ,
104 const spa_pod *param) {
105 if (std::optional<SpaObjectVideoFormat> format = SpaObjectVideoFormat::parse(param))
106 formats->push_back(
std::move(*format));
109 std::optional<NodeEventListener> listener;
111 pwInstance.runWithEventLoopLock([&] {
112 listener.emplace(context.bindNode(node),
113 NodeEventListener::NodeHandler{
117 listener->enumParams(SPA_PARAM_EnumFormat);
120 CoreEventSyncHelper sync;
122 auto syncOrErr = sync.sync(context.coreConnection().get(), 3s);
123 if (syncOrErr !=
true)
124 qCWarning(lcPipewireCameraMonitor) <<
"timed out enumerating the formats of node" << node;
130 return std::move(*formats);
Q_STATIC_LOGGING_CATEGORY(lcPipewireAudioSink, "qt.multimedia.pipewire.audiosink")