| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/android/stream_texture_wrapper_impl.h" | 5 #include "content/renderer/media/android/stream_texture_wrapper_impl.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "cc/layers/video_frame_provider.h" | 8 #include "cc/layers/video_frame_provider.h" |
| 9 #include "gpu/GLES2/gl2extchromium.h" | 9 #include "gpu/GLES2/gl2extchromium.h" |
| 10 #include "gpu/command_buffer/client/gles2_interface.h" | 10 #include "gpu/command_buffer/client/gles2_interface.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 void StreamTextureWrapperImpl::UpdateTextureSize(const gfx::Size& new_size) { | 122 void StreamTextureWrapperImpl::UpdateTextureSize(const gfx::Size& new_size) { |
| 123 DVLOG(2) << __func__; | 123 DVLOG(2) << __func__; |
| 124 | 124 |
| 125 if (!main_task_runner_->BelongsToCurrentThread()) { | 125 if (!main_task_runner_->BelongsToCurrentThread()) { |
| 126 main_task_runner_->PostTask( | 126 main_task_runner_->PostTask( |
| 127 FROM_HERE, base::Bind(&StreamTextureWrapperImpl::UpdateTextureSize, | 127 FROM_HERE, base::Bind(&StreamTextureWrapperImpl::UpdateTextureSize, |
| 128 weak_factory_.GetWeakPtr(), new_size)); | 128 weak_factory_.GetWeakPtr(), new_size)); |
| 129 return; | 129 return; |
| 130 } | 130 } |
| 131 | 131 |
| 132 // InitializeOnMainThread() hasn't run, or failed. |
| 133 if (!stream_texture_proxy_) |
| 134 return; |
| 135 |
| 132 if (natural_size_ == new_size) | 136 if (natural_size_ == new_size) |
| 133 return; | 137 return; |
| 134 | 138 |
| 135 natural_size_ = new_size; | 139 natural_size_ = new_size; |
| 136 | 140 |
| 137 ReallocateVideoFrame(new_size); | 141 ReallocateVideoFrame(new_size); |
| 138 stream_texture_proxy_->SetStreamTextureSize(new_size); | 142 stream_texture_proxy_->SetStreamTextureSize(new_size); |
| 139 } | 143 } |
| 140 | 144 |
| 141 void StreamTextureWrapperImpl::Initialize( | 145 void StreamTextureWrapperImpl::Initialize( |
| 142 const base::Closure& received_frame_cb, | 146 const base::Closure& received_frame_cb, |
| 143 const gfx::Size& natural_size, | 147 const gfx::Size& natural_size, |
| 144 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, | 148 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner, |
| 145 const base::Closure& init_cb) { | 149 const StreamTextureWrapperInitCB& init_cb) { |
| 146 DVLOG(2) << __func__; | 150 DVLOG(2) << __func__; |
| 147 | 151 |
| 148 compositor_task_runner_ = compositor_task_runner; | 152 compositor_task_runner_ = compositor_task_runner; |
| 149 natural_size_ = natural_size; | 153 natural_size_ = natural_size; |
| 150 | 154 |
| 151 main_task_runner_->PostTask( | 155 main_task_runner_->PostTask( |
| 152 FROM_HERE, base::Bind(&StreamTextureWrapperImpl::InitializeOnMainThread, | 156 FROM_HERE, base::Bind(&StreamTextureWrapperImpl::InitializeOnMainThread, |
| 153 weak_factory_.GetWeakPtr(), received_frame_cb, | 157 weak_factory_.GetWeakPtr(), received_frame_cb, |
| 154 media::BindToCurrentLoop(init_cb))); | 158 media::BindToCurrentLoop(init_cb))); |
| 155 } | 159 } |
| 156 | 160 |
| 157 void StreamTextureWrapperImpl::InitializeOnMainThread( | 161 void StreamTextureWrapperImpl::InitializeOnMainThread( |
| 158 const base::Closure& received_frame_cb, | 162 const base::Closure& received_frame_cb, |
| 159 const base::Closure& init_cb) { | 163 const StreamTextureWrapperInitCB& init_cb) { |
| 160 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 164 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
| 161 DVLOG(2) << __func__; | 165 DVLOG(2) << __func__; |
| 162 | 166 |
| 163 stream_texture_proxy_ = factory_->CreateProxy( | 167 stream_texture_proxy_ = factory_->CreateProxy( |
| 164 kGLTextureExternalOES, &texture_id_, &texture_mailbox_); | 168 kGLTextureExternalOES, &texture_id_, &texture_mailbox_); |
| 165 if (!stream_texture_proxy_) | 169 if (!stream_texture_proxy_) { |
| 170 init_cb.Run(false); |
| 166 return; | 171 return; |
| 172 } |
| 167 | 173 |
| 168 ReallocateVideoFrame(natural_size_); | 174 ReallocateVideoFrame(natural_size_); |
| 169 | 175 |
| 170 stream_texture_proxy_->BindToTaskRunner(received_frame_cb, | 176 stream_texture_proxy_->BindToTaskRunner(received_frame_cb, |
| 171 compositor_task_runner_); | 177 compositor_task_runner_); |
| 172 | 178 |
| 173 // TODO(tguilbert): Register the surface properly. See crbug.com/627658. | 179 init_cb.Run(true); |
| 174 | |
| 175 // |init_cb| is bound to the thread that originally called Initialize(). | |
| 176 init_cb.Run(); | |
| 177 } | 180 } |
| 178 | 181 |
| 179 void StreamTextureWrapperImpl::Destroy() { | 182 void StreamTextureWrapperImpl::Destroy() { |
| 180 // Note: StreamTextureProxy stop calling back the provided frame received | 183 // Note: StreamTextureProxy stop calling back the provided frame received |
| 181 // callback immediately, and delete itself on the right thread. | 184 // callback immediately, and delete itself on the right thread. |
| 182 stream_texture_proxy_.reset(); | 185 stream_texture_proxy_.reset(); |
| 183 | 186 |
| 184 if (!main_task_runner_->BelongsToCurrentThread()) { | 187 if (!main_task_runner_->BelongsToCurrentThread()) { |
| 185 // base::Unretained is safe here because this function is the only one that | 188 // base::Unretained is safe here because this function is the only one that |
| 186 // can can call delete. | 189 // can can call delete. |
| 187 main_task_runner_->PostTask( | 190 main_task_runner_->PostTask( |
| 188 FROM_HERE, | 191 FROM_HERE, |
| 189 base::Bind(&StreamTextureWrapperImpl::Destroy, base::Unretained(this))); | 192 base::Bind(&StreamTextureWrapperImpl::Destroy, base::Unretained(this))); |
| 190 return; | 193 return; |
| 191 } | 194 } |
| 192 | 195 |
| 193 delete this; | 196 delete this; |
| 194 } | 197 } |
| 195 | 198 |
| 196 } // namespace content | 199 } // namespace content |
| OLD | NEW |