Chromium Code Reviews| Index: content/browser/renderer_host/media/video_capture_controller.cc |
| diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc |
| index d72cb3dea7174a2c64f229300efd8ebc70817c54..df225b24e75d7f25ffb2fb8e6d195488660d73d0 100644 |
| --- a/content/browser/renderer_host/media/video_capture_controller.cc |
| +++ b/content/browser/renderer_host/media/video_capture_controller.cc |
| @@ -21,6 +21,7 @@ |
| #include "content/browser/renderer_host/media/media_stream_manager.h" |
| #include "content/browser/renderer_host/media/video_capture_buffer_pool.h" |
| #include "content/browser/renderer_host/media/video_capture_device_client.h" |
| +#include "content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.h" |
| #include "content/browser/renderer_host/media/video_capture_manager.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/common/content_switches.h" |
| @@ -79,6 +80,50 @@ void ReturnVideoFrame(const scoped_refptr<VideoFrame>& video_frame, |
| #endif |
| } |
| +std::unique_ptr<VideoCaptureJpegDecoder> CreateGpuJpegDecoder( |
| + const VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) { |
| + return base::MakeUnique<VideoCaptureGpuJpegDecoder>(decode_done_cb); |
| +} |
| + |
| +// Decorator for VideoFrameReceiver that forwards all incoming calls |
| +// to the Browser IO thread. |
| +class PostOnIOThreadVideoFrameReceiver : public VideoFrameReceiver { |
| + public: |
| + PostOnIOThreadVideoFrameReceiver( |
|
miu
2016/09/13 00:33:29
Sorry, didn't see this the last time around: Pleas
chfremer
2016/09/14 16:26:01
Done.
|
| + const base::WeakPtr<VideoFrameReceiver>& receiver) |
| + : receiver_(receiver) {} |
| + |
| + void OnIncomingCapturedVideoFrame( |
|
miu
2016/09/12 20:16:46
Please use base::ThreadChecker to ensure all these
chfremer
2016/09/12 22:23:33
Hmm, I am not sure I agree that this would be an i
miu
2016/09/13 00:33:29
Generally, in Chromium code, we try to adhere to t
chfremer
2016/09/14 16:26:01
Thanks. This insight is super useful for me learni
miu
2016/09/16 21:10:25
There is variance in styles/attitudes, depending o
chfremer
2016/09/17 00:09:21
Thanks for this explanation, which I find helpful.
|
| + std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
| + const scoped_refptr<media::VideoFrame>& frame) override { |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, receiver_, |
| + base::Passed(&buffer), frame)); |
| + } |
| + |
| + void OnError() override { |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&VideoFrameReceiver::OnError, receiver_)); |
| + } |
| + |
| + void OnLog(const std::string& message) override { |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&VideoFrameReceiver::OnLog, receiver_, message)); |
| + } |
| + |
| + void OnBufferDestroyed(int buffer_id_to_drop) override { |
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
|
miu
2016/09/12 20:16:46
This makes me wonder whether receiver_ needs to be
chfremer
2016/09/12 22:23:33
Thanks. This is an interesting question.
I haven't
chfremer
2016/09/14 16:26:01
After thinking about it more carefully, I don't th
miu
2016/09/16 21:10:25
What I was thinking (I now realize is not quite ri
chfremer
2016/09/17 00:09:21
Yes, that is exactly right. Adding the decorator b
|
| + base::Bind(&VideoFrameReceiver::OnBufferDestroyed, |
| + receiver_, buffer_id_to_drop)); |
| + } |
| + |
| + private: |
| + base::WeakPtr<VideoFrameReceiver> receiver_; |
| +}; |
| + |
| } // anonymous namespace |
| struct VideoCaptureController::ControllerClient { |
| @@ -148,7 +193,12 @@ std::unique_ptr<media::VideoCaptureDevice::Client> |
| VideoCaptureController::NewDeviceClient() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| return base::MakeUnique<VideoCaptureDeviceClient>( |
| - this->GetWeakPtrForIOThread(), buffer_pool_); |
| + base::MakeUnique<PostOnIOThreadVideoFrameReceiver>( |
| + this->GetWeakPtrForIOThread()), |
| + buffer_pool_, |
| + base::Bind(&CreateGpuJpegDecoder, |
| + base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, |
| + this->GetWeakPtrForIOThread()))); |
| } |
| void VideoCaptureController::AddClient( |
| @@ -354,7 +404,7 @@ VideoCaptureController::~VideoCaptureController() { |
| controller_clients_.end()); |
| } |
| -void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread( |
| +void VideoCaptureController::OnIncomingCapturedVideoFrame( |
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
| const scoped_refptr<VideoFrame>& frame) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| @@ -425,7 +475,7 @@ void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread( |
| buffer_pool_->HoldForConsumers(buffer_id, count); |
| } |
| -void VideoCaptureController::DoErrorOnIOThread() { |
| +void VideoCaptureController::OnError() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| state_ = VIDEO_CAPTURE_STATE_ERROR; |
| @@ -436,13 +486,12 @@ void VideoCaptureController::DoErrorOnIOThread() { |
| } |
| } |
| -void VideoCaptureController::DoLogOnIOThread(const std::string& message) { |
| +void VideoCaptureController::OnLog(const std::string& message) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| MediaStreamManager::SendMessageToNativeLog("Video capture: " + message); |
| } |
| -void VideoCaptureController::DoBufferDestroyedOnIOThread( |
| - int buffer_id_to_drop) { |
| +void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| for (auto* client : controller_clients_) { |