[MediaStream] Compensate for video capture orientation
[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 #ifndef AVVideoCaptureSource_h
27 #define AVVideoCaptureSource_h
28
29 #if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
30
31 #include "AVMediaCaptureSource.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 {
47 public:
48     static RefPtr<AVMediaCaptureSource> create(AVCaptureDevice*, const AtomicString&, const MediaConstraints*, String&);
49
50     WEBCORE_EXPORT static CaptureFactory& 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     NSString *bestSessionPresetForVideoDimensions(std::optional<int> width, std::optional<int> height) const;
70     bool supportsSizeAndFrameRate(std::optional<int> width, std::optional<int> height, std::optional<double>) final;
71
72     void initializeCapabilities(RealtimeMediaSourceCapabilities&) final;
73     void initializeSupportedConstraints(RealtimeMediaSourceSupportedConstraints&) final;
74
75     bool setFrameRateConstraint(double minFrameRate, double maxFrameRate);
76
77     bool updateFramerate(CMSampleBufferRef);
78
79     void captureOutputDidOutputSampleBufferFromConnection(AVCaptureOutput*, CMSampleBufferRef, AVCaptureConnection*) final;
80     void processNewFrame(RetainPtr<CMSampleBufferRef>, RetainPtr<AVCaptureConnection>);
81
82     RetainPtr<NSString> m_pendingPreset;
83     RetainPtr<CMSampleBufferRef> m_buffer;
84     RetainPtr<CGImageRef> m_lastImage;
85     RetainPtr<AVCaptureVideoDataOutput> m_videoOutput;
86
87     std::unique_ptr<PixelBufferConformerCV> m_pixelBufferConformer;
88
89     Vector<Float64> m_videoFrameTimeStamps;
90     Float64 m_frameRate { 0 };
91     int32_t m_width { 0 };
92     int32_t m_height { 0 };
93 };
94
95 } // namespace WebCore
96
97 #endif // ENABLE(MEDIA_STREAM)
98
99 #endif // AVVideoCaptureSource_h