Title: [240930] trunk/Source/WebCore
Revision
240930
Author
you...@apple.com
Date
2019-02-04 10:47:23 -0800 (Mon, 04 Feb 2019)

Log Message

Make sure to remove the device observer in AVVideoCaptureSource
https://bugs.webkit.org/show_bug.cgi?id=194181
<rdar://problem/47739247>

Reviewed by Eric Carlson.

Make sure to remove the device observer when the observer is destroyed.
To simplify things, add the observer in AVVideoCaptureSource constructor and remove it in the destructor.

Make also sure the session observer is also removed whenever the session is released by AVVideoCaptureSource.

Covered by manual test.

       * platform/mediastream/mac/AVVideoCaptureSource.h:
* platform/mediastream/mac/AVVideoCaptureSource.mm:
(WebCore::AVVideoCaptureSource::AVVideoCaptureSource):
(WebCore::AVVideoCaptureSource::~AVVideoCaptureSource):
(WebCore::AVVideoCaptureSource::initializeSession):
(WebCore::AVVideoCaptureSource::clearSession):
(WebCore::AVVideoCaptureSource::stopProducingData):
(WebCore::AVVideoCaptureSource::setupSession):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (240929 => 240930)


--- trunk/Source/WebCore/ChangeLog	2019-02-04 18:19:10 UTC (rev 240929)
+++ trunk/Source/WebCore/ChangeLog	2019-02-04 18:47:23 UTC (rev 240930)
@@ -1,3 +1,27 @@
+2019-02-04  Youenn Fablet  <you...@apple.com>
+
+        Make sure to remove the device observer in AVVideoCaptureSource
+        https://bugs.webkit.org/show_bug.cgi?id=194181
+        <rdar://problem/47739247>
+
+        Reviewed by Eric Carlson.
+
+        Make sure to remove the device observer when the observer is destroyed.
+        To simplify things, add the observer in AVVideoCaptureSource constructor and remove it in the destructor.
+
+        Make also sure the session observer is also removed whenever the session is released by AVVideoCaptureSource.
+
+        Covered by manual test.
+
+       * platform/mediastream/mac/AVVideoCaptureSource.h:
+        * platform/mediastream/mac/AVVideoCaptureSource.mm:
+        (WebCore::AVVideoCaptureSource::AVVideoCaptureSource):
+        (WebCore::AVVideoCaptureSource::~AVVideoCaptureSource):
+        (WebCore::AVVideoCaptureSource::initializeSession):
+        (WebCore::AVVideoCaptureSource::clearSession):
+        (WebCore::AVVideoCaptureSource::stopProducingData):
+        (WebCore::AVVideoCaptureSource::setupSession):
+
 2019-02-04  Antoine Quint  <grao...@apple.com>
 
         Use a dedicated type instead of int32_t for pointer identifiers

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h (240929 => 240930)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2019-02-04 18:19:10 UTC (rev 240929)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2019-02-04 18:47:23 UTC (rev 240930)
@@ -73,6 +73,9 @@
     AVVideoCaptureSource(AVCaptureDevice*, String&& id, String&& hashSalt);
     virtual ~AVVideoCaptureSource();
 
+    void initializeSession();
+    void clearSession();
+
     bool setupSession();
     bool setupCaptureSession();
     void shutdownCaptureSession();

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm (240929 => 240930)


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2019-02-04 18:19:10 UTC (rev 240929)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2019-02-04 18:47:23 UTC (rev 240930)
@@ -181,6 +181,8 @@
     static_assert(static_cast<int>(InterruptionReason::VideoInUse) == AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient, "InterruptionReason::VideoInUse is not AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient as expected");
     static_assert(static_cast<int>(InterruptionReason::AudioInUse) == AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient, "InterruptionReason::AudioInUse is not AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient as expected");
 #endif
+
+    [m_device.get() addObserver:m_objcObserver.get() forKeyPath:@"suspended" options:NSKeyValueObservingOptionNew context:(void *)nil];
 }
 
 AVVideoCaptureSource::~AVVideoCaptureSource()
@@ -189,16 +191,31 @@
     RealtimeMediaSourceCenter::singleton().videoCaptureFactory().unsetActiveSource(*this);
 #endif
     [m_objcObserver disconnect];
+    [m_device removeObserver:m_objcObserver.get() forKeyPath:@"suspended"];
 
     if (!m_session)
         return;
 
-    [m_session removeObserver:m_objcObserver.get() forKeyPath:@"running"];
-    [m_device removeObserver:m_objcObserver.get() forKeyPath:@"suspended"];
     if ([m_session isRunning])
         [m_session stopRunning];
+
+    clearSession();
 }
 
+void AVVideoCaptureSource::initializeSession()
+{
+    ASSERT(!m_session);
+    m_session = adoptNS([allocAVCaptureSessionInstance() init]);
+    [m_session addObserver:m_objcObserver.get() forKeyPath:@"running" options:NSKeyValueObservingOptionNew context:(void *)nil];
+}
+
+void AVVideoCaptureSource::clearSession()
+{
+    ASSERT(m_session);
+    [m_session removeObserver:m_objcObserver.get() forKeyPath:@"running"];
+    m_session = nullptr;
+}
+
 void AVVideoCaptureSource::startProducingData()
 {
     if (!m_session) {
@@ -225,7 +242,7 @@
 
     m_interruption = InterruptionReason::None;
 #if PLATFORM(IOS_FAMILY)
-    m_session = nullptr;
+    clearSession();
 #endif
 }
 
@@ -409,9 +426,7 @@
     if (m_session)
         return true;
 
-    m_session = adoptNS([allocAVCaptureSessionInstance() init]);
-    [m_session addObserver:m_objcObserver.get() forKeyPath:@"running" options:NSKeyValueObservingOptionNew context:(void *)nil];
-    [m_device addObserver:m_objcObserver.get() forKeyPath:@"suspended" options:NSKeyValueObservingOptionNew context:(void *)nil];
+    initializeSession();
 
     [m_session beginConfiguration];
     bool success = setupCaptureSession();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to