Modified: trunk/Source/WebCore/ChangeLog (275877 => 275878)
--- trunk/Source/WebCore/ChangeLog 2021-04-13 10:26:17 UTC (rev 275877)
+++ trunk/Source/WebCore/ChangeLog 2021-04-13 10:53:00 UTC (rev 275878)
@@ -1,3 +1,21 @@
+2021-04-13 Philippe Normand <[email protected]>
+
+ [GStreamer] CaptureDevice monitoring is not implemented
+ https://bugs.webkit.org/show_bug.cgi?id=222889
+
+ Reviewed by Xabier Rodriguez-Calvar.
+
+ GStreamer capture device events are notified through a message bus associated to the the
+ GstDeviceMonitor, so we need to watch out for those messages and notify the
+ RealtimeSourceMediaCenter accordingly.
+
+ * platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp:
+ (WebCore::GStreamerCaptureDeviceManager::~GStreamerCaptureDeviceManager):
+ (WebCore::GStreamerCaptureDeviceManager::captureDevices):
+ (WebCore::GStreamerCaptureDeviceManager::addDevice):
+ (WebCore::GStreamerCaptureDeviceManager::refreshCaptureDevices):
+ * platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.h:
+
2021-04-13 Frédéric Wang <[email protected]>
ASSERTION FAILED: !m_needExceptionCheck in RTCPeerConnection::CertificateParameters
Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp (275877 => 275878)
--- trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp 2021-04-13 10:26:17 UTC (rev 275877)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.cpp 2021-04-13 10:53:00 UTC (rev 275878)
@@ -28,6 +28,9 @@
namespace WebCore {
+GST_DEBUG_CATEGORY(webkitGStreamerCaptureDeviceManagerDebugCategory);
+#define GST_CAT_DEFAULT webkitGStreamerCaptureDeviceManagerDebugCategory
+
static gint sortDevices(gconstpointer a, gconstpointer b)
{
GstDevice* adev = GST_DEVICE(a), *bdev = GST_DEVICE(b);
@@ -66,6 +69,12 @@
return manager;
}
+GStreamerCaptureDeviceManager::~GStreamerCaptureDeviceManager()
+{
+ if (m_deviceMonitor)
+ gst_device_monitor_stop(m_deviceMonitor.get());
+}
+
Optional<GStreamerCaptureDevice> GStreamerCaptureDeviceManager::gstreamerDeviceWithUID(const String& deviceID)
{
captureDevices();
@@ -80,6 +89,10 @@
const Vector<CaptureDevice>& GStreamerCaptureDeviceManager::captureDevices()
{
ensureGStreamerInitialized();
+ static std::once_flag onceFlag;
+ std::call_once(onceFlag, [] {
+ GST_DEBUG_CATEGORY_INIT(webkitGStreamerCaptureDeviceManagerDebugCategory, "webkitcapturedevicemanager", 0, "WebKit Capture Device Manager");
+ });
if (m_devices.isEmpty())
refreshCaptureDevices();
@@ -105,6 +118,7 @@
// This isn't really a UID but should be good enough (libwebrtc
// itself does that at least for pulseaudio devices).
GUniquePtr<char> deviceName(gst_device_get_display_name(device.get()));
+ GST_INFO("Registering device %s", deviceName.get());
gboolean isDefault = FALSE;
gst_structure_get_boolean(properties.get(), "is-default", &isDefault);
@@ -121,37 +135,71 @@
void GStreamerCaptureDeviceManager::refreshCaptureDevices()
{
+ m_devices.clear();
if (!m_deviceMonitor) {
m_deviceMonitor = adoptGRef(gst_device_monitor_new());
- CaptureDevice::DeviceType type = deviceType();
- if (type == CaptureDevice::DeviceType::Camera) {
- GRefPtr<GstCaps> caps = adoptGRef(gst_caps_new_empty_simple("video/x-raw"));
+ switch (deviceType()) {
+ case CaptureDevice::DeviceType::Camera: {
+ auto caps = adoptGRef(gst_caps_new_empty_simple("video/x-raw"));
gst_device_monitor_add_filter(m_deviceMonitor.get(), "Video/Source", caps.get());
- } else if (type == CaptureDevice::DeviceType::Microphone) {
- GRefPtr<GstCaps> caps = adoptGRef(gst_caps_new_empty_simple("audio/x-raw"));
+ break;
+ }
+ case CaptureDevice::DeviceType::Microphone: {
+ auto caps = adoptGRef(gst_caps_new_empty_simple("audio/x-raw"));
gst_device_monitor_add_filter(m_deviceMonitor.get(), "Audio/Source", caps.get());
- } else
+ break;
+ }
+ case CaptureDevice::DeviceType::Speaker:
+ // FIXME: Add Audio/Sink filter. See https://bugs.webkit.org/show_bug.cgi?id=216880
+ case CaptureDevice::DeviceType::Screen:
+ case CaptureDevice::DeviceType::Window:
+ break;
+ case CaptureDevice::DeviceType::Unknown:
return;
- }
+ }
- // FIXME: Add monitor for added/removed messages on the bus.
- if (!gst_device_monitor_start(m_deviceMonitor.get())) {
- GST_WARNING_OBJECT(m_deviceMonitor.get(), "Could not start device monitor");
- m_deviceMonitor = nullptr;
+ auto bus = adoptGRef(gst_device_monitor_get_bus(m_deviceMonitor.get()));
+ gst_bus_add_watch(bus.get(), reinterpret_cast<GstBusFunc>(+[](GstBus*, GstMessage* message, GStreamerCaptureDeviceManager* manager) -> gboolean {
+#ifndef GST_DISABLE_GST_DEBUG
+ GRefPtr<GstDevice> device;
+ GUniquePtr<char> name;
+#endif
+ switch (GST_MESSAGE_TYPE(message)) {
+ case GST_MESSAGE_DEVICE_ADDED:
+#ifndef GST_DISABLE_GST_DEBUG
+ gst_message_parse_device_added(message, &device.outPtr());
+ name.reset(gst_device_get_display_name(device.get()));
+ GST_INFO("Device added: %s", name.get());
+#endif
+ manager->deviceChanged();
+ break;
+ case GST_MESSAGE_DEVICE_REMOVED:
+#ifndef GST_DISABLE_GST_DEBUG
+ gst_message_parse_device_removed(message, &device.outPtr());
+ name.reset(gst_device_get_display_name(device.get()));
+ GST_INFO("Device removed: %s", name.get());
+#endif
+ manager->deviceChanged();
+ break;
+ default:
+ break;
+ }
+ return G_SOURCE_CONTINUE;
+ }), this);
- return;
+ if (!gst_device_monitor_start(m_deviceMonitor.get())) {
+ GST_WARNING_OBJECT(m_deviceMonitor.get(), "Could not start device monitor");
+ m_deviceMonitor = nullptr;
+ return;
+ }
}
GList* devices = g_list_sort(gst_device_monitor_get_devices(m_deviceMonitor.get()), sortDevices);
while (devices) {
- GRefPtr<GstDevice> device = adoptGRef(GST_DEVICE_CAST(devices->data));
-
- addDevice(WTFMove(device));
+ addDevice(GST_DEVICE_CAST(devices->data));
devices = g_list_delete_link(devices, devices);
}
-
- gst_device_monitor_stop(m_deviceMonitor.get());
}
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.h (275877 => 275878)
--- trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.h 2021-04-13 10:26:17 UTC (rev 275877)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerCaptureDeviceManager.h 2021-04-13 10:53:00 UTC (rev 275878)
@@ -32,6 +32,7 @@
class GStreamerCaptureDeviceManager : public CaptureDeviceManager {
public:
+ ~GStreamerCaptureDeviceManager();
Optional<GStreamerCaptureDevice> gstreamerDeviceWithUID(const String&);
const Vector<CaptureDevice>& captureDevices() final;
@@ -53,7 +54,6 @@
CaptureDevice::DeviceType deviceType() final { return CaptureDevice::DeviceType::Microphone; }
private:
GStreamerAudioCaptureDeviceManager() = default;
- ~GStreamerAudioCaptureDeviceManager() = default;
};
class GStreamerVideoCaptureDeviceManager final : public GStreamerCaptureDeviceManager {
@@ -64,7 +64,6 @@
CaptureDevice::DeviceType deviceType() final { return CaptureDevice::DeviceType::Camera; }
private:
GStreamerVideoCaptureDeviceManager() = default;
- ~GStreamerVideoCaptureDeviceManager() = default;
};
class GStreamerDisplayCaptureDeviceManager final : public GStreamerCaptureDeviceManager {
@@ -74,7 +73,6 @@
CaptureDevice::DeviceType deviceType() final { return CaptureDevice::DeviceType::Screen; }
private:
GStreamerDisplayCaptureDeviceManager() = default;
- ~GStreamerDisplayCaptureDeviceManager() = default;
};
}