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_) { |