Title: [275878] trunk/Source/WebCore
Revision
275878
Author
[email protected]
Date
2021-04-13 03:53:00 -0700 (Tue, 13 Apr 2021)

Log Message

[GStreamer] CaptureDevice monitoring is not implemented
https://bugs.webkit.org/show_bug.cgi?id=222889

Patch by Philippe Normand <[email protected]> on 2021-04-13
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:

Modified Paths

Diff

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;
 };
 
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to