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 5f226b65422b880d21a94c1fe6795ede553eb2a5..ba64d2534d59785ac49e02ff27aba7a2610052df 100644 |
| --- a/content/browser/renderer_host/media/video_capture_controller.cc |
| +++ b/content/browser/renderer_host/media/video_capture_controller.cc |
| @@ -18,12 +18,11 @@ |
| #include "build/build_config.h" |
| #include "components/display_compositor/gl_helper.h" |
| #include "content/browser/renderer_host/media/media_stream_manager.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" |
| #include "media/base/video_frame.h" |
| -#include "media/capture/video/video_capture_buffer_pool_impl.h" |
| +#include "media/capture/video/video_capture_buffer_pool.h" |
| #include "media/capture/video/video_capture_buffer_tracker_factory_impl.h" |
| #include "media/capture/video/video_capture_device_client.h" |
| @@ -46,50 +45,6 @@ static const int kInfiniteRatio = 99999; |
| name, \ |
| (height) ? ((width) * 100) / (height) : kInfiniteRatio); |
| -std::unique_ptr<media::VideoCaptureJpegDecoder> CreateGpuJpegDecoder( |
| - const media::VideoCaptureJpegDecoder::DecodeDoneCB& decode_done_cb) { |
| - return base::MakeUnique<VideoCaptureGpuJpegDecoder>(decode_done_cb); |
| -} |
| - |
| -// Decorator for media::VideoFrameReceiver that forwards all incoming calls |
| -// to the Browser IO thread. |
| -class VideoFrameReceiverOnIOThread : public media::VideoFrameReceiver { |
| - public: |
| - explicit VideoFrameReceiverOnIOThread( |
| - const base::WeakPtr<VideoFrameReceiver>& receiver) |
| - : receiver_(receiver) {} |
| - |
| - void OnIncomingCapturedVideoFrame( |
| - std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
| - scoped_refptr<media::VideoFrame> frame) override { |
| - BrowserThread::PostTask( |
| - BrowserThread::IO, FROM_HERE, |
| - base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, receiver_, |
| - base::Passed(&buffer), std::move(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 { |
| @@ -140,12 +95,12 @@ VideoCaptureController::BufferState::BufferState( |
| int buffer_id, |
| int frame_feedback_id, |
| media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, |
| - scoped_refptr<media::VideoCaptureBufferPool> buffer_pool, |
| + media::FrameBufferPool* frame_buffer_pool, |
| scoped_refptr<media::VideoFrame> frame) |
| : buffer_id_(buffer_id), |
| frame_feedback_id_(frame_feedback_id), |
| consumer_feedback_observer_(consumer_feedback_observer), |
| - buffer_pool_(std::move(buffer_pool)), |
| + frame_buffer_pool_(frame_buffer_pool), |
| frame_(std::move(frame)), |
| max_consumer_utilization_( |
| media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), |
| @@ -166,7 +121,8 @@ void VideoCaptureController::BufferState::RecordConsumerUtilization( |
| void VideoCaptureController::BufferState::IncreaseConsumerCount() { |
| if (consumer_hold_count_ == 0) |
| - buffer_pool_->HoldForConsumers(buffer_id_, 1); |
| + if (frame_buffer_pool_ != nullptr) |
|
miu
2016/12/13 21:11:10
Instead of nesting if-statements, consider consoli
chfremer
2016/12/13 23:12:39
In this case, we have the statement in l.125 to be
|
| + frame_buffer_pool_->SetBufferHold(buffer_id_); |
| consumer_hold_count_++; |
| } |
| @@ -179,7 +135,8 @@ void VideoCaptureController::BufferState::DecreaseConsumerCount() { |
| consumer_feedback_observer_->OnUtilizationReport( |
| frame_feedback_id_, max_consumer_utilization_); |
| } |
| - buffer_pool_->RelinquishConsumerHold(buffer_id_, 1); |
| + if (frame_buffer_pool_ != nullptr) |
| + frame_buffer_pool_->ReleaseBufferHold(buffer_id_); |
| max_consumer_utilization_ = |
| media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded; |
| } |
| @@ -194,10 +151,13 @@ void VideoCaptureController::BufferState::SetConsumerFeedbackObserver( |
| consumer_feedback_observer_ = consumer_feedback_observer; |
| } |
| -VideoCaptureController::VideoCaptureController(int max_buffers) |
| - : buffer_pool_(new media::VideoCaptureBufferPoolImpl( |
| - base::MakeUnique<media::VideoCaptureBufferTrackerFactoryImpl>(), |
| - max_buffers)), |
| +void VideoCaptureController::BufferState::SetFrameBufferPool( |
| + media::FrameBufferPool* frame_buffer_pool) { |
| + frame_buffer_pool_ = frame_buffer_pool; |
| +} |
| + |
| +VideoCaptureController::VideoCaptureController() |
| + : frame_buffer_pool_(nullptr), |
| consumer_feedback_observer_(nullptr), |
| state_(VIDEO_CAPTURE_STATE_STARTED), |
| has_received_frames_(false), |
| @@ -205,11 +165,22 @@ VideoCaptureController::VideoCaptureController(int max_buffers) |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| } |
| +VideoCaptureController::~VideoCaptureController() = default; |
| + |
| base::WeakPtr<VideoCaptureController> |
| VideoCaptureController::GetWeakPtrForIOThread() { |
| return weak_ptr_factory_.GetWeakPtr(); |
| } |
| +void VideoCaptureController::SetFrameBufferPool( |
| + std::unique_ptr<media::FrameBufferPool> frame_buffer_pool) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + frame_buffer_pool_ = std::move(frame_buffer_pool); |
| + // Update existing BufferState entries. |
| + for (auto& entry : buffer_id_to_state_map_) |
| + entry.second.SetFrameBufferPool(frame_buffer_pool_.get()); |
| +} |
| + |
| void VideoCaptureController::SetConsumerFeedbackObserver( |
| std::unique_ptr<media::VideoFrameConsumerFeedbackObserver> |
| consumer_feedback_observer) { |
| @@ -220,18 +191,6 @@ void VideoCaptureController::SetConsumerFeedbackObserver( |
| entry.second.SetConsumerFeedbackObserver(consumer_feedback_observer_.get()); |
| } |
| -std::unique_ptr<media::VideoCaptureDevice::Client> |
| -VideoCaptureController::NewDeviceClient() { |
| - DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - return base::MakeUnique<media::VideoCaptureDeviceClient>( |
| - base::MakeUnique<VideoFrameReceiverOnIOThread>( |
| - this->GetWeakPtrForIOThread()), |
| - buffer_pool_, |
| - base::Bind(&CreateGpuJpegDecoder, |
| - base::Bind(&VideoFrameReceiver::OnIncomingCapturedVideoFrame, |
| - this->GetWeakPtrForIOThread()))); |
| -} |
| - |
| void VideoCaptureController::AddClient( |
| VideoCaptureControllerID id, |
| VideoCaptureControllerEventHandler* event_handler, |
| @@ -410,13 +369,11 @@ VideoCaptureController::GetVideoCaptureFormat() const { |
| return video_capture_format_; |
| } |
| -VideoCaptureController::~VideoCaptureController() { |
| -} |
| - |
| void VideoCaptureController::OnIncomingCapturedVideoFrame( |
| std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer, |
| scoped_refptr<VideoFrame> frame) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DCHECK(frame_buffer_pool_); |
| const int buffer_id = buffer->id(); |
| DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId); |
| @@ -426,7 +383,7 @@ void VideoCaptureController::OnIncomingCapturedVideoFrame( |
| .insert(std::make_pair( |
| buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(), |
| consumer_feedback_observer_.get(), |
| - buffer_pool_, frame))) |
| + frame_buffer_pool_.get(), frame))) |
| .first; |
| BufferState& buffer_state = it->second; |
| DCHECK(buffer_state.HasZeroConsumerHoldCount()); |
| @@ -520,6 +477,7 @@ void VideoCaptureController::OnLog(const std::string& message) { |
| void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + DCHECK(frame_buffer_pool_); |
| for (const auto& client : controller_clients_) { |
| if (client->session_closed) |
| @@ -544,10 +502,11 @@ void VideoCaptureController::DoNewBufferOnIOThread( |
| const scoped_refptr<media::VideoFrame>& frame) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type()); |
| + CHECK(frame_buffer_pool_); |
|
miu
2016/12/13 21:11:10
DCHECK instead of CHECK?
Actually, the since |fra
chfremer
2016/12/13 23:12:39
Done.
|
| const int buffer_id = buffer->id(); |
| mojo::ScopedSharedBufferHandle handle = |
| - buffer_pool_->GetHandleForTransit(buffer_id); |
| + frame_buffer_pool_->GetHandleForTransit(buffer_id); |
| client->event_handler->OnBufferCreated(client->controller_id, |
| std::move(handle), |
| buffer->mapped_size(), buffer_id); |