blob: 85dc842d0b6158e79ea83bd223bed50ac2999258 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_ADAPTER_H_
#define CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_ADAPTER_H_
#include <map>
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "base/synchronization/lock.h"
#include "content/common/content_export.h"
#include "content/renderer/media/webrtc/webrtc_media_stream_track_adapter_map.h"
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/webrtc/api/mediastreaminterface.h"
namespace content {
class PeerConnectionDependencyFactory;
// An adapter is the glue between webrtc and blink media streams. Adapters of
// local media streams are created from a blink stream and get a webrtc stream
// correspondent. Adapters of remote media streams are created from a webrtc
// stream and get a blink stream correspondent. The adapter makes sure that when
// the stream it was created from is modified the correspondent is updated to
// reflect the new state.
// The adapters are thread safe but must be constructed on the correct thread
// (local adapters: main thread, remote adapters: webrtc signaling thread) and
// destroyed on the main thread.
class CONTENT_EXPORT WebRtcMediaStreamAdapter {
public:
using TrackAdapterRefs = std::vector<
std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>>;
// Creates an adapter for a local media stream. The adapter is already
// initialized. Invoked on the main thread.
static std::unique_ptr<WebRtcMediaStreamAdapter> CreateLocalStreamAdapter(
PeerConnectionDependencyFactory* factory,
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
const blink::WebMediaStream& web_stream);
// Creates an adapter for a remote media stream. Invoked on the webrtc
// signaling thread. The adapter is initialized in a post to the main thread.
static std::unique_ptr<WebRtcMediaStreamAdapter> CreateRemoteStreamAdapter(
scoped_refptr<base::SingleThreadTaskRunner> main_thread,
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream);
// Invoke on the main thread.
virtual ~WebRtcMediaStreamAdapter();
// Once initialized, |webrtc_stream| and |web_stream| are accessible. An
// initialized adapter remains initialized until destroyed.
virtual bool is_initialized() const = 0;
virtual const scoped_refptr<webrtc::MediaStreamInterface>& webrtc_stream()
const = 0;
virtual const blink::WebMediaStream& web_stream() const = 0;
bool IsEqual(const blink::WebMediaStream& stream) const {
return (web_stream_.IsNull() && stream.IsNull()) ||
(web_stream_.Id() == stream.Id());
}
virtual void SetTracks(TrackAdapterRefs track_refs) = 0;
protected:
WebRtcMediaStreamAdapter(
scoped_refptr<base::SingleThreadTaskRunner> main_thread,
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream,
const blink::WebMediaStream& web_stream);
scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
// The map and owner of all track adapters for the associated peer connection.
// When a track is added or removed from this stream, the map provides us with
// a reference to the corresponding track adapter, creating a new one if
// necessary.
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map_;
// If |is_initialized()| both of these need to be set and remain constant.
scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream_;
blink::WebMediaStream web_stream_;
DISALLOW_COPY_AND_ASSIGN(WebRtcMediaStreamAdapter);
};
// Adapter implementation for a local |blink::WebMediaStream|. Created and
// destroyed on the main thread.
class LocalWebRtcMediaStreamAdapter : public WebRtcMediaStreamAdapter,
blink::WebMediaStreamObserver {
public:
LocalWebRtcMediaStreamAdapter(
PeerConnectionDependencyFactory* factory,
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
const blink::WebMediaStream& web_stream);
~LocalWebRtcMediaStreamAdapter() override;
// |WebRtcMediaStreamAdapter| implementation.
bool is_initialized() const override;
const scoped_refptr<webrtc::MediaStreamInterface>& webrtc_stream()
const override;
const blink::WebMediaStream& web_stream() const override;
void SetTracks(TrackAdapterRefs track_refs) override;
private:
// A map between web track UniqueIDs and references to track adapters.
using LocalAdapterRefMap =
std::map<int, // blink::WebMediaStreamTrack::UniqueId()
std::unique_ptr<WebRtcMediaStreamTrackAdapterMap::AdapterRef>>;
// |MediaStreamObserver| implementation. Also used as a helper functions when
// adding/removing all tracks in the constructor/destructor.
void TrackAdded(const blink::WebMediaStreamTrack& web_track) override;
void TrackRemoved(const blink::WebMediaStreamTrack& web_track) override;
// Pointer to a |PeerConnectionDependencyFactory|, owned by the
// |RenderThread|. It's valid for the lifetime of |RenderThread|.
PeerConnectionDependencyFactory* const factory_;
// Track adapters belonging to this stream. Keeping adapter references alive
// ensures the adapters are not disposed by the |track_adapter_map_| as long
// as the webrtc layer track is in use by the webrtc layer stream.
LocalAdapterRefMap adapter_refs_;
DISALLOW_COPY_AND_ASSIGN(LocalWebRtcMediaStreamAdapter);
};
// Adapter implementation for a remote |webrtc::MediaStreamInterface|. Created
// on the the webrtc signaling thread, initialized on the main thread where it
// must be destroyed.
class RemoteWebRtcMediaStreamAdapter : public WebRtcMediaStreamAdapter {
public:
RemoteWebRtcMediaStreamAdapter(
scoped_refptr<base::SingleThreadTaskRunner> main_thread,
scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream);
~RemoteWebRtcMediaStreamAdapter() override;
// |WebRtcMediaStreamAdapter| implementation.
bool is_initialized() const override;
const scoped_refptr<webrtc::MediaStreamInterface>& webrtc_stream()
const override;
const blink::WebMediaStream& web_stream() const override;
void SetTracks(TrackAdapterRefs track_refs) override;
private:
// Track adapters for the remote webrtc tracks of a stream.
using RemoteAdapterRefs = WebRtcMediaStreamAdapter::TrackAdapterRefs;
static bool RemoteAdapterRefsContainsTrack(
const RemoteAdapterRefs& adapter_refs,
webrtc::MediaStreamTrackInterface* track);
// Gets the adapters for the tracks that are members of the webrtc stream.
// Invoke on webrtc signaling thread. New adapters are initialized in a post
// to the main thread after which their |web_track| becomes available.
static RemoteAdapterRefs GetRemoteAdapterRefsFromWebRtcStream(
const scoped_refptr<WebRtcMediaStreamTrackAdapterMap>& track_adapter_map,
webrtc::MediaStreamInterface* webrtc_stream);
void InitializeOnMainThread(const std::string& label,
RemoteAdapterRefs track_adapter_refs,
size_t audio_track_count,
size_t video_track_count);
mutable base::Lock lock_;
bool is_initialized_;
// Track adapters belonging to this stream. Keeping adapter references alive
// ensures the adapters are not disposed by the |track_adapter_map_| as long
// as the webrtc layer track is in use by the webrtc layer stream.
RemoteAdapterRefs adapter_refs_;
base::WeakPtrFactory<RemoteWebRtcMediaStreamAdapter> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RemoteWebRtcMediaStreamAdapter);
};
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_WEBRTC_WEBRTC_MEDIA_STREAM_ADAPTER_H_