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..8cb39eb42d077c30c776148de2739f77b881fd50 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,60 @@ void ReturnVideoFrame(const scoped_refptr<VideoFrame>& video_frame, |
#endif |
} |
+class VideoCaptureGpuJpegDecoderFactory |
+ : public VideoCaptureJpegDecoderFactory { |
+ public: |
+ VideoCaptureGpuJpegDecoderFactory( |
+ const VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) |
+ : decode_done_cb_(decode_done_cb) {} |
+ |
+ std::unique_ptr<VideoCaptureJpegDecoder> CreateJpegDecoder() override { |
+ return base::MakeUnique<VideoCaptureGpuJpegDecoder>(decode_done_cb_); |
+ } |
+ |
+ private: |
+ VideoCaptureJpegDecoder::DecodeDoneCB decode_done_cb_; |
+}; |
+ |
+// Decorator for VideoFrameReceiver that forwards all incoming calls |
+// to the Browser IO thread. |
+class PostOnBrowserIoThreadDecorator : public VideoFrameReceiver { |
emircan
2016/09/08 19:57:56
VideoFrameReceiverOnIOThread?
mcasas
2016/09/08 20:25:45
IOThread is written with IO in uppercase.
(grep -
chfremer
2016/09/09 00:55:38
Thanks for both of the suggestions.
I hope you are
|
+ public: |
+ PostOnBrowserIoThreadDecorator( |
+ const base::WeakPtr<VideoFrameReceiver>& receiver) |
+ : receiver_(receiver) {} |
+ |
+ void OnIncomingCapturedVideoFrame( |
+ 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, |
+ base::Bind(&VideoFrameReceiver::OnBufferDestroyed, |
+ receiver_, buffer_id_to_drop)); |
+ } |
+ |
+ private: |
+ base::WeakPtr<VideoFrameReceiver> receiver_; |
+}; |
+ |
} // anonymous namespace |
struct VideoCaptureController::ControllerClient { |
@@ -148,7 +203,13 @@ std::unique_ptr<media::VideoCaptureDevice::Client> |
VideoCaptureController::NewDeviceClient() { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
return base::MakeUnique<VideoCaptureDeviceClient>( |
- this->GetWeakPtrForIOThread(), buffer_pool_); |
+ base::MakeUnique<PostOnBrowserIoThreadDecorator>( |
+ this->GetWeakPtrForIOThread()), |
+ buffer_pool_, |
+ base::MakeUnique<VideoCaptureGpuJpegDecoderFactory>( |
+ base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, |
+ this->GetWeakPtrForIOThread())), |
emircan
2016/09/08 19:57:56
Passing a callback would be easier to follow here
chfremer
2016/09/09 00:55:38
Interesting. I feel the exact opposite way about t
|
+ base::Bind([]() { DCHECK_CURRENTLY_ON(BrowserThread::IO); })); |
} |
void VideoCaptureController::AddClient( |
@@ -354,7 +415,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 +486,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 +497,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_) { |