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 e39cc6104e5ee5c23166ab3d5dc3a12c4aa07397..073db2f20152f6ae7e2409f4fb8610b3a4da05b3 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) {} |
@@ -370,20 +369,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; |
miu
2016/12/20 22:25:37
If |frame_buffer_pool_| is null, should we return
chfremer
2016/12/22 19:01:20
No. Before this CL |frame_buffer_pool_| == null wa
miu
2016/12/27 23:38:48
Acknowledged.
|
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()); |
@@ -404,11 +402,11 @@ void VideoCaptureController::OnIncomingCapturedVideoFrame( |
<< media::VideoPixelFormatToString(frame->format()); |
// Sanity-checks to confirm |frame| is actually being backed by |buffer|. |
+ auto buffer_access = buffer.access_provider->GetReadWriteAccess(); |
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_) { |
@@ -424,9 +422,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.access_provider->GetHandleForTransit(); |
+ 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); |
@@ -477,7 +479,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) |
@@ -496,21 +497,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, |