[MediaStream] Simplify logic when changing RealtimeMediaSource settings
[WebKit-https.git] / Source / WebCore / platform / mediastream / mac / AVVideoCaptureSource.h
1 /*
2  * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
29
30 #include "OrientationNotifier.h"
31 #include "RealtimeMediaSource.h"
32 #include <wtf/text/StringHash.h>
33
34 typedef struct opaqueCMSampleBuffer* CMSampleBufferRef;
35
36 OBJC_CLASS AVCaptureConnection;
37 OBJC_CLASS AVCaptureDevice;
38 OBJC_CLASS AVCaptureOutput;
39 OBJC_CLASS AVCaptureSession;
40 OBJC_CLASS AVCaptureVideoDataOutput;
41 OBJC_CLASS NSError;
42 OBJC_CLASS NSNotification;
43 OBJC_CLASS WebCoreAVVideoCaptureSourceObserver;
44
45 namespace WebCore {
46
47 class AVVideoCaptureSource : public RealtimeMediaSource, private OrientationNotifier::Observer {
48 public:
49     static CaptureSourceOrError create(const AtomicString&, const MediaConstraints*);
50
51     WEBCORE_EXPORT static VideoCaptureFactory& factory();
52
53     int32_t width() const { return m_width; }
54     int32_t height() const { return m_height; }
55
56     enum class InterruptionReason { None, VideoNotAllowedInBackground, AudioInUse, VideoInUse, VideoNotAllowedInSideBySide };
57     void captureSessionBeginInterruption(RetainPtr<NSNotification>);
58     void captureSessionEndInterruption(RetainPtr<NSNotification>);
59
60     AVCaptureSession* session() const { return m_session.get(); }
61
62     void captureSessionIsRunningDidChange(bool);
63     void captureSessionRuntimeError(RetainPtr<NSError>);
64     void captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutput*, CMSampleBufferRef, AVCaptureConnection*);
65
66 private:
67     AVVideoCaptureSource(AVCaptureDevice*, const AtomicString&);
68     virtual ~AVVideoCaptureSource();
69
70     bool setupSession();
71     bool setupCaptureSession();
72     void shutdownCaptureSession();
73
74     const RealtimeMediaSourceCapabilities& capabilities() const final;
75     void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
76     void setFrameRate(double);
77     const RealtimeMediaSourceSettings& settings() const final;
78     void startProducingData() final;
79     void stopProducingData() final;
80     bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
81     void settingsDidChange(OptionSet<RealtimeMediaSourceSettings::Flag>) final;
82     void monitorOrientation(OrientationNotifier&) final;
83     void beginConfiguration() final;
84     void commitConfiguration() final;
85     bool isCaptureSource() const final { return true; }
86     bool interrupted() const final;
87
88     bool setPreset(NSString*);
89     void computeSampleRotation();
90
91     bool isFrameRateSupported(double frameRate);
92
93     NSString* bestSessionPresetForVideoDimensions(std::optional<int> width, std::optional<int> height);
94
95     // OrientationNotifier::Observer API
96     void orientationChanged(int orientation) final;
97
98     bool setFrameRateConstraint(double minFrameRate, double maxFrameRate);
99
100     void processNewFrame(RetainPtr<CMSampleBufferRef>, RetainPtr<AVCaptureConnection>);
101     IntSize sizeForPreset(NSString*);
102
103     using VideoPresetMap = HashMap<String, IntSize>;
104     VideoPresetMap& videoPresets() { return m_supportedPresets; }
105
106     AVCaptureDevice* device() const { return m_device.get(); }
107
108     RetainPtr<NSString> m_pendingPreset;
109     RetainPtr<CMSampleBufferRef> m_buffer;
110     RetainPtr<AVCaptureVideoDataOutput> m_videoOutput;
111
112     IntSize m_presetSize;
113     int32_t m_width { 0 };
114     int32_t m_height { 0 };
115     int m_sensorOrientation { 0 };
116     int m_deviceOrientation { 0 };
117     MediaSample::VideoRotation m_sampleRotation { MediaSample::VideoRotation::None };
118
119     VideoPresetMap m_supportedPresets;
120
121     mutable std::optional<RealtimeMediaSourceSettings> m_currentSettings;
122     mutable std::optional<RealtimeMediaSourceCapabilities> m_capabilities;
123     RetainPtr<WebCoreAVVideoCaptureSourceObserver> m_objcObserver;
124     RetainPtr<AVCaptureSession> m_session;
125     RetainPtr<AVCaptureDevice> m_device;
126     InterruptionReason m_interruption { InterruptionReason::None };
127     bool m_isRunning { false };
128
129 };
130
131 } // namespace WebCore
132
133 #endif // ENABLE(MEDIA_STREAM)