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..bbdf3674d6bd3cf3403674d546082735fb409235 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,11 @@ 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 +420,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 +477,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 +495,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, |