Chromium Code Reviews| Index: remoting/client/jni/jni_gl_display_handler.cc |
| diff --git a/remoting/client/jni/jni_gl_display_handler.cc b/remoting/client/jni/jni_gl_display_handler.cc |
| index 85c0641e79384e73e8776fcb1caf67fcd38e4d66..118c60b5f12f10c170336be1f0d59676a6a600ac 100644 |
| --- a/remoting/client/jni/jni_gl_display_handler.cc |
| +++ b/remoting/client/jni/jni_gl_display_handler.cc |
| @@ -41,6 +41,9 @@ class JniGlDisplayHandler::Core : public protocol::CursorShapeStub, |
| // thread but no more than once. |
| std::unique_ptr<protocol::FrameConsumer> GrabFrameConsumer(); |
| + void OnFrameReceived(std::unique_ptr<webrtc::DesktopFrame> frame, |
| + const base::Closure& done); |
| + |
| void SurfaceCreated(base::android::ScopedJavaGlobalRef<jobject> surface); |
| void SurfaceChanged(int width, int height); |
| void SurfaceDestroyed(); |
| @@ -53,6 +56,9 @@ class JniGlDisplayHandler::Core : public protocol::CursorShapeStub, |
| base::WeakPtr<Core> GetWeakPtr(); |
| private: |
| + // Initializes the core on the display thread. Can be called on any thread. |
| + void Initialize(); |
| + |
| ChromotingJniRuntime* runtime_; |
| base::WeakPtr<JniGlDisplayHandler> shell_; |
| @@ -75,11 +81,11 @@ class JniGlDisplayHandler::Core : public protocol::CursorShapeStub, |
| JniGlDisplayHandler::Core::Core(ChromotingJniRuntime* runtime, |
| base::WeakPtr<JniGlDisplayHandler> shell) |
| : runtime_(runtime), shell_(shell), weak_factory_(this) { |
| - renderer_ = GlRenderer::CreateGlRendererWithDesktop(); |
| weak_ptr_ = weak_factory_.GetWeakPtr(); |
| - renderer_->SetDelegate(weak_ptr_); |
| + Initialize(); |
|
Sergey Ulanov
2017/01/18 22:33:40
runtime_->display_task_runner()->PostTask(
Yuwei
2017/01/18 23:11:56
Since we still need the weak pointer for other pur
Sergey Ulanov
2017/01/18 23:32:43
The "Core" class used here to switch to a differen
Yuwei
2017/01/19 00:27:33
Acknowledged. Done.
|
| + // Do not bind GlRenderer::OnFrameReceived. |renderer_| is not ready yet. |
| owned_frame_consumer_.reset(new DualBufferFrameConsumer( |
| - base::Bind(&GlRenderer::OnFrameReceived, renderer_->GetWeakPtr()), |
| + base::Bind(&JniGlDisplayHandler::Core::OnFrameReceived, weak_ptr_), |
| runtime_->display_task_runner(), |
| protocol::FrameConsumer::PixelFormat::FORMAT_RGBA)); |
| frame_consumer_ = owned_frame_consumer_->GetWeakPtr(); |
| @@ -118,6 +124,13 @@ JniGlDisplayHandler::Core::GrabFrameConsumer() { |
| return std::move(owned_frame_consumer_); |
| } |
| +void JniGlDisplayHandler::Core::OnFrameReceived( |
| + std::unique_ptr<webrtc::DesktopFrame> frame, |
| + const base::Closure& done) { |
| + DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
| + renderer_->OnFrameReceived(std::move(frame), done); |
| +} |
| + |
| void JniGlDisplayHandler::Core::SurfaceCreated( |
| base::android::ScopedJavaGlobalRef<jobject> surface) { |
| DCHECK(runtime_->display_task_runner()->BelongsToCurrentThread()); |
| @@ -180,6 +193,18 @@ JniGlDisplayHandler::Core::GetWeakPtr() { |
| return weak_ptr_; |
| } |
| +void JniGlDisplayHandler::Core::Initialize() { |
| + if (!runtime_->display_task_runner()->BelongsToCurrentThread()) { |
|
Sergey Ulanov
2017/01/18 22:33:40
PostTask in the constructor and replace this code
Yuwei
2017/01/19 00:27:33
Done.
|
| + runtime_->display_task_runner()->PostTask( |
| + FROM_HERE, base::Bind(&JniGlDisplayHandler::Core::Initialize, |
| + weak_ptr_)); |
|
Sergey Ulanov
2017/01/18 22:33:40
Don't need to use weak pointer here because Core i
Yuwei
2017/01/19 00:27:33
Done.
|
| + return; |
| + } |
| + |
| + renderer_ = GlRenderer::CreateGlRendererWithDesktop(); |
| + renderer_->SetDelegate(weak_ptr_); |
| +} |
| + |
| // Shell implementations. |
| JniGlDisplayHandler::JniGlDisplayHandler( |