| 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 5957ce9280cadf292ddecff177fae89587605191..c922822fd2980abbed28ed4140d4851c3cca041e 100644
|
| --- a/content/browser/renderer_host/media/video_capture_controller.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_controller.cc
|
| @@ -20,6 +20,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"
|
| @@ -78,6 +79,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 VideoFrameReceiverOnIOThread : public VideoFrameReceiver {
|
| + public:
|
| + explicit VideoFrameReceiverOnIOThread(
|
| + 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 {
|
| @@ -131,7 +176,7 @@ struct VideoCaptureController::ControllerClient {
|
| };
|
|
|
| VideoCaptureController::VideoCaptureController(int max_buffers)
|
| - : buffer_pool_(new VideoCaptureBufferPool(max_buffers)),
|
| + : buffer_pool_(new VideoCaptureBufferPoolImpl(max_buffers)),
|
| state_(VIDEO_CAPTURE_STATE_STARTED),
|
| has_received_frames_(false),
|
| weak_ptr_factory_(this) {
|
| @@ -147,7 +192,12 @@ std::unique_ptr<media::VideoCaptureDevice::Client>
|
| VideoCaptureController::NewDeviceClient() {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| return base::MakeUnique<VideoCaptureDeviceClient>(
|
| - this->GetWeakPtrForIOThread(), buffer_pool_);
|
| + base::MakeUnique<VideoFrameReceiverOnIOThread>(
|
| + this->GetWeakPtrForIOThread()),
|
| + buffer_pool_,
|
| + base::Bind(&CreateGpuJpegDecoder,
|
| + base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame,
|
| + this->GetWeakPtrForIOThread())));
|
| }
|
|
|
| void VideoCaptureController::AddClient(
|
| @@ -353,7 +403,7 @@ VideoCaptureController::GetVideoCaptureFormat() const {
|
| VideoCaptureController::~VideoCaptureController() {
|
| }
|
|
|
| -void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
|
| +void VideoCaptureController::OnIncomingCapturedVideoFrame(
|
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer,
|
| const scoped_refptr<VideoFrame>& frame) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| @@ -424,7 +474,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;
|
|
|
| @@ -435,13 +485,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 (const auto& client : controller_clients_) {
|
|
|