Index: content/renderer/media/android/stream_texture_factory_impl.cc |
diff --git a/content/renderer/media/android/stream_texture_factory_impl.cc b/content/renderer/media/android/stream_texture_factory_impl.cc |
index da9a70f4ba732222b0af8b9adad6228310af8d78..0699e714c2921d0eb34beb6888cf21a7bc7f2adb 100644 |
--- a/content/renderer/media/android/stream_texture_factory_impl.cc |
+++ b/content/renderer/media/android/stream_texture_factory_impl.cc |
@@ -22,8 +22,9 @@ class StreamTextureProxyImpl : public StreamTextureProxy, |
virtual ~StreamTextureProxyImpl(); |
// StreamTextureProxy implementation: |
- virtual void BindToCurrentThread(int32 stream_id) OVERRIDE; |
- virtual void SetClient(cc::VideoFrameProvider::Client* client) OVERRIDE; |
+ virtual void BindToLoop(int32 stream_id, |
+ cc::VideoFrameProvider::Client* client, |
+ scoped_refptr<base::MessageLoopProxy> loop) OVERRIDE; |
virtual void Release() OVERRIDE; |
// StreamTextureHost::Listener implementation: |
@@ -31,10 +32,13 @@ class StreamTextureProxyImpl : public StreamTextureProxy, |
virtual void OnMatrixChanged(const float matrix[16]) OVERRIDE; |
private: |
- scoped_ptr<StreamTextureHost> host_; |
- scoped_refptr<base::MessageLoopProxy> loop_; |
+ void SetClient(cc::VideoFrameProvider::Client* client); |
+ void BindOnThread(int32 stream_id, cc::VideoFrameProvider::Client* client); |
+ |
+ const scoped_ptr<StreamTextureHost> host_; |
- base::Lock client_lock_; |
+ base::Lock lock_; |
+ scoped_refptr<base::MessageLoopProxy> loop_; |
cc::VideoFrameProvider::Client* client_; |
DISALLOW_IMPLICIT_CONSTRUCTORS(StreamTextureProxyImpl); |
@@ -46,31 +50,54 @@ StreamTextureProxyImpl::StreamTextureProxyImpl(StreamTextureHost* host) |
StreamTextureProxyImpl::~StreamTextureProxyImpl() {} |
void StreamTextureProxyImpl::Release() { |
- SetClient(NULL); |
- if (loop_.get() && loop_.get() != base::MessageLoopProxy::current()) |
- loop_->DeleteSoon(FROM_HERE, this); |
- else |
+ base::AutoLock lock(lock_); |
+ client_ = NULL; |
+ if (!loop_.get() || loop_.get() != base::MessageLoopProxy::current() || |
qinmin
2014/09/15 17:16:26
so if loop_.get() != base::MessageLoopProxy::curre
boliu
2014/09/15 17:54:07
Done.
|
+ !loop_->DeleteSoon(FROM_HERE, this)) { |
delete this; |
+ } |
} |
-void StreamTextureProxyImpl::SetClient(cc::VideoFrameProvider::Client* client) { |
- base::AutoLock lock(client_lock_); |
- client_ = client; |
+void StreamTextureProxyImpl::BindToLoop( |
+ int32 stream_id, |
+ cc::VideoFrameProvider::Client* client, |
+ scoped_refptr<base::MessageLoopProxy> loop) { |
+ base::AutoLock lock(lock_); |
+ DCHECK(loop.get()); |
+ loop_ = loop; |
+ |
+ if (loop.get() != base::MessageLoopProxy::current()) { |
qinmin
2014/09/15 17:16:26
It doesn't seem to me that we will ever enter this
boliu
2014/09/15 17:54:07
Umm....webview will get here, but webview doesn't
|
+ // Unretained is safe here only because the object is deleted on |loop_| |
+ // thread. |
+ loop->PostTask(FROM_HERE, |
+ base::Bind(&StreamTextureProxyImpl::BindOnThread, |
+ base::Unretained(this), |
+ stream_id, |
+ client)); |
+ } else { |
+ client_ = client; |
+ host_->BindToCurrentThread(stream_id, this); |
+ } |
} |
-void StreamTextureProxyImpl::BindToCurrentThread(int stream_id) { |
- loop_ = base::MessageLoopProxy::current(); |
+void StreamTextureProxyImpl::BindOnThread( |
+ int32 stream_id, |
+ cc::VideoFrameProvider::Client* client) { |
+ { |
+ base::AutoLock lock(lock_); |
+ client_ = client; |
+ } |
host_->BindToCurrentThread(stream_id, this); |
} |
void StreamTextureProxyImpl::OnFrameAvailable() { |
- base::AutoLock lock(client_lock_); |
+ base::AutoLock lock(lock_); |
if (client_) |
client_->DidReceiveFrame(); |
} |
void StreamTextureProxyImpl::OnMatrixChanged(const float matrix[16]) { |
- base::AutoLock lock(client_lock_); |
+ base::AutoLock lock(lock_); |
if (client_) |
client_->DidUpdateMatrix(matrix); |
} |
@@ -134,4 +161,12 @@ gpu::gles2::GLES2Interface* StreamTextureFactoryImpl::ContextGL() { |
return context_provider_->ContextGL(); |
} |
+void StreamTextureFactoryImpl::AddObserver( |
+ StreamTextureFactoryContextObserver* obs) { |
+} |
+ |
+void StreamTextureFactoryImpl::RemoveObserver( |
+ StreamTextureFactoryContextObserver* obs) { |
+} |
+ |
} // namespace content |