Fix AVVideoCaptureSource frameRate setter and getter
[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 "AVMediaCaptureSource.h"
31 #include "OrientationNotifier.h"
32
33 OBJC_CLASS CALayer;
34 OBJC_CLASS AVFrameRateRange;
35
36 typedef struct CGImage *CGImageRef;
37 typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
38 typedef struct opaqueCMSampleBuffer *CMSampleBufferRef;
39
40 namespace WebCore {
41
42 class FloatRect;
43 class GraphicsContext;
44 class PixelBufferConformerCV;
45
46 class AVVideoCaptureSource : public AVMediaCaptureSource, private OrientationNotifier::Observer {
47 public:
48     static CaptureSourceOrError create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*);
49
50     WEBCORE_EXPORT static VideoCaptureFactory& factory();
51
52     int32_t width() const { return m_width; }
53     int32_t height() const { return m_height; }
54
55 private:
56     AVVideoCaptureSource(AVCaptureDevice*, const AtomicString&);
57     virtual ~AVVideoCaptureSource();
58
59     void setupCaptureSession() final;
60     void shutdownCaptureSession() final;
61
62     void updateSettings(RealtimeMediaSourceSettings&) final;
63
64     void applySizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
65     bool applySize(const IntSize&) final;
66     bool applyFrameRate(double) final;
67     bool setPreset(NSString*);
68
69     void monitorOrientation(OrientationNotifier&) final;
70     void computeSampleRotation();
71
72     bool isFrameRateSupported(double frameRate);
73
74     NSString *bestSessionPresetForVideoDimensions(std::optional<int> width, std::optional<int> height) const;
75     bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
76
77     void initializeCapabilities(RealtimeMediaSourceCapabilities&) final;
78     void initializeSupportedConstraints(RealtimeMediaSourceSupportedConstraints&) final;
79
80     // OrientationNotifier::Observer API
81     void orientationChanged(int orientation) final;
82
83     bool setFrameRateConstraint(double minFrameRate, double maxFrameRate);
84
85     void captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutput*, CMSampleBufferRef, AVCaptureConnection*) final;
86     void processNewFrame(RetainPtr<CMSampleBufferRef>, RetainPtr<AVCaptureConnection>);
87
88     RetainPtr<NSString> m_pendingPreset;
89     RetainPtr<CMSampleBufferRef> m_buffer;
90     RetainPtr<CGImageRef> m_lastImage;
91     RetainPtr<AVCaptureVideoDataOutput> m_videoOutput;
92
93     std::unique_ptr<PixelBufferConformerCV> m_pixelBufferConformer;
94
95     int32_t m_width { 0 };
96     int32_t m_height { 0 };
97     int m_sensorOrientation { 0 };
98     int m_deviceOrientation { 0 };
99     MediaSample::VideoRotation m_sampleRotation { MediaSample::VideoRotation::None };
100 };
101
102 } // namespace WebCore
103
104 #endif // ENABLE(MEDIA_STREAM)