1/*
2 * Copyright (C) 2013 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 AVCaptureDeviceManager_h
27#define AVCaptureDeviceManager_h
28
29#if ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)
30
31#include "MediaStreamCenter.h"
32#include "MediaStreamSource.h"
33#include "MediaStreamTrackSourcesRequestClient.h"
34#include <wtf/RetainPtr.h>
35#include <wtf/text/WTFString.h>
36
37OBJC_CLASS AVCaptureDevice;
38OBJC_CLASS AVCaptureSession;
39OBJC_CLASS NSString;
40OBJC_CLASS WebCoreAVCaptureDeviceManagerObserver;
41
42namespace WebCore {
43
44class CaptureDevice;
45
46class AVCaptureDeviceManager {
47public:
48    static AVCaptureDeviceManager& shared();
49    static bool isAvailable();
50
51    Vector<RefPtr<TrackSourceInfo>> getSourcesInfo(const String&);
52    bool verifyConstraintsForMediaType(MediaStreamSource::Type, MediaConstraints*, String&);
53    RefPtr<MediaStreamSource> bestSourceForTypeAndConstraints(MediaStreamSource::Type, PassRefPtr<MediaConstraints>);
54
55    enum ValidConstraints { Width = 0, Height, FrameRate, FacingMode, Gain };
56    static const Vector<AtomicString>& validConstraintNames();
57    static const Vector<AtomicString>& validFacingModes();
58
59    static bool deviceSupportsFacingMode(AVCaptureDevice*, MediaStreamSourceStates::VideoFacingMode);
60    static bool isValidConstraint(MediaStreamSource::Type, const String&);
61    static String bestSessionPresetForVideoSize(AVCaptureSession*, int width, int height);
62
63    void registerForDeviceNotifications();
64    void deviceConnected();
65    void deviceDisconnected(AVCaptureDevice*);
66
67protected:
68    AVCaptureDeviceManager();
69    ~AVCaptureDeviceManager();
70
71    CaptureDevice* bestDeviceForFacingMode(MediaStreamSourceStates::VideoFacingMode);
72    bool sessionSupportsConstraint(AVCaptureSession*, MediaStreamSource::Type, const String& name, const String& value);
73
74    RetainPtr<WebCoreAVCaptureDeviceManagerObserver> m_objcObserver;
75};
76
77} // namespace WebCore
78
79#endif // ENABLE(MEDIA_STREAM)
80
81#endif // AVCaptureDeviceManager_h
82