blob: 91b929401c13a81ebe0afe47619204f5faac1c43 [file] [log] [blame]
// Copyright (c) 2012 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_REMOTE_MEDIA_STREAM_IMPL_H_
#define CONTENT_RENDERER_MEDIA_REMOTE_MEDIA_STREAM_IMPL_H_
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_checker.h"
#include "content/common/content_export.h"
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
namespace content {
class RemoteAudioTrackAdapter;
class RemoteVideoTrackAdapter;
// RemoteMediaStreamImpl serves as a container and glue between remote webrtc
// MediaStreams and WebKit MediaStreams. For each remote MediaStream received
// on a PeerConnection a RemoteMediaStreamImpl instance is created and
// owned by RtcPeerConnection.
class CONTENT_EXPORT RemoteMediaStreamImpl {
public:
RemoteMediaStreamImpl(
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
webrtc::MediaStreamInterface* webrtc_stream);
~RemoteMediaStreamImpl();
const blink::WebMediaStream& webkit_stream() { return webkit_stream_; }
const scoped_refptr<webrtc::MediaStreamInterface>& webrtc_stream() {
return observer_->stream();
}
private:
typedef std::vector<scoped_refptr<RemoteAudioTrackAdapter>>
RemoteAudioTrackAdapters;
typedef std::vector<scoped_refptr<RemoteVideoTrackAdapter>>
RemoteVideoTrackAdapters;
void InitializeOnMainThread(const std::string& label);
class Observer
: NON_EXPORTED_BASE(public webrtc::ObserverInterface),
public base::RefCountedThreadSafe<Observer> {
public:
Observer(const base::WeakPtr<RemoteMediaStreamImpl>& media_stream,
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
webrtc::MediaStreamInterface* webrtc_stream);
const scoped_refptr<webrtc::MediaStreamInterface>& stream() const {
return webrtc_stream_;
}
const scoped_refptr<base::SingleThreadTaskRunner>& main_thread() const {
return main_thread_;
}
void InitializeOnMainThread(const std::string& label);
// Uninitializes the observer, unregisteres from receiving notifications
// and releases the webrtc stream.
// Note: Must be called from the main thread before releasing the main
// reference.
void Unregister();
private:
friend class base::RefCountedThreadSafe<Observer>;
~Observer() override;
// webrtc::ObserverInterface implementation.
void OnChanged() override;
void OnChangedOnMainThread(
scoped_ptr<RemoteAudioTrackAdapters> audio_tracks,
scoped_ptr<RemoteVideoTrackAdapters> video_tracks);
base::WeakPtr<RemoteMediaStreamImpl> media_stream_;
const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
scoped_refptr<webrtc::MediaStreamInterface> webrtc_stream_;
};
void OnChanged(scoped_ptr<RemoteAudioTrackAdapters> audio_tracks,
scoped_ptr<RemoteVideoTrackAdapters> video_tracks);
const scoped_refptr<base::SingleThreadTaskRunner> signaling_thread_;
scoped_refptr<Observer> observer_;
RemoteVideoTrackAdapters video_track_observers_;
RemoteAudioTrackAdapters audio_track_observers_;
blink::WebMediaStream webkit_stream_;
base::WeakPtrFactory<RemoteMediaStreamImpl> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamImpl);
};
} // namespace content
#endif // CONTENT_RENDERER_MEDIA_REMOTE_MEDIA_STREAM_IMPL_H_