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)