Title: [235549] trunk/Source/WebCore
Revision
235549
Author
eric.carl...@apple.com
Date
2018-08-31 05:43:31 -0700 (Fri, 31 Aug 2018)

Log Message

[MediaStream] Remove AVMediaCaptureSource
https://bugs.webkit.org/show_bug.cgi?id=189159

Reviewed by Youenn Fablet.

No new tests, no change in functionality.

Refactor video capture to get rid of a base class we don't
need any more.

* WebCore.xcodeproj/project.pbxproj:
* platform/mediastream/mac/AVMediaCaptureSource.h: Removed.
* platform/mediastream/mac/AVMediaCaptureSource.mm: Removed.
* platform/mediastream/mac/AVVideoCaptureSource.h:
(WebCore::AVVideoCaptureSource::session const):
(WebCore::AVVideoCaptureSource::device const):
* platform/mediastream/mac/AVVideoCaptureSource.mm:
(WebCore::globaVideoCaptureSerialQueue):
(WebCore::AVVideoCaptureSource::AVVideoCaptureSource):
(WebCore::AVVideoCaptureSource::~AVVideoCaptureSource):
(WebCore::AVVideoCaptureSource::startProducingData):
(WebCore::AVVideoCaptureSource::stopProducingData):
(WebCore::AVVideoCaptureSource::beginConfiguration):
(WebCore::AVVideoCaptureSource::commitConfiguration):
(WebCore::AVVideoCaptureSource::settingsDidChange):
(WebCore::AVVideoCaptureSource::settings const):
(WebCore::AVVideoCaptureSource::capabilities const):
(WebCore::AVVideoCaptureSource::setPreset):
(WebCore::AVVideoCaptureSource::setupSession):
(WebCore::AVVideoCaptureSource::setupCaptureSession):
(WebCore::AVVideoCaptureSource::captureSessionIsRunningDidChange):
(WebCore::AVVideoCaptureSource::interrupted const):
(WebCore::AVVideoCaptureSource::captureSessionRuntimeError):
(WebCore::AVVideoCaptureSource::captureSessionBeginInterruption):
(WebCore::AVVideoCaptureSource::captureSessionEndInterruption):
(-[WebCoreAVVideoCaptureSourceObserver initWithCallback:]):
(-[WebCoreAVVideoCaptureSourceObserver disconnect]):
(-[WebCoreAVVideoCaptureSourceObserver addNotificationObservers]):
(-[WebCoreAVVideoCaptureSourceObserver removeNotificationObservers]):
(-[WebCoreAVVideoCaptureSourceObserver captureOutput:didOutputSampleBuffer:fromConnection:]):
(-[WebCoreAVVideoCaptureSourceObserver observeValueForKeyPath:ofObject:change:context:]):
(-[WebCoreAVVideoCaptureSourceObserver sessionRuntimeError:]):
(-[WebCoreAVVideoCaptureSourceObserver beginSessionInterrupted:]):
(-[WebCoreAVVideoCaptureSourceObserver endSessionInterrupted:]):
(WebCore::AVVideoCaptureSource::initializeCapabilities): Deleted.
(WebCore::AVVideoCaptureSource::initializeSupportedConstraints): Deleted.
(WebCore::AVVideoCaptureSource::updateSettings): Deleted.

Modified Paths

Removed Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (235548 => 235549)


--- trunk/Source/WebCore/ChangeLog	2018-08-31 12:02:46 UTC (rev 235548)
+++ trunk/Source/WebCore/ChangeLog	2018-08-31 12:43:31 UTC (rev 235549)
@@ -1,3 +1,53 @@
+2018-08-31  Eric Carlson  <eric.carl...@apple.com>
+
+        [MediaStream] Remove AVMediaCaptureSource
+        https://bugs.webkit.org/show_bug.cgi?id=189159
+
+        Reviewed by Youenn Fablet.
+
+        No new tests, no change in functionality.
+
+        Refactor video capture to get rid of a base class we don't 
+        need any more.
+
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/mediastream/mac/AVMediaCaptureSource.h: Removed.
+        * platform/mediastream/mac/AVMediaCaptureSource.mm: Removed.
+        * platform/mediastream/mac/AVVideoCaptureSource.h:
+        (WebCore::AVVideoCaptureSource::session const):
+        (WebCore::AVVideoCaptureSource::device const):
+        * platform/mediastream/mac/AVVideoCaptureSource.mm:
+        (WebCore::globaVideoCaptureSerialQueue):
+        (WebCore::AVVideoCaptureSource::AVVideoCaptureSource):
+        (WebCore::AVVideoCaptureSource::~AVVideoCaptureSource):
+        (WebCore::AVVideoCaptureSource::startProducingData):
+        (WebCore::AVVideoCaptureSource::stopProducingData):
+        (WebCore::AVVideoCaptureSource::beginConfiguration):
+        (WebCore::AVVideoCaptureSource::commitConfiguration):
+        (WebCore::AVVideoCaptureSource::settingsDidChange):
+        (WebCore::AVVideoCaptureSource::settings const):
+        (WebCore::AVVideoCaptureSource::capabilities const):
+        (WebCore::AVVideoCaptureSource::setPreset):
+        (WebCore::AVVideoCaptureSource::setupSession):
+        (WebCore::AVVideoCaptureSource::setupCaptureSession):
+        (WebCore::AVVideoCaptureSource::captureSessionIsRunningDidChange):
+        (WebCore::AVVideoCaptureSource::interrupted const):
+        (WebCore::AVVideoCaptureSource::captureSessionRuntimeError):
+        (WebCore::AVVideoCaptureSource::captureSessionBeginInterruption):
+        (WebCore::AVVideoCaptureSource::captureSessionEndInterruption):
+        (-[WebCoreAVVideoCaptureSourceObserver initWithCallback:]):
+        (-[WebCoreAVVideoCaptureSourceObserver disconnect]):
+        (-[WebCoreAVVideoCaptureSourceObserver addNotificationObservers]):
+        (-[WebCoreAVVideoCaptureSourceObserver removeNotificationObservers]):
+        (-[WebCoreAVVideoCaptureSourceObserver captureOutput:didOutputSampleBuffer:fromConnection:]):
+        (-[WebCoreAVVideoCaptureSourceObserver observeValueForKeyPath:ofObject:change:context:]):
+        (-[WebCoreAVVideoCaptureSourceObserver sessionRuntimeError:]):
+        (-[WebCoreAVVideoCaptureSourceObserver beginSessionInterrupted:]):
+        (-[WebCoreAVVideoCaptureSourceObserver endSessionInterrupted:]):
+        (WebCore::AVVideoCaptureSource::initializeCapabilities): Deleted.
+        (WebCore::AVVideoCaptureSource::initializeSupportedConstraints): Deleted.
+        (WebCore::AVVideoCaptureSource::updateSettings): Deleted.
+
 2018-08-31  Philippe Normand  <pnorm...@igalia.com>
 
         Unreviewed, GTK Ubuntu LTS build fix after r235543.

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (235548 => 235549)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-08-31 12:02:46 UTC (rev 235548)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2018-08-31 12:43:31 UTC (rev 235549)
@@ -72,8 +72,6 @@
 		070334D9145A006F008D8D45 /* TrackBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 070334D8145A006F008D8D45 /* TrackBase.cpp */; };
 		070363E2181A1CDC00C074A5 /* AVCaptureDeviceManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 070363DA181A1CDC00C074A5 /* AVCaptureDeviceManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		070363E3181A1CDC00C074A5 /* AVCaptureDeviceManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 070363DB181A1CDC00C074A5 /* AVCaptureDeviceManager.mm */; };
-		070363E4181A1CDC00C074A5 /* AVMediaCaptureSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 070363DC181A1CDC00C074A5 /* AVMediaCaptureSource.h */; };
-		070363E5181A1CDC00C074A5 /* AVMediaCaptureSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 070363DD181A1CDC00C074A5 /* AVMediaCaptureSource.mm */; };
 		070363E6181A1CDC00C074A5 /* AVVideoCaptureSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 070363DE181A1CDC00C074A5 /* AVVideoCaptureSource.h */; };
 		070363E7181A1CDC00C074A5 /* AVVideoCaptureSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 070363DF181A1CDC00C074A5 /* AVVideoCaptureSource.mm */; };
 		0704A4081D6DE9F10086DCDB /* OverconstrainedError.h in Headers */ = {isa = PBXBuildFile; fileRef = 0704A4051D6DE9F10086DCDB /* OverconstrainedError.h */; };
@@ -5179,8 +5177,6 @@
 		070334E8145A1F35008D8D45 /* JSTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSTrackCustom.cpp; sourceTree = "<group>"; };
 		070363DA181A1CDC00C074A5 /* AVCaptureDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVCaptureDeviceManager.h; sourceTree = "<group>"; };
 		070363DB181A1CDC00C074A5 /* AVCaptureDeviceManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVCaptureDeviceManager.mm; sourceTree = "<group>"; };
-		070363DC181A1CDC00C074A5 /* AVMediaCaptureSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVMediaCaptureSource.h; sourceTree = "<group>"; };
-		070363DD181A1CDC00C074A5 /* AVMediaCaptureSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVMediaCaptureSource.mm; sourceTree = "<group>"; };
 		070363DE181A1CDC00C074A5 /* AVVideoCaptureSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AVVideoCaptureSource.h; sourceTree = "<group>"; };
 		070363DF181A1CDC00C074A5 /* AVVideoCaptureSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AVVideoCaptureSource.mm; sourceTree = "<group>"; };
 		0704A4031D6DE9F10086DCDB /* OverconstrainedError.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = OverconstrainedError.idl; sourceTree = "<group>"; };
@@ -15218,8 +15214,6 @@
 				07C046C61E42512F007201E7 /* AudioTrackPrivateMediaStreamCocoa.h */,
 				070363DA181A1CDC00C074A5 /* AVCaptureDeviceManager.h */,
 				070363DB181A1CDC00C074A5 /* AVCaptureDeviceManager.mm */,
-				070363DC181A1CDC00C074A5 /* AVMediaCaptureSource.h */,
-				070363DD181A1CDC00C074A5 /* AVMediaCaptureSource.mm */,
 				070363DE181A1CDC00C074A5 /* AVVideoCaptureSource.h */,
 				070363DF181A1CDC00C074A5 /* AVVideoCaptureSource.mm */,
 				3F8020311E9E381D00DEC61D /* CoreAudioCaptureDevice.cpp */,
@@ -24566,10 +24560,10 @@
 		CD669D651D232DF4004D1866 /* cocoa */ = {
 			isa = PBXGroup;
 			children = (
+				CD669D661D232DFF004D1866 /* MediaSessionManagerCocoa.cpp */,
+				CD227E362113AEFA00D285AF /* MediaSessionManagerCocoa.h */,
 				CDE667A21E4BBF1500E8154A /* WebAudioBufferList.cpp */,
 				CDE667A31E4BBF1500E8154A /* WebAudioBufferList.h */,
-				CD669D661D232DFF004D1866 /* MediaSessionManagerCocoa.cpp */,
-				CD227E362113AEFA00D285AF /* MediaSessionManagerCocoa.h */,
 			);
 			name = cocoa;
 			sourceTree = "<group>";
@@ -27123,7 +27117,6 @@
 				CDC675231EAEA9B700727C84 /* AVAudioSessionCaptureDeviceManager.h in Headers */,
 				070363E2181A1CDC00C074A5 /* AVCaptureDeviceManager.h in Headers */,
 				07F4E93320B3587F002E3803 /* AVFoundationMIMETypeCache.h in Headers */,
-				070363E4181A1CDC00C074A5 /* AVMediaCaptureSource.h in Headers */,
 				CD336F6217F9F64700DDDCD0 /* AVTrackPrivateAVFObjCImpl.h in Headers */,
 				070363E6181A1CDC00C074A5 /* AVVideoCaptureSource.h in Headers */,
 				F45C231E1995B73B00A6E2E3 /* AxisScrollSnapOffsets.h in Headers */,
@@ -27279,7 +27272,6 @@
 				FB92DF4B15FED08700994433 /* ClipPathOperation.h in Headers */,
 				580371621A66F00A00BAF519 /* ClipRect.h in Headers */,
 				97AABD1314FA09D5007457AE /* CloseEvent.h in Headers */,
-				CDE667A51E4BBF1500E8154A /* WebAudioBufferList.h in Headers */,
 				C0C054CB1118C8E400CE2636 /* CodeGenerator.pm in Headers */,
 				BC5EB5DF0E81B9AB00B25965 /* CollapsedBorderValue.h in Headers */,
 				E425A49A18292B840020CFCF /* CollectionIndexCache.h in Headers */,
@@ -30772,6 +30764,7 @@
 				7132445120109DA500AE7FB2 /* WebAnimationUtilities.h in Headers */,
 				E18536841F4E481400FE091B /* WebArchiveResourceFromNSAttributedString.h in Headers */,
 				E18C35441F71970C00FF632D /* WebArchiveResourceWebResourceHandler.h in Headers */,
+				CDE667A51E4BBF1500E8154A /* WebAudioBufferList.h in Headers */,
 				41B2A6261EF1BF6D002B9D7A /* WebAudioSourceProvider.h in Headers */,
 				07D637401BB0B11300256CE9 /* WebAudioSourceProviderAVFObjC.h in Headers */,
 				1F36EA9C1E21BA1700621E25 /* WebBackgroundTaskController.h in Headers */,
@@ -31356,7 +31349,6 @@
 				CDC675221EAEA9B700727C84 /* AVAudioSessionCaptureDeviceManager.mm in Sources */,
 				070363E3181A1CDC00C074A5 /* AVCaptureDeviceManager.mm in Sources */,
 				0719427F1D088F21002AA51D /* AVFoundationMIMETypeCache.mm in Sources */,
-				070363E5181A1CDC00C074A5 /* AVMediaCaptureSource.mm in Sources */,
 				CD336F6117F9F64700DDDCD0 /* AVTrackPrivateAVFObjCImpl.mm in Sources */,
 				070363E7181A1CDC00C074A5 /* AVVideoCaptureSource.mm in Sources */,
 				7A45032F18DB717200377B34 /* BufferedLineReader.cpp in Sources */,
@@ -31370,7 +31362,6 @@
 				CDDE02ED18B3ED6D00CF7FF1 /* CDMSessionAVFoundationObjC.mm in Sources */,
 				CDDE02F018B5651300CF7FF1 /* CDMSessionAVStreamSession.mm in Sources */,
 				CDE5959D1BF2757100A1CBE8 /* CDMSessionMediaSourceAVFObjC.mm in Sources */,
-				CDE667A41E4BBF1500E8154A /* WebAudioBufferList.cpp in Sources */,
 				A14090FB1AA51E1D0091191A /* ContentFilterUnblockHandlerCocoa.mm in Sources */,
 				07AFF4231EFB144900B545B3 /* CoreAudioCaptureSourceIOS.mm in Sources */,
 				46C696CC1E7205FC00597937 /* CPUMonitor.cpp in Sources */,
@@ -32099,6 +32090,7 @@
 				A14832B9187F63D500DA63A6 /* WAKView.mm in Sources */,
 				DE5F861E1FA281FD006DB63A /* WebAccessibilityObjectWrapperBase.mm in Sources */,
 				DE5F861D1FA2815B006DB63A /* WebAccessibilityObjectWrapperMac.mm in Sources */,
+				CDE667A41E4BBF1500E8154A /* WebAudioBufferList.cpp in Sources */,
 				CD7E05221651C28200C1201F /* WebCoreAVFResourceLoader.mm in Sources */,
 				CD225C0B1C46FBF400140761 /* WebCoreNSURLSession.mm in Sources */,
 				93F19B0708245E59001E9ABC /* WebCoreView.m in Sources */,

Modified: trunk/Source/WebCore/platform/OrientationNotifier.h (235548 => 235549)


--- trunk/Source/WebCore/platform/OrientationNotifier.h	2018-08-31 12:02:46 UTC (rev 235548)
+++ trunk/Source/WebCore/platform/OrientationNotifier.h	2018-08-31 12:43:31 UTC (rev 235549)
@@ -25,6 +25,8 @@
 
 #pragma once
 
+#include <wtf/Vector.h>
+
 namespace WebCore {
 
 class OrientationNotifier {

Modified: trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm (235548 => 235549)


--- trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm	2018-08-31 12:02:46 UTC (rev 235548)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVCaptureDeviceManager.mm	2018-08-31 12:43:31 UTC (rev 235549)
@@ -28,7 +28,6 @@
 
 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
 
-#import "AVMediaCaptureSource.h"
 #import "AVVideoCaptureSource.h"
 #import "AudioSourceProvider.h"
 #import "Logging.h"
@@ -55,10 +54,6 @@
 SOFT_LINK_CONSTANT(AVFoundation, AVMediaTypeAudio, NSString *)
 SOFT_LINK_CONSTANT(AVFoundation, AVMediaTypeMuxed, NSString *)
 SOFT_LINK_CONSTANT(AVFoundation, AVMediaTypeVideo, NSString *)
-SOFT_LINK_CONSTANT(AVFoundation, AVCaptureSessionPreset1280x720, NSString *)
-SOFT_LINK_CONSTANT(AVFoundation, AVCaptureSessionPreset640x480, NSString *)
-SOFT_LINK_CONSTANT(AVFoundation, AVCaptureSessionPreset352x288, NSString *)
-SOFT_LINK_CONSTANT(AVFoundation, AVCaptureSessionPresetLow, NSString *)
 SOFT_LINK_CONSTANT(AVFoundation, AVCaptureDeviceWasConnectedNotification, NSString *)
 SOFT_LINK_CONSTANT(AVFoundation, AVCaptureDeviceWasDisconnectedNotification, NSString *)
 
@@ -65,10 +60,6 @@
 #define AVMediaTypeAudio getAVMediaTypeAudio()
 #define AVMediaTypeMuxed getAVMediaTypeMuxed()
 #define AVMediaTypeVideo getAVMediaTypeVideo()
-#define AVCaptureSessionPreset1280x720 getAVCaptureSessionPreset1280x720()
-#define AVCaptureSessionPreset640x480 getAVCaptureSessionPreset640x480()
-#define AVCaptureSessionPreset352x288 getAVCaptureSessionPreset352x288()
-#define AVCaptureSessionPresetLow getAVCaptureSessionPresetLow()
 #define AVCaptureDeviceWasConnectedNotification getAVCaptureDeviceWasConnectedNotification()
 #define AVCaptureDeviceWasDisconnectedNotification getAVCaptureDeviceWasDisconnectedNotification()
 

Deleted: trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h (235548 => 235549)


--- trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2018-08-31 12:02:46 UTC (rev 235548)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVMediaCaptureSource.h	2018-08-31 12:43:31 UTC (rev 235549)
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef AVMediaCaptureSource_h
-#define AVMediaCaptureSource_h
-
-#if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
-
-#include "GenericTaskQueue.h"
-#include "RealtimeMediaSource.h"
-#include "Timer.h"
-#include <wtf/Function.h>
-
-OBJC_CLASS AVCaptureAudioDataOutput;
-OBJC_CLASS AVCaptureConnection;
-OBJC_CLASS AVCaptureDevice;
-OBJC_CLASS AVCaptureOutput;
-OBJC_CLASS AVCaptureSession;
-OBJC_CLASS AVCaptureVideoDataOutput;
-OBJC_CLASS NSError;
-OBJC_CLASS NSNotification;
-OBJC_CLASS WebCoreAVMediaCaptureSourceObserver;
-
-typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
-
-namespace WebCore {
-
-class AVMediaCaptureSource;
-
-class AVMediaCaptureSource : public RealtimeMediaSource {
-public:
-    virtual ~AVMediaCaptureSource();
-
-    virtual void captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutput*, CMSampleBufferRef, AVCaptureConnection*) = 0;
-
-    void captureSessionIsRunningDidChange(bool);
-    void captureSessionRuntimeError(RetainPtr<NSError>);
-
-    enum class InterruptionReason { None, VideoNotAllowedInBackground, AudioInUse, VideoInUse, VideoNotAllowedInSideBySide };
-    void captureSessionBeginInterruption(RetainPtr<NSNotification>);
-    void captureSessionEndInterruption(RetainPtr<NSNotification>);
-
-    AVCaptureSession *session() const { return m_session.get(); }
-
-    const RealtimeMediaSourceSettings& settings() const final;
-
-    void startProducingData() final;
-    void stopProducingData() final;
-
-protected:
-    AVMediaCaptureSource(AVCaptureDevice*, const AtomicString&, RealtimeMediaSource::Type);
-
-    virtual bool setupCaptureSession() = 0;
-    virtual void shutdownCaptureSession() = 0;
-    virtual void updateSettings(RealtimeMediaSourceSettings&) = 0;
-    virtual void initializeCapabilities(RealtimeMediaSourceCapabilities&) = 0;
-    virtual void initializeSupportedConstraints(RealtimeMediaSourceSupportedConstraints&) = 0;
-
-    AVCaptureDevice *device() const { return m_device.get(); }
-
-    RealtimeMediaSourceSupportedConstraints& supportedConstraints();
-    const RealtimeMediaSourceCapabilities& capabilities() const final;
-
-    void setVideoSampleBufferDelegate(AVCaptureVideoDataOutput*);
-    void setAudioSampleBufferDelegate(AVCaptureAudioDataOutput*);
-
-private:
-    bool setupSession();
-
-    void beginConfiguration() final;
-    void commitConfiguration() final;
-
-    bool isCaptureSource() const final { return true; }
-
-    bool interrupted() const final;
-
-    void initializeSettings();
-    void initializeCapabilities();
-
-    RealtimeMediaSourceSettings m_currentSettings;
-    RealtimeMediaSourceSupportedConstraints m_supportedConstraints;
-    RetainPtr<WebCoreAVMediaCaptureSourceObserver> m_objcObserver;
-    std::unique_ptr<RealtimeMediaSourceCapabilities> m_capabilities;
-    RetainPtr<AVCaptureSession> m_session;
-    RetainPtr<AVCaptureDevice> m_device;
-    InterruptionReason m_interruption { InterruptionReason::None };
-    bool m_isRunning { false };
-};
-
-} // namespace WebCore
-
-#endif // ENABLE(MEDIA_STREAM)
-
-#endif // AVMediaCaptureSource_h

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


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2018-08-31 12:02:46 UTC (rev 235548)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.h	2018-08-31 12:43:31 UTC (rev 235549)
@@ -27,23 +27,24 @@
 
 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
 
-#include "AVMediaCaptureSource.h"
 #include "OrientationNotifier.h"
+#include "RealtimeMediaSource.h"
+#include <wtf/text/StringHash.h>
 
-OBJC_CLASS CALayer;
-OBJC_CLASS AVFrameRateRange;
+typedef struct opaqueCMSampleBuffer* CMSampleBufferRef;
 
-typedef struct CGImage *CGImageRef;
-typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
-typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
+OBJC_CLASS AVCaptureConnection;
+OBJC_CLASS AVCaptureDevice;
+OBJC_CLASS AVCaptureOutput;
+OBJC_CLASS AVCaptureSession;
+OBJC_CLASS AVCaptureVideoDataOutput;
+OBJC_CLASS NSError;
+OBJC_CLASS NSNotification;
+OBJC_CLASS WebCoreAVVideoCaptureSourceObserver;
 
 namespace WebCore {
 
-class FloatRect;
-class GraphicsContext;
-class PixelBufferConformerCV;
-
-class AVVideoCaptureSource : public AVMediaCaptureSource, private OrientationNotifier::Observer {
+class AVVideoCaptureSource : public RealtimeMediaSource, private OrientationNotifier::Observer {
 public:
     static CaptureSourceOrError create(const AtomicString&, const MediaConstraints*);
 
@@ -52,37 +53,51 @@
     int32_t width() const { return m_width; }
     int32_t height() const { return m_height; }
 
+    enum class InterruptionReason { None, VideoNotAllowedInBackground, AudioInUse, VideoInUse, VideoNotAllowedInSideBySide };
+    void captureSessionBeginInterruption(RetainPtr<NSNotification>);
+    void captureSessionEndInterruption(RetainPtr<NSNotification>);
+
+    AVCaptureSession* session() const { return m_session.get(); }
+
+    void captureSessionIsRunningDidChange(bool);
+    void captureSessionRuntimeError(RetainPtr<NSError>);
+    void captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutput*, CMSampleBufferRef, AVCaptureConnection*);
+
 private:
     AVVideoCaptureSource(AVCaptureDevice*, const AtomicString&);
     virtual ~AVVideoCaptureSource();
 
-    bool setupCaptureSession() final;
-    void shutdownCaptureSession() final;
+    bool setupSession();
+    bool setupCaptureSession();
+    void shutdownCaptureSession();
 
-    void updateSettings(RealtimeMediaSourceSettings&) final;
-
+    const RealtimeMediaSourceCapabilities& capabilities() const final;
     void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
     bool applySize(const IntSize&) final;
     bool applyFrameRate(double) final;
+    const RealtimeMediaSourceSettings& settings() const final;
+    void startProducingData() final;
+    void stopProducingData() final;
+    bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
+    void settingsDidChange() final;
+    void monitorOrientation(OrientationNotifier&) final;
+    void beginConfiguration() final;
+    void commitConfiguration() final;
+    bool isCaptureSource() const final { return true; }
+    bool interrupted() const final;
+
     bool setPreset(NSString*);
-
-    void monitorOrientation(OrientationNotifier&) final;
     void computeSampleRotation();
 
     bool isFrameRateSupported(double frameRate);
 
-    NSString *bestSessionPresetForVideoDimensions(std::optional<int> width, std::optional<int> height);
-    bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
+    NSString* bestSessionPresetForVideoDimensions(std::optional<int> width, std::optional<int> height);
 
-    void initializeCapabilities(RealtimeMediaSourceCapabilities&) final;
-    void initializeSupportedConstraints(RealtimeMediaSourceSupportedConstraints&) final;
-
     // OrientationNotifier::Observer API
     void orientationChanged(int orientation) final;
 
     bool setFrameRateConstraint(double minFrameRate, double maxFrameRate);
 
-    void captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutput*, CMSampleBufferRef, AVCaptureConnection*) final;
     void processNewFrame(RetainPtr<CMSampleBufferRef>, RetainPtr<AVCaptureConnection>);
     IntSize sizeForPreset(NSString*);
 
@@ -89,6 +104,8 @@
     using VideoPresetMap = HashMap<String, IntSize>;
     VideoPresetMap& videoPresets() { return m_supportedPresets; }
 
+    AVCaptureDevice* device() const { return m_device.get(); }
+
     RetainPtr<NSString> m_pendingPreset;
     RetainPtr<CMSampleBufferRef> m_buffer;
     RetainPtr<AVCaptureVideoDataOutput> m_videoOutput;
@@ -101,6 +118,15 @@
     MediaSample::VideoRotation m_sampleRotation { MediaSample::VideoRotation::None };
 
     VideoPresetMap m_supportedPresets;
+
+    mutable std::optional<RealtimeMediaSourceSettings> m_currentSettings;
+    mutable std::optional<RealtimeMediaSourceCapabilities> m_capabilities;
+    RetainPtr<WebCoreAVVideoCaptureSourceObserver> m_objcObserver;
+    RetainPtr<AVCaptureSession> m_session;
+    RetainPtr<AVCaptureDevice> m_device;
+    InterruptionReason m_interruption { InterruptionReason::None };
+    bool m_isRunning { false };
+
 };
 
 } // namespace WebCore

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


--- trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2018-08-31 12:02:46 UTC (rev 235548)
+++ trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm	2018-08-31 12:43:31 UTC (rev 235549)
@@ -28,30 +28,21 @@
 
 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
 
-#import "AVCaptureDeviceManager.h"
-#import "GraphicsContextCG.h"
 #import "ImageBuffer.h"
 #import "IntRect.h"
 #import "Logging.h"
 #import "MediaConstraints.h"
 #import "MediaSampleAVFObjC.h"
-#import "NotImplemented.h"
-#import "PixelBufferConformerCV.h"
 #import "PlatformLayer.h"
 #import "RealtimeMediaSourceCenterMac.h"
 #import "RealtimeMediaSourceSettings.h"
-#import "WebActionDisablingCALayerDelegate.h"
 #import <AVFoundation/AVCaptureDevice.h>
 #import <AVFoundation/AVCaptureInput.h>
 #import <AVFoundation/AVCaptureOutput.h>
 #import <AVFoundation/AVCaptureSession.h>
+#import <AVFoundation/AVError.h>
 #import <objc/runtime.h>
 
-#if PLATFORM(IOS)
-#include "WebCoreThread.h"
-#include "WebCoreThreadRun.h"
-#endif
-
 #import <pal/cf/CoreMediaSoftLink.h>
 #import "CoreVideoSoftLink.h"
 
@@ -62,6 +53,7 @@
 typedef AVCaptureOutput AVCaptureOutputType;
 typedef AVCaptureVideoDataOutput AVCaptureVideoDataOutputType;
 typedef AVFrameRateRange AVFrameRateRangeType;
+typedef AVCaptureSession AVCaptureSessionType;
 
 SOFT_LINK_FRAMEWORK_OPTIONAL(AVFoundation)
 
@@ -72,6 +64,7 @@
 SOFT_LINK_CLASS(AVFoundation, AVCaptureOutput)
 SOFT_LINK_CLASS(AVFoundation, AVCaptureVideoDataOutput)
 SOFT_LINK_CLASS(AVFoundation, AVFrameRateRange)
+SOFT_LINK_CLASS(AVFoundation, AVCaptureSession)
 
 #define AVCaptureConnection getAVCaptureConnectionClass()
 #define AVCaptureDevice getAVCaptureDeviceClass()
@@ -97,13 +90,40 @@
 #if PLATFORM(IOS)
 SOFT_LINK_CONSTANT_MAY_FAIL(AVFoundation, AVCaptureSessionPreset3840x2160, NSString *)
 SOFT_LINK_CONSTANT_MAY_FAIL(AVFoundation, AVCaptureSessionPreset1920x1080, NSString *)
+SOFT_LINK_POINTER_OPTIONAL(AVFoundation, AVCaptureSessionRuntimeErrorNotification, NSString *)
+SOFT_LINK_POINTER_OPTIONAL(AVFoundation, AVCaptureSessionWasInterruptedNotification, NSString *)
+SOFT_LINK_POINTER_OPTIONAL(AVFoundation, AVCaptureSessionInterruptionEndedNotification, NSString *)
+SOFT_LINK_POINTER_OPTIONAL(AVFoundation, AVCaptureSessionInterruptionReasonKey, NSString *)
+SOFT_LINK_POINTER_OPTIONAL(AVFoundation, AVCaptureSessionErrorKey, NSString *)
 
 #define AVCaptureSessionPreset3840x2160 getAVCaptureSessionPreset3840x2160()
 #define AVCaptureSessionPreset1920x1080 getAVCaptureSessionPreset1920x1080()
+#define AVCaptureSessionRuntimeErrorNotification getAVCaptureSessionRuntimeErrorNotification()
+#define AVCaptureSessionWasInterruptedNotification getAVCaptureSessionWasInterruptedNotification()
+#define AVCaptureSessionInterruptionEndedNotification getAVCaptureSessionInterruptionEndedNotification()
+#define AVCaptureSessionInterruptionReasonKey getAVCaptureSessionInterruptionReasonKey()
+#define AVCaptureSessionErrorKey getAVCaptureSessionErrorKey()
 #endif
 
 using namespace WebCore;
 
+@interface WebCoreAVVideoCaptureSourceObserver : NSObject<AVCaptureVideoDataOutputSampleBufferDelegate> {
+    AVVideoCaptureSource* m_callback;
+}
+
+-(id)initWithCallback:(AVVideoCaptureSource*)callback;
+-(void)disconnect;
+-(void)addNotificationObservers;
+-(void)removeNotificationObservers;
+-(void)captureOutput:(AVCaptureOutputType*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnectionType*)connection;
+-(void)observeValueForKeyPath:keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context;
+#if PLATFORM(IOS)
+-(void)sessionRuntimeError:(NSNotification*)notification;
+-(void)beginSessionInterrupted:(NSNotification*)notification;
+-(void)endSessionInterrupted:(NSNotification*)notification;
+#endif
+@end
+
 namespace WebCore {
 
 #if PLATFORM(MAC)
@@ -112,6 +132,16 @@
 const OSType videoCaptureFormat = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
 #endif
 
+static dispatch_queue_t globaVideoCaptureSerialQueue()
+{
+    static dispatch_queue_t globalQueue;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        globalQueue = dispatch_queue_create_with_target("WebCoreAVVideoCaptureSource video capture queue", DISPATCH_QUEUE_SERIAL, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));
+    });
+    return globalQueue;
+}
+
 CaptureSourceOrError AVVideoCaptureSource::create(const AtomicString& id, const MediaConstraints* constraints)
 {
     AVCaptureDeviceTypedef *device = [getAVCaptureDeviceClass() deviceWithUniqueID:id];
@@ -129,7 +159,9 @@
 }
 
 AVVideoCaptureSource::AVVideoCaptureSource(AVCaptureDeviceTypedef* device, const AtomicString& id)
-    : AVMediaCaptureSource(device, id, Type::Video)
+    : RealtimeMediaSource(id, Type::Video, device.localizedName)
+    , m_objcObserver(adoptNS([[WebCoreAVVideoCaptureSourceObserver alloc] initWithCallback:this]))
+    , m_device(device)
 {
     struct VideoPreset {
         bool symbolAvailable;
@@ -157,6 +189,15 @@
 
         presetsMap->add(String(preset.name), IntSize(preset.width, preset.height));
     }
+
+#if PLATFORM(IOS)
+    static_assert(static_cast<int>(InterruptionReason::VideoNotAllowedInBackground) == static_cast<int>(AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground), "InterruptionReason::VideoNotAllowedInBackground is not AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground as expected");
+    static_assert(static_cast<int>(InterruptionReason::VideoNotAllowedInSideBySide) == AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps, "InterruptionReason::VideoNotAllowedInSideBySide is not AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps as expected");
+    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
+
+    setPersistentID(String(device.uniqueID));
 }
 
 AVVideoCaptureSource::~AVVideoCaptureSource()
@@ -164,8 +205,47 @@
 #if PLATFORM(IOS)
     RealtimeMediaSourceCenterMac::videoCaptureSourceFactory().unsetActiveSource(*this);
 #endif
+    [m_objcObserver disconnect];
+
+    if (!m_session)
+        return;
+
+    [m_session removeObserver:m_objcObserver.get() forKeyPath:@"rate"];
+    if ([m_session isRunning])
+        [m_session stopRunning];
+
 }
 
+void AVVideoCaptureSource::startProducingData()
+{
+    if (!m_session) {
+        if (!setupSession())
+            return;
+    }
+
+    if ([m_session isRunning])
+        return;
+
+    [m_objcObserver addNotificationObservers];
+    [m_session startRunning];
+}
+
+void AVVideoCaptureSource::stopProducingData()
+{
+    if (!m_session)
+        return;
+
+    [m_objcObserver removeNotificationObservers];
+
+    if ([m_session isRunning])
+        [m_session stopRunning];
+
+    m_interruption = InterruptionReason::None;
+#if PLATFORM(IOS)
+    m_session = nullptr;
+#endif
+}
+
 static void updateSizeMinMax(int& min, int& max, int value)
 {
     min = std::min<int>(min, value);
@@ -178,8 +258,65 @@
     max = std::max<double>(max, value);
 }
 
-void AVVideoCaptureSource::initializeCapabilities(RealtimeMediaSourceCapabilities& capabilities)
+void AVVideoCaptureSource::beginConfiguration()
 {
+    if (m_session)
+        [m_session beginConfiguration];
+}
+
+void AVVideoCaptureSource::commitConfiguration()
+{
+    if (m_session)
+        [m_session commitConfiguration];
+}
+
+void AVVideoCaptureSource::settingsDidChange()
+{
+    m_currentSettings = std::nullopt;
+    RealtimeMediaSource::settingsDidChange();
+}
+
+const RealtimeMediaSourceSettings& AVVideoCaptureSource::settings() const
+{
+    if (m_currentSettings)
+        return *m_currentSettings;
+
+    RealtimeMediaSourceSettings settings;
+    if ([device() position] == AVCaptureDevicePositionFront)
+        settings.setFacingMode(RealtimeMediaSourceSettings::User);
+    else if ([device() position] == AVCaptureDevicePositionBack)
+        settings.setFacingMode(RealtimeMediaSourceSettings::Environment);
+    else
+        settings.setFacingMode(RealtimeMediaSourceSettings::Unknown);
+
+    auto maxFrameDuration = [device() activeVideoMaxFrameDuration];
+    settings.setFrameRate(maxFrameDuration.timescale / maxFrameDuration.value);
+    settings.setWidth(m_width);
+    settings.setHeight(m_height);
+    settings.setDeviceId(id());
+
+    RealtimeMediaSourceSupportedConstraints supportedConstraints;
+    supportedConstraints.setSupportsDeviceId(true);
+    supportedConstraints.setSupportsFacingMode([device() position] != AVCaptureDevicePositionUnspecified);
+    supportedConstraints.setSupportsWidth(true);
+    supportedConstraints.setSupportsHeight(true);
+    supportedConstraints.setSupportsAspectRatio(true);
+    supportedConstraints.setSupportsFrameRate(true);
+
+    settings.setSupportedConstraints(supportedConstraints);
+
+    m_currentSettings = WTFMove(settings);
+
+    return *m_currentSettings;
+}
+
+const RealtimeMediaSourceCapabilities& AVVideoCaptureSource::capabilities() const
+{
+    if (m_capabilities)
+        return *m_capabilities;
+
+    RealtimeMediaSourceCapabilities capabilities(settings().supportedConstraints());
+    capabilities.setDeviceId(id());
     AVCaptureDeviceTypedef *videoDevice = device();
 
     if ([videoDevice position] == AVCaptureDevicePositionFront)
@@ -204,45 +341,20 @@
         }
     }
 
-    for (auto& preset : videoPresets()) {
+    for (auto& preset : m_supportedPresets) {
         auto values = preset.value;
         updateSizeMinMax(minimumWidth, maximumWidth, values.width());
         updateSizeMinMax(minimumHeight, maximumHeight, values.height());
         updateAspectRatioMinMax(minimumAspectRatio, maximumAspectRatio, static_cast<double>(values.width()) / values.height());
     }
-
     capabilities.setFrameRate(CapabilityValueOrRange(lowestFrameRateRange, highestFrameRateRange));
     capabilities.setWidth(CapabilityValueOrRange(minimumWidth, maximumWidth));
     capabilities.setHeight(CapabilityValueOrRange(minimumHeight, maximumHeight));
     capabilities.setAspectRatio(CapabilityValueOrRange(minimumAspectRatio, maximumAspectRatio));
-}
 
-void AVVideoCaptureSource::initializeSupportedConstraints(RealtimeMediaSourceSupportedConstraints& supportedConstraints)
-{
-    supportedConstraints.setSupportsFacingMode([device() position] != AVCaptureDevicePositionUnspecified);
-    supportedConstraints.setSupportsWidth(true);
-    supportedConstraints.setSupportsHeight(true);
-    supportedConstraints.setSupportsAspectRatio(true);
-    supportedConstraints.setSupportsFrameRate(true);
-}
+    m_capabilities = WTFMove(capabilities);
 
-void AVVideoCaptureSource::updateSettings(RealtimeMediaSourceSettings& settings)
-{
-    settings.setDeviceId(id());
-
-    if ([device() position] == AVCaptureDevicePositionFront)
-        settings.setFacingMode(RealtimeMediaSourceSettings::User);
-    else if ([device() position] == AVCaptureDevicePositionBack)
-        settings.setFacingMode(RealtimeMediaSourceSettings::Environment);
-    else
-        settings.setFacingMode(RealtimeMediaSourceSettings::Unknown);
-
-    // FIXME: Observe frame rate changes.
-    auto maxFrameDuration = [device() activeVideoMaxFrameDuration];
-    settings.setFrameRate(maxFrameDuration.timescale / maxFrameDuration.value);
-    settings.setWidth(m_width);
-    settings.setHeight(m_height);
-    settings.setAspectRatio(static_cast<float>(m_width) / m_height);
+    return *m_capabilities;
 }
 
 bool AVVideoCaptureSource::applySize(const IntSize& size)
@@ -285,7 +397,11 @@
     @try {
         session().sessionPreset = preset;
 #if PLATFORM(MAC)
-        auto settingsDictionary = @{ (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(videoCaptureFormat), (__bridge NSString *)kCVPixelBufferWidthKey: @(size.width()), (__bridge NSString *)kCVPixelBufferHeightKey: @(size.height()), };
+        auto settingsDictionary = @{
+            (__bridge NSString *)kCVPixelBufferPixelFormatTypeKey: @(videoCaptureFormat),
+            (__bridge NSString *)kCVPixelBufferWidthKey: @(size.width()),
+            (__bridge NSString *)kCVPixelBufferHeightKey: @(size.height())
+        };
         [m_videoOutput setVideoSettings:settingsDictionary];
 #endif
     } @catch(NSException *exception) {
@@ -381,6 +497,24 @@
     return connection ? sensorOrientation([connection videoOrientation]) : 0;
 }
 
+bool AVVideoCaptureSource::setupSession()
+{
+    if (m_session)
+        return true;
+
+    m_session = adoptNS([allocAVCaptureSessionInstance() init]);
+    [m_session addObserver:m_objcObserver.get() forKeyPath:@"rate" options:NSKeyValueObservingOptionNew context:(void *)nil];
+
+    [m_session beginConfiguration];
+    bool success = setupCaptureSession();
+    [m_session commitConfiguration];
+
+    if (!success)
+        captureFailed();
+
+    return success;
+}
+
 bool AVVideoCaptureSource::setupCaptureSession()
 {
 #if PLATFORM(IOS)
@@ -412,7 +546,7 @@
 
     [m_videoOutput setVideoSettings:settingsDictionary.get()];
     [m_videoOutput setAlwaysDiscardsLateVideoFrames:YES];
-    setVideoSampleBufferDelegate(m_videoOutput.get());
+    [m_videoOutput setSampleBufferDelegate:m_objcObserver.get() queue:globaVideoCaptureSerialQueue()];
 
     if (![session() canAddOutput:m_videoOutput.get()]) {
         RELEASE_LOG(Media, "AVVideoCaptureSource::setupCaptureSession(%p), unable to add video sample buffer output delegate", this);
@@ -555,6 +689,157 @@
     return isFrameRateSupported(frameRate.value());
 }
 
+void AVVideoCaptureSource::captureSessionIsRunningDidChange(bool state)
+{
+    scheduleDeferredTask([this, state] {
+        if ((state == m_isRunning) && (state == !muted()))
+            return;
+
+        m_isRunning = state;
+        notifyMutedChange(!m_isRunning);
+    });
+}
+
+bool AVVideoCaptureSource::interrupted() const
+{
+    if (m_interruption != InterruptionReason::None)
+        return true;
+
+    return RealtimeMediaSource::interrupted();
+}
+
+#if PLATFORM(IOS)
+void AVVideoCaptureSource::captureSessionRuntimeError(RetainPtr<NSError> error)
+{
+    if (!m_isRunning || error.get().code != AVErrorMediaServicesWereReset)
+        return;
+
+    // Try to restart the session, but reset m_isRunning immediately so if it fails we won't try again.
+    [m_session startRunning];
+    m_isRunning = [m_session isRunning];
+}
+
+void AVVideoCaptureSource::captureSessionBeginInterruption(RetainPtr<NSNotification> notification)
+{
+    m_interruption = static_cast<AVVideoCaptureSource::InterruptionReason>([notification.get().userInfo[AVCaptureSessionInterruptionReasonKey] integerValue]);
+}
+
+void AVVideoCaptureSource::captureSessionEndInterruption(RetainPtr<NSNotification>)
+{
+    InterruptionReason reason = m_interruption;
+
+    m_interruption = InterruptionReason::None;
+    if (reason != InterruptionReason::VideoNotAllowedInSideBySide || m_isRunning || !m_session)
+        return;
+
+    [m_session startRunning];
+    m_isRunning = [m_session isRunning];
+}
+#endif
+
 } // namespace WebCore
 
+@implementation WebCoreAVVideoCaptureSourceObserver
+
+- (id)initWithCallback:(AVVideoCaptureSource*)callback
+{
+    self = [super init];
+    if (!self)
+        return nil;
+
+    m_callback = callback;
+
+    return self;
+}
+
+- (void)disconnect
+{
+    [NSObject cancelPreviousPerformRequestsWithTarget:self];
+    [self removeNotificationObservers];
+    m_callback = nullptr;
+}
+
+- (void)addNotificationObservers
+{
+#if PLATFORM(IOS)
+    ASSERT(m_callback);
+
+    NSNotificationCenter* center = [NSNotificationCenter defaultCenter];
+    AVCaptureSessionType* session = m_callback->session();
+
+    [center addObserver:self selector:@selector(sessionRuntimeError:) name:AVCaptureSessionRuntimeErrorNotification object:session];
+    [center addObserver:self selector:@selector(beginSessionInterrupted:) name:AVCaptureSessionWasInterruptedNotification object:session];
+    [center addObserver:self selector:@selector(endSessionInterrupted:) name:AVCaptureSessionInterruptionEndedNotification object:session];
+#endif
+}
+
+- (void)removeNotificationObservers
+{
+#if PLATFORM(IOS)
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+#endif
+}
+
+- (void)captureOutput:(AVCaptureOutputType*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnectionType*)connection
+{
+    if (!m_callback)
+        return;
+
+    m_callback->captureOutputDidOutputSampleBufferFromConnection(captureOutput, sampleBuffer, connection);
+}
+
+- (void)observeValueForKeyPath:keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
+{
+    UNUSED_PARAM(object);
+    UNUSED_PARAM(context);
+
+    if (!m_callback)
+        return;
+
+    id newValue = [change valueForKey:NSKeyValueChangeNewKey];
+
+#if !LOG_DISABLED
+    bool willChange = [[change valueForKey:NSKeyValueChangeNotificationIsPriorKey] boolValue];
+
+    if (willChange)
+        LOG(Media, "WebCoreAVVideoCaptureSourceObserver::observeValueForKeyPath(%p) - will change, keyPath = %s", self, [keyPath UTF8String]);
+    else {
+        RetainPtr<NSString> valueString = adoptNS([[NSString alloc] initWithFormat:@"%@", newValue]);
+        LOG(Media, "WebCoreAVVideoCaptureSourceObserver::observeValueForKeyPath(%p) - did change, keyPath = %s, value = %s", self, [keyPath UTF8String], [valueString.get() UTF8String]);
+    }
+#endif
+
+    if ([keyPath isEqualToString:@"running"])
+        m_callback->captureSessionIsRunningDidChange([newValue boolValue]);
+}
+
+#if PLATFORM(IOS)
+- (void)sessionRuntimeError:(NSNotification*)notification
+{
+    NSError *error = notification.userInfo[AVCaptureSessionErrorKey];
+    LOG(Media, "WebCoreAVVideoCaptureSourceObserver::sessionRuntimeError(%p) - error = %s", self, [[error localizedDescription] UTF8String]);
+
+    if (m_callback)
+        m_callback->captureSessionRuntimeError(error);
+}
+
+- (void)beginSessionInterrupted:(NSNotification*)notification
+{
+    LOG(Media, "WebCoreAVVideoCaptureSourceObserver::beginSessionInterrupted(%p) - reason = %d", self, [notification.userInfo[AVCaptureSessionInterruptionReasonKey] integerValue]);
+
+    if (m_callback)
+        m_callback->captureSessionBeginInterruption(notification);
+}
+
+- (void)endSessionInterrupted:(NSNotification*)notification
+{
+    LOG(Media, "WebCoreAVVideoCaptureSourceObserver::endSessionInterrupted(%p)", self);
+
+    if (m_callback)
+        m_callback->captureSessionEndInterruption(notification);
+}
+#endif
+
+@end
+
 #endif // ENABLE(MEDIA_STREAM)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to