diff options
Diffstat (limited to 'chromium/content/browser/renderer_host/media/video_capture_controller.cc')
-rw-r--r-- | chromium/content/browser/renderer_host/media/video_capture_controller.cc | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/chromium/content/browser/renderer_host/media/video_capture_controller.cc b/chromium/content/browser/renderer_host/media/video_capture_controller.cc index 8d2cc05ab2c..26a225d1b9f 100644 --- a/chromium/content/browser/renderer_host/media/video_capture_controller.cc +++ b/chromium/content/browser/renderer_host/media/video_capture_controller.cc @@ -111,13 +111,13 @@ VideoCaptureController::BufferContext::BufferContext( int buffer_context_id, int buffer_id, media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer, - mojo::ScopedSharedBufferHandle handle) + media::mojom::VideoBufferHandlePtr buffer_handle) : buffer_context_id_(buffer_context_id), buffer_id_(buffer_id), is_retired_(false), frame_feedback_id_(0), consumer_feedback_observer_(consumer_feedback_observer), - buffer_handle_(std::move(handle)), + buffer_handle_(std::move(buffer_handle)), max_consumer_utilization_( media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded), consumer_hold_count_(0) {} @@ -157,16 +157,29 @@ void VideoCaptureController::BufferContext::DecreaseConsumerCount() { } } -mojo::ScopedSharedBufferHandle -VideoCaptureController::BufferContext::CloneHandle() { - // Special behavior here: If the handle was already read-only, the Clone() - // call here will maintain that read-only permission. If it was read-write, - // the cloned handle will have read-write permission. - // - // TODO(crbug.com/797470): We should be able to demote read-write to read-only - // permissions when Clone()'ing handles. Currently, this causes a crash. - return buffer_handle_->Clone( - mojo::SharedBufferHandle::AccessMode::READ_WRITE); +media::mojom::VideoBufferHandlePtr +VideoCaptureController::BufferContext::CloneBufferHandle() { + // Unable to use buffer_handle_->Clone(), because shared_buffer does not + // support the copy constructor. + media::mojom::VideoBufferHandlePtr result = + media::mojom::VideoBufferHandle::New(); + if (buffer_handle_->is_shared_buffer_handle()) { + // Special behavior here: If the handle was already read-only, the Clone() + // call here will maintain that read-only permission. If it was read-write, + // the cloned handle will have read-write permission. + // + // TODO(crbug.com/797470): We should be able to demote read-write to + // read-only permissions when Clone()'ing handles. Currently, this causes a + // crash. + result->set_shared_buffer_handle( + buffer_handle_->get_shared_buffer_handle()->Clone( + mojo::SharedBufferHandle::AccessMode::READ_WRITE)); + } else if (buffer_handle_->is_mailbox_handles()) { + result->set_mailbox_handles(buffer_handle_->get_mailbox_handles()->Clone()); + } else { + NOTREACHED() << "Unexpected video buffer handle type"; + } + return result; } VideoCaptureController::VideoCaptureController( @@ -212,8 +225,7 @@ void VideoCaptureController::AddClient( // report an error immediately and punt. if (!params.IsValid() || !(params.requested_format.pixel_format == media::PIXEL_FORMAT_I420 || - params.requested_format.pixel_format == media::PIXEL_FORMAT_Y16) || - params.requested_format.pixel_storage != media::VideoPixelStorage::CPU) { + params.requested_format.pixel_format == media::PIXEL_FORMAT_Y16)) { // Crash in debug builds since the renderer should not have asked for // invalid or unsupported parameters. LOG(DFATAL) << "Invalid or unsupported video capture parameters requested: " @@ -383,16 +395,15 @@ VideoCaptureController::GetVideoCaptureFormat() const { return video_capture_format_; } -void VideoCaptureController::OnNewBufferHandle( - int buffer_id, - std::unique_ptr<media::VideoCaptureDevice::Client::Buffer::HandleProvider> - handle_provider) { +void VideoCaptureController::OnNewBuffer( + int32_t buffer_id, + media::mojom::VideoBufferHandlePtr buffer_handle) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(FindUnretiredBufferContextFromBufferId(buffer_id) == buffer_contexts_.end()); - buffer_contexts_.emplace_back( - next_buffer_context_id_++, buffer_id, launched_device_.get(), - handle_provider->GetHandleForInterProcessTransit(true /* read only */)); + buffer_contexts_.emplace_back(next_buffer_context_id_++, buffer_id, + launched_device_.get(), + std::move(buffer_handle)); } void VideoCaptureController::OnFrameReadyInBuffer( @@ -423,11 +434,10 @@ void VideoCaptureController::OnFrameReadyInBuffer( client->known_buffer_context_ids.push_back(buffer_context_id); const size_t mapped_size = media::VideoCaptureFormat(frame_info->coded_size, 0.0f, - frame_info->pixel_format, - frame_info->storage_type) + frame_info->pixel_format) .ImageAllocationSize(); - client->event_handler->OnBufferCreated( - client->controller_id, buffer_context_iter->CloneHandle(), + client->event_handler->OnNewBuffer( + client->controller_id, buffer_context_iter->CloneBufferHandle(), mapped_size, buffer_context_id); } |