15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaStreamProvider is used to capture media of the types defined in 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaStreamType. There is only one MediaStreamProvider instance per media 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type and a MediaStreamProvider instance can have only one registered 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// listener. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The MediaStreamManager is expected to be called on Browser::IO thread and 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the listener will be called on the same thread. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_PROVIDER_H_ 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_PROVIDER_H_ 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_options.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum MediaStreamProviderError { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMediaStreamOk = 0, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kInvalidMediaStreamType, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kInvalidSession, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kUnknownSession, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDeviceNotAvailable, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kDeviceAlreadyInUse, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kUnknownError 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum { kInvalidMediaCaptureSessionId = 0xFFFFFFFF }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Callback class used by MediaStreamProvider. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT MediaStreamProviderListener { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by a MediaStreamProvider when a stream has been opened. 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Opened(MediaStreamType stream_type, int capture_session_id) = 0; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by a MediaStreamProvider when a stream has been closed. 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Closed(MediaStreamType stream_type, int capture_session_id) = 0; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by a MediaStreamProvider when available devices has been enumerated. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DevicesEnumerated(MediaStreamType stream_type, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StreamDeviceInfoArray& devices) = 0; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // Called by a MediaStreamProvider when the device has been aborted due to 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // device error. 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void Aborted(MediaStreamType stream_type, int capture_session_id) = 0; 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MediaStreamProviderListener() {} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implemented by a manager class providing captured media. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT MediaStreamProvider 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCountedThreadSafe<MediaStreamProvider> { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers a listener and a device message loop. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Register(MediaStreamProviderListener* listener, 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_task_runner) = 0; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unregisters the previously registered listener. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Unregister() = 0; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Enumerates existing capture devices and calls |DevicesEnumerated|. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EnumerateDevices(MediaStreamType stream_type) = 0; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the specified device. The device is not started and it is still 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // possible for other applications to open the device before the device is 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // started. |Opened| is called when the device is opened. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kInvalidMediaCaptureSessionId is returned on error. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Open(const StreamDeviceInfo& device) = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closes the specified device and calls |Closed| when done. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Close(int capture_session_id) = 0; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<MediaStreamProvider>; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MediaStreamProvider() {} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_RENDERER_HOST_MEDIA_MEDIA_STREAM_PROVIDER_H_ 93