OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/browser/renderer_host/media/video_capture_device_client.h" | 5 #include "content/browser/renderer_host/media/video_capture_device_client.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 | 165 |
166 // Creates some necessary members in |capture_task_runner_|. | 166 // Creates some necessary members in |capture_task_runner_|. |
167 void Init(); | 167 void Init(); |
168 // Runs the bottom half of the GlHelper creation. | 168 // Runs the bottom half of the GlHelper creation. |
169 void CreateGlHelper( | 169 void CreateGlHelper( |
170 scoped_refptr<ContextProviderCommandBuffer> capture_thread_context); | 170 scoped_refptr<ContextProviderCommandBuffer> capture_thread_context); |
171 | 171 |
172 // Recycles |memory_buffer|, deletes Image and Texture on VideoFrame release. | 172 // Recycles |memory_buffer|, deletes Image and Texture on VideoFrame release. |
173 void ReleaseCallback(const std::vector<GLuint>& image_ids, | 173 void ReleaseCallback(const std::vector<GLuint>& image_ids, |
174 const std::vector<GLuint>& texture_ids, | 174 const std::vector<GLuint>& texture_ids, |
175 uint32 sync_point); | 175 uint32 sync_point, |
| 176 const gpu::SyncToken& sync_token); |
176 | 177 |
177 // The Command Buffer lost the GL context, f.i. GPU process crashed. Signal | 178 // The Command Buffer lost the GL context, f.i. GPU process crashed. Signal |
178 // error to our owner so the capture can be torn down. | 179 // error to our owner so the capture can be torn down. |
179 void LostContextCallback(); | 180 void LostContextCallback(); |
180 | 181 |
181 // Prints the error |message| and notifies |controller_| of an error. | 182 // Prints the error |message| and notifies |controller_| of an error. |
182 void OnError(const std::string& message); | 183 void OnError(const std::string& message); |
183 | 184 |
184 // |controller_| should only be used on IO thread. | 185 // |controller_| should only be used on IO thread. |
185 const base::WeakPtr<VideoCaptureController> controller_; | 186 const base::WeakPtr<VideoCaptureController> controller_; |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 texture_id); | 642 texture_id); |
642 gl->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id); | 643 gl->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id); |
643 } | 644 } |
644 texture_ids.push_back(texture_id); | 645 texture_ids.push_back(texture_id); |
645 | 646 |
646 const gpu::MailboxHolder& mailbox_holder( | 647 const gpu::MailboxHolder& mailbox_holder( |
647 gl_helper_->ProduceMailboxHolderFromTexture(texture_id)); | 648 gl_helper_->ProduceMailboxHolderFromTexture(texture_id)); |
648 DCHECK(!mailbox_holder.mailbox.IsZero()); | 649 DCHECK(!mailbox_holder.mailbox.IsZero()); |
649 DCHECK(mailbox_holder.mailbox.Verify()); | 650 DCHECK(mailbox_holder.mailbox.Verify()); |
650 DCHECK(mailbox_holder.texture_target); | 651 DCHECK(mailbox_holder.texture_target); |
651 DCHECK(mailbox_holder.sync_point); | 652 DCHECK(mailbox_holder.sync_point || mailbox_holder.sync_token.HasData()); |
652 mailbox_holders.push_back(mailbox_holder); | 653 mailbox_holders.push_back(mailbox_holder); |
653 } | 654 } |
654 | 655 |
655 scoped_refptr<media::VideoFrame> video_frame = | 656 scoped_refptr<media::VideoFrame> video_frame = |
656 VideoFrame::WrapYUV420NativeTextures( | 657 VideoFrame::WrapYUV420NativeTextures( |
657 mailbox_holders[VideoFrame::kYPlane], | 658 mailbox_holders[VideoFrame::kYPlane], |
658 mailbox_holders[VideoFrame::kUPlane], | 659 mailbox_holders[VideoFrame::kUPlane], |
659 mailbox_holders[VideoFrame::kVPlane], | 660 mailbox_holders[VideoFrame::kVPlane], |
660 media::BindToCurrentLoop(base::Bind( | 661 media::BindToCurrentLoop(base::Bind( |
661 &VideoCaptureDeviceClient::TextureWrapHelper::ReleaseCallback, | 662 &VideoCaptureDeviceClient::TextureWrapHelper::ReleaseCallback, |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 // At this point, |capture_thread_context| is a cc::ContextProvider. Creation | 733 // At this point, |capture_thread_context| is a cc::ContextProvider. Creation |
733 // of our GLHelper should happen on Capture Thread. | 734 // of our GLHelper should happen on Capture Thread. |
734 gl_helper_.reset(new GLHelper(capture_thread_context->ContextGL(), | 735 gl_helper_.reset(new GLHelper(capture_thread_context->ContextGL(), |
735 capture_thread_context->ContextSupport())); | 736 capture_thread_context->ContextSupport())); |
736 DCHECK(gl_helper_); | 737 DCHECK(gl_helper_); |
737 } | 738 } |
738 | 739 |
739 void VideoCaptureDeviceClient::TextureWrapHelper::ReleaseCallback( | 740 void VideoCaptureDeviceClient::TextureWrapHelper::ReleaseCallback( |
740 const std::vector<GLuint>& image_ids, | 741 const std::vector<GLuint>& image_ids, |
741 const std::vector<GLuint>& texture_ids, | 742 const std::vector<GLuint>& texture_ids, |
742 uint32 sync_point) { | 743 uint32 sync_point, |
| 744 const gpu::SyncToken& sync_token) { |
743 DCHECK(capture_task_runner_->BelongsToCurrentThread()); | 745 DCHECK(capture_task_runner_->BelongsToCurrentThread()); |
744 DCHECK_EQ(image_ids.size(), texture_ids.size()); | 746 DCHECK_EQ(image_ids.size(), texture_ids.size()); |
745 | 747 |
746 if (!gl_helper_) | 748 if (!gl_helper_) |
747 return; | 749 return; |
748 for (size_t i = 0; i < image_ids.size(); ++i) { | 750 for (size_t i = 0; i < image_ids.size(); ++i) { |
749 gl_helper_->DeleteTexture(texture_ids[i]); | 751 gl_helper_->DeleteTexture(texture_ids[i]); |
750 capture_thread_context_->ContextGL()->DestroyImageCHROMIUM(image_ids[i]); | 752 capture_thread_context_->ContextGL()->DestroyImageCHROMIUM(image_ids[i]); |
751 } | 753 } |
752 } | 754 } |
753 | 755 |
754 void VideoCaptureDeviceClient::TextureWrapHelper::LostContextCallback() { | 756 void VideoCaptureDeviceClient::TextureWrapHelper::LostContextCallback() { |
755 DCHECK(capture_task_runner_->BelongsToCurrentThread()); | 757 DCHECK(capture_task_runner_->BelongsToCurrentThread()); |
756 // Prevent incoming frames from being processed while OnError gets groked. | 758 // Prevent incoming frames from being processed while OnError gets groked. |
757 gl_helper_.reset(); | 759 gl_helper_.reset(); |
758 OnError("GLContext lost"); | 760 OnError("GLContext lost"); |
759 } | 761 } |
760 | 762 |
761 void VideoCaptureDeviceClient::TextureWrapHelper::OnError( | 763 void VideoCaptureDeviceClient::TextureWrapHelper::OnError( |
762 const std::string& message) { | 764 const std::string& message) { |
763 DCHECK(capture_task_runner_->BelongsToCurrentThread()); | 765 DCHECK(capture_task_runner_->BelongsToCurrentThread()); |
764 DLOG(ERROR) << message; | 766 DLOG(ERROR) << message; |
765 BrowserThread::PostTask( | 767 BrowserThread::PostTask( |
766 BrowserThread::IO, FROM_HERE, | 768 BrowserThread::IO, FROM_HERE, |
767 base::Bind(&VideoCaptureController::DoErrorOnIOThread, controller_)); | 769 base::Bind(&VideoCaptureController::DoErrorOnIOThread, controller_)); |
768 } | 770 } |
769 | 771 |
770 } // namespace content | 772 } // namespace content |
OLD | NEW |