summaryrefslogtreecommitdiffstats
path: root/src/core/media_capture_devices_dispatcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/media_capture_devices_dispatcher.h')
-rw-r--r--src/core/media_capture_devices_dispatcher.h159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/core/media_capture_devices_dispatcher.h b/src/core/media_capture_devices_dispatcher.h
new file mode 100644
index 000000000..38d7b1c19
--- /dev/null
+++ b/src/core/media_capture_devices_dispatcher.h
@@ -0,0 +1,159 @@
+/****************************************************************************
+**
+** Copyright (c) 2012 The Chromium Authors. All rights reserved.
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtWebEngine module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef MEDIA_CAPTURE_DEVICES_DISPATCHER_H
+#define MEDIA_CAPTURE_DEVICES_DISPATCHER_H
+
+#include <deque>
+#include <list>
+#include <map>
+#include <QtCore/qcompilerdetection.h>
+
+#include "web_contents_adapter_client.h"
+
+#include "base/callback.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/singleton.h"
+#include "base/observer_list.h"
+#include "content/public/browser/media_observer.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/public/common/media_stream_request.h"
+
+class AudioStreamIndicator;
+class DesktopStreamsRegistry;
+class MediaStreamCaptureIndicator;
+
+// This singleton is used to receive updates about media events from the content
+// layer. Based on Chrome's implementation.
+class MediaCaptureDevicesDispatcher : public content::MediaObserver,
+ public content::NotificationObserver {
+ public:
+
+ static MediaCaptureDevicesDispatcher *GetInstance();
+
+ void processMediaAccessRequest(WebContentsAdapterClient *, content::WebContents *, const content::MediaStreamRequest &, const content::MediaResponseCallback &);
+
+ // Called back from our WebContentsAdapter to grant the requested permission.
+ void handleMediaAccessPermissionResponse(content::WebContents *, const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags);
+
+ void getDefaultDevices(const std::string &audioDeviceId, const std::string &videoDeviceId, bool audio, bool video, content::MediaStreamDevices *);
+
+ // Overridden from content::MediaObserver:
+ virtual void OnAudioCaptureDevicesChanged(const content::MediaStreamDevices &) Q_DECL_OVERRIDE;
+ virtual void OnVideoCaptureDevicesChanged(const content::MediaStreamDevices &) Q_DECL_OVERRIDE;
+ virtual void OnMediaRequestStateChanged(int renderProcessId, int renderViewId, int pageRequestId, const content::MediaStreamDevice &device
+ , content::MediaRequestState state) Q_DECL_OVERRIDE;
+ virtual void OnAudioStreamPlayingChanged(int /*render_process_id*/, int /*render_view_id*/, int /*stream_id*/
+ , bool /*is_playing*/, float /*power_dBFS*/, bool /*clipped*/) Q_DECL_OVERRIDE {}
+ virtual void OnCreatingAudioStream(int renderProcessId, int renderViewId) Q_DECL_OVERRIDE;
+
+ DesktopStreamsRegistry *getDesktopStreamsRegistry();
+
+ private:
+ friend struct DefaultSingletonTraits<MediaCaptureDevicesDispatcher>;
+
+ struct PendingAccessRequest {
+ PendingAccessRequest(const content::MediaStreamRequest &request,
+ const content::MediaResponseCallback &callback);
+ ~PendingAccessRequest();
+
+ content::MediaStreamRequest request;
+ content::MediaResponseCallback callback;
+ };
+ typedef std::deque<PendingAccessRequest> RequestsQueue;
+ typedef std::map<content::WebContents *, RequestsQueue> RequestsQueues;
+
+ MediaCaptureDevicesDispatcher();
+ virtual ~MediaCaptureDevicesDispatcher();
+
+ const content::MediaStreamDevices &getAudioCaptureDevices();
+ const content::MediaStreamDevices &getVideoCaptureDevices();
+
+ // content::NotificationObserver implementation.
+ virtual void Observe(int type, const content::NotificationSource &source, const content::NotificationDetails &details) Q_DECL_OVERRIDE;
+
+ // Helpers for ProcessMediaAccessRequest().
+ void processDesktopCaptureAccessRequest(content::WebContents *, const content::MediaStreamRequest &, const content::MediaResponseCallback &);
+ void processScreenCaptureAccessRequest(content::WebContents *,const content::MediaStreamRequest &, const content::MediaResponseCallback &);
+ void handleScreenCaptureAccessRequest(content::WebContents *, bool userAccepted, const base::string16 &/*unused callback_input*/);
+ void enqueueMediaAccessRequest(content::WebContents *, const content::MediaStreamRequest &, const content::MediaResponseCallback &);
+ void ProcessQueuedAccessRequest(content::WebContents *);
+
+ // Called by the MediaObserver() functions, executed on UI thread.
+ void updateAudioDevicesOnUIThread(const content::MediaStreamDevices &);
+ void updateVideoDevicesOnUIThread(const content::MediaStreamDevices &);
+ void updateMediaRequestStateOnUIThread(int renderProcessId, int renderViewId, int pageRequestId, const content::MediaStreamDevice &
+ , content::MediaRequestState);
+
+ // A list of cached audio capture devices.
+ content::MediaStreamDevices m_audioDevices;
+
+ // A list of cached video capture devices.
+ content::MediaStreamDevices m_videoDevices;
+
+ // Flag to indicate if device enumeration has been done/doing.
+ // Only accessed on UI thread.
+ bool m_devicesEnumerated;
+
+ RequestsQueues m_pendingRequests;
+
+ scoped_ptr<DesktopStreamsRegistry> m_desktopStreamsRegistry;
+
+ content::NotificationRegistrar m_notificationsRegistrar;
+
+ // Tracks MEDIA_DESKTOP_VIDEO_CAPTURE sessions which reach the
+ // MEDIA_REQUEST_STATE_DONE state. Sessions are remove when
+ // MEDIA_REQUEST_STATE_CLOSING is encountered.
+ struct DesktopCaptureSession {
+ int render_process_id;
+ int render_view_id;
+ int page_request_id;
+ };
+ typedef std::list<DesktopCaptureSession> DesktopCaptureSessions;
+ DesktopCaptureSessions m_desktopCaptureSessions;
+
+ DISALLOW_COPY_AND_ASSIGN(MediaCaptureDevicesDispatcher);
+};
+
+#endif // MEDIA_CAPTURE_DEVICES_DISPATCHER_H