[MediaStream] Remove AVMediaCaptureSource
[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     bool applySize(const IntSize&) final;
77     bool applyFrameRate(double) final;
78     const RealtimeMediaSourceSettings& settings() const final;
79     void startProducingData() final;
80     void stopProducingData() final;
81     bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
82     void settingsDidChange() final;
83     void monitorOrientation(OrientationNotifier&) final;
84     void beginConfiguration() final;
85     void commitConfiguration() final;
86     bool isCaptureSource() const final { return true; }
87     bool interrupted() const final;
88
89     bool setPreset(NSString*);
90     void computeSampleRotation();
91
92     bool isFrameRateSupported(double frameRate);
93
94     NSString* bestSessionPresetForVideoDimensions(std::optional<int> width, std::optional<int> height);
95
96     // OrientationNotifier::Observer API
97     void orientationChanged(int orientation) final;
98
99     bool setFrameRateConstraint(double minFrameRate, double maxFrameRate);
100
101     void processNewFrame(RetainPtr<CMSampleBufferRef>, RetainPtr<AVCaptureConnection>);
102     IntSize sizeForPreset(NSString*);
103
104     using VideoPresetMap = HashMap<String, IntSize>;
105     VideoPresetMap& videoPresets() { return m_supportedPresets; }
106
107     AVCaptureDevice* device() const { return m_device.get(); }
108
109     RetainPtr<NSString> m_pendingPreset;
110     RetainPtr<CMSampleBufferRef> m_buffer;
111     RetainPtr<AVCaptureVideoDataOutput> m_videoOutput;
112
113     IntSize m_presetSize;
114     int32_t m_width { 0 };
115     int32_t m_height { 0 };
116     int m_sensorOrientation { 0 };
117     int m_deviceOrientation { 0 };
118     MediaSample::VideoRotation m_sampleRotation { MediaSample::VideoRotation::None };
119
120     VideoPresetMap m_supportedPresets;
121
122     mutable std::optional<RealtimeMediaSourceSettings> m_currentSettings;
123     mutable std::optional<RealtimeMediaSourceCapabilities> m_capabilities;
124     RetainPtr<WebCoreAVVideoCaptureSourceObserver> m_objcObserver;
125     RetainPtr<AVCaptureSession> m_session;
126     RetainPtr<AVCaptureDevice> m_device;
127     InterruptionReason m_interruption { InterruptionReason::None };
128     bool m_isRunning { false };
129
130 };
131
132 } // namespace WebCore
133
134 #endif // ENABLE(MEDIA_STREAM)