| 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 ac5bc7215e2c02a71fa84f5a08804961ae0ca3ba..28bf5705afccf6e9983e5e58696a221fe22f8009 100644
|
| --- a/content/browser/renderer_host/media/video_capture_controller.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_controller.cc
|
| @@ -25,6 +25,7 @@
|
| #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"
|
| +#include "mojo/public/cpp/system/platform_handle.h"
|
|
|
| #if !defined(OS_ANDROID)
|
| #include "content/browser/compositor/image_transport_factory.h"
|
| @@ -95,13 +96,11 @@ VideoCaptureController::BufferState::BufferState(
|
| int buffer_id,
|
| int frame_feedback_id,
|
| media::VideoFrameConsumerFeedbackObserver* consumer_feedback_observer,
|
| - media::FrameBufferPool* frame_buffer_pool,
|
| - scoped_refptr<media::VideoFrame> frame)
|
| + media::FrameBufferPool* frame_buffer_pool)
|
| : buffer_id_(buffer_id),
|
| frame_feedback_id_(frame_feedback_id),
|
| consumer_feedback_observer_(consumer_feedback_observer),
|
| frame_buffer_pool_(frame_buffer_pool),
|
| - frame_(std::move(frame)),
|
| max_consumer_utilization_(
|
| media::VideoFrameConsumerFeedbackObserver::kNoUtilizationRecorded),
|
| consumer_hold_count_(0) {}
|
| @@ -369,20 +368,19 @@ VideoCaptureController::GetVideoCaptureFormat() const {
|
| }
|
|
|
| void VideoCaptureController::OnIncomingCapturedVideoFrame(
|
| - std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> buffer,
|
| + media::VideoCaptureDevice::Client::Buffer buffer,
|
| scoped_refptr<VideoFrame> frame) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - DCHECK(frame_buffer_pool_);
|
| - const int buffer_id = buffer->id();
|
| + const int buffer_id = buffer.id();
|
| DCHECK_NE(buffer_id, media::VideoCaptureBufferPool::kInvalidId);
|
|
|
| // Insert if not exists.
|
| const auto it =
|
| buffer_id_to_state_map_
|
| .insert(std::make_pair(
|
| - buffer_id, BufferState(buffer_id, buffer->frame_feedback_id(),
|
| + buffer_id, BufferState(buffer_id, buffer.frame_feedback_id(),
|
| consumer_feedback_observer_.get(),
|
| - frame_buffer_pool_.get(), frame)))
|
| + frame_buffer_pool_.get())))
|
| .first;
|
| BufferState& buffer_state = it->second;
|
| DCHECK(buffer_state.HasZeroConsumerHoldCount());
|
| @@ -402,11 +400,12 @@ void VideoCaptureController::OnIncomingCapturedVideoFrame(
|
| << media::VideoPixelFormatToString(frame->format());
|
|
|
| // Sanity-checks to confirm |frame| is actually being backed by |buffer|.
|
| + auto buffer_access =
|
| + buffer.handle_provider()->GetHandleForInProcessAccess();
|
| DCHECK(frame->storage_type() == media::VideoFrame::STORAGE_SHMEM);
|
| - DCHECK(frame->data(media::VideoFrame::kYPlane) >= buffer->data(0) &&
|
| + DCHECK(frame->data(media::VideoFrame::kYPlane) >= buffer_access->data() &&
|
| (frame->data(media::VideoFrame::kYPlane) <
|
| - (reinterpret_cast<const uint8_t*>(buffer->data(0)) +
|
| - buffer->mapped_size())))
|
| + (buffer_access->data() + buffer_access->mapped_size())))
|
| << "VideoFrame does not appear to be backed by Buffer";
|
|
|
| for (const auto& client : controller_clients_) {
|
| @@ -422,9 +421,13 @@ void VideoCaptureController::OnIncomingCapturedVideoFrame(
|
| client->known_buffers.push_back(buffer_id);
|
| is_new_buffer = true;
|
| }
|
| - if (is_new_buffer)
|
| - DoNewBufferOnIOThread(client.get(), buffer.get(), frame);
|
| -
|
| + if (is_new_buffer) {
|
| + mojo::ScopedSharedBufferHandle handle =
|
| + buffer.handle_provider()->GetHandleForInterProcessTransit();
|
| + client->event_handler->OnBufferCreated(
|
| + client->controller_id, std::move(handle),
|
| + buffer_access->mapped_size(), buffer_id);
|
| + }
|
| client->event_handler->OnBufferReady(client->controller_id, buffer_id,
|
| frame);
|
|
|
| @@ -475,7 +478,6 @@ 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)
|
| @@ -494,21 +496,6 @@ void VideoCaptureController::OnBufferDestroyed(int buffer_id_to_drop) {
|
| buffer_id_to_state_map_.erase(buffer_id_to_drop);
|
| }
|
|
|
| -void VideoCaptureController::DoNewBufferOnIOThread(
|
| - ControllerClient* client,
|
| - media::VideoCaptureDevice::Client::Buffer* buffer,
|
| - const scoped_refptr<media::VideoFrame>& frame) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| - DCHECK_EQ(media::VideoFrame::STORAGE_SHMEM, frame->storage_type());
|
| -
|
| - const int buffer_id = buffer->id();
|
| - mojo::ScopedSharedBufferHandle handle =
|
| - frame_buffer_pool_->GetHandleForTransit(buffer_id);
|
| - client->event_handler->OnBufferCreated(client->controller_id,
|
| - std::move(handle),
|
| - buffer->mapped_size(), buffer_id);
|
| -}
|
| -
|
| VideoCaptureController::ControllerClient* VideoCaptureController::FindClient(
|
| VideoCaptureControllerID id,
|
| VideoCaptureControllerEventHandler* handler,
|
|
|