Add specialized template declarations of HashTraits and DefaultHash to detect misuse
[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 "IntSizeHash.h"
31 #include "OrientationNotifier.h"
32 #include "RealtimeMediaSource.h"
33 #include <wtf/text/StringHash.h>
34
35 typedef struct opaqueCMSampleBuffer* CMSampleBufferRef;
36
37 OBJC_CLASS AVCaptureConnection;
38 OBJC_CLASS AVCaptureDevice;
39 OBJC_CLASS AVCaptureOutput;
40 OBJC_CLASS AVCaptureSession;
41 OBJC_CLASS AVCaptureVideoDataOutput;
42 OBJC_CLASS NSError;
43 OBJC_CLASS NSNotification;
44 OBJC_CLASS WebCoreAVVideoCaptureSourceObserver;
45
46 namespace WebCore {
47
48 class AVVideoCaptureSource : public RealtimeMediaSource, private OrientationNotifier::Observer {
49 public:
50     static CaptureSourceOrError create(const AtomicString&, const MediaConstraints*);
51
52     WEBCORE_EXPORT static VideoCaptureFactory& factory();
53
54     int32_t width() const { return m_width; }
55     int32_t height() const { return m_height; }
56
57     enum class InterruptionReason { None, VideoNotAllowedInBackground, AudioInUse, VideoInUse, VideoNotAllowedInSideBySide };
58     void captureSessionBeginInterruption(RetainPtr<NSNotification>);
59     void captureSessionEndInterruption(RetainPtr<NSNotification>);
60
61     AVCaptureSession* session() const { return m_session.get(); }
62
63     void captureSessionIsRunningDidChange(bool);
64     void captureSessionRuntimeError(RetainPtr<NSError>);
65     void captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutput*, CMSampleBufferRef, AVCaptureConnection*);
66
67 private:
68     AVVideoCaptureSource(AVCaptureDevice*, const AtomicString&);
69     virtual ~AVVideoCaptureSource();
70
71     bool setupSession();
72     bool setupCaptureSession();
73     void shutdownCaptureSession();
74
75     const RealtimeMediaSourceCapabilities& capabilities() const final;
76     void setSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
77     void setFrameRate(double);
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(OptionSet<RealtimeMediaSourceSettings::Flag>) 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)