X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcontent%2Frenderer%2Fmedia%2Fremote_media_stream_impl.h;h=0c230bac73fb3b43d173eb26032c2630efe21799;hb=1afa4dd80ef85af7c90efaea6959db1d92330844;hp=6b1554aff066465eeb37da516759f4e789031bd2;hpb=90762837333c13ccf56f2ad88e4481fc71e8d281;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/content/renderer/media/remote_media_stream_impl.h b/src/content/renderer/media/remote_media_stream_impl.h index 6b1554a..0c230ba 100644 --- a/src/content/renderer/media/remote_media_stream_impl.h +++ b/src/content/renderer/media/remote_media_stream_impl.h @@ -8,8 +8,10 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" -#include "base/memory/scoped_vector.h" -#include "base/threading/non_thread_safe.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/libjingle/source/talk/app/webrtc/mediastreaminterface.h" #include "third_party/WebKit/public/platform/WebMediaStream.h" @@ -18,29 +20,82 @@ namespace content { -class RemoteMediaStreamTrackAdapter; +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 - : NON_EXPORTED_BASE(public webrtc::ObserverInterface), - NON_EXPORTED_BASE(public base::NonThreadSafe) { +class CONTENT_EXPORT RemoteMediaStreamImpl { public: - explicit RemoteMediaStreamImpl( + RemoteMediaStreamImpl( + const scoped_refptr& main_thread, webrtc::MediaStreamInterface* webrtc_stream); - virtual ~RemoteMediaStreamImpl(); + ~RemoteMediaStreamImpl(); const blink::WebMediaStream& webkit_stream() { return webkit_stream_; } + const scoped_refptr& webrtc_stream() { + return observer_->stream(); + } private: - // webrtc::ObserverInterface implementation. - virtual void OnChanged() OVERRIDE; + typedef std::vector> + RemoteAudioTrackAdapters; + typedef std::vector> + RemoteVideoTrackAdapters; - scoped_refptr webrtc_stream_; - ScopedVector video_track_observers_; - ScopedVector audio_track_observers_; + void InitializeOnMainThread(const std::string& label); + + class Observer + : NON_EXPORTED_BASE(public webrtc::ObserverInterface), + public base::RefCountedThreadSafe { + public: + Observer(const base::WeakPtr& media_stream, + const scoped_refptr& main_thread, + webrtc::MediaStreamInterface* webrtc_stream); + + const scoped_refptr& stream() const { + return webrtc_stream_; + } + + const scoped_refptr& 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() override; + + // webrtc::ObserverInterface implementation. + void OnChanged() override; + + void OnChangedOnMainThread( + scoped_ptr audio_tracks, + scoped_ptr video_tracks); + + base::WeakPtr media_stream_; + const scoped_refptr main_thread_; + scoped_refptr webrtc_stream_; + }; + + void OnChanged(scoped_ptr audio_tracks, + scoped_ptr video_tracks); + + const scoped_refptr signaling_thread_; + base::WeakPtrFactory weak_factory_; + const scoped_refptr observer_; // must be after weak_factory_ + + RemoteVideoTrackAdapters video_track_observers_; + RemoteAudioTrackAdapters audio_track_observers_; blink::WebMediaStream webkit_stream_; DISALLOW_COPY_AND_ASSIGN(RemoteMediaStreamImpl);