Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Unified Diff: content/browser/renderer_host/media/video_capture_controller.cc

Issue 1267883002: Pass GpuMemoryBuffer backed VideoFrame from browser to renderer processes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@gmbtracker-multiple
Patch Set: Rebase Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 e3a6d79e01cfe3d1a0d55db5d44f503edd03fa0d..2ed26f8058e7b15aad9279198ceb7823958c030e 100644
--- a/content/browser/renderer_host/media/video_capture_controller.cc
+++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -310,31 +310,46 @@ void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
scoped_ptr<base::DictionaryValue> metadata(new base::DictionaryValue());
frame->metadata()->MergeInternalValuesInto(metadata.get());
+ DCHECK(
+ (frame->IsMappable() && frame->format() == media::PIXEL_FORMAT_I420) ||
+ (frame->HasTextures() && (frame->format() == media::PIXEL_FORMAT_ARGB ||
+ frame->format() == media::PIXEL_FORMAT_I420)))
+ << "Format and/or storage type combination not supported (received: "
+ << media::VideoPixelFormatToString(frame->format()) << ")";
+
for (const auto& client : controller_clients_) {
if (client->session_closed || client->paused)
continue;
- CHECK((frame->IsMappable() &&
- frame->format() == media::PIXEL_FORMAT_I420) ||
- (!frame->IsMappable() && frame->HasTextures() &&
- frame->format() == media::PIXEL_FORMAT_ARGB))
- << "Format and/or storage type combination not supported (received: "
- << media::VideoPixelFormatToString(frame->format()) << ")";
-
- if (frame->HasTextures()) {
- DCHECK(frame->coded_size() == frame->visible_rect().size())
- << "Textures are always supposed to be tightly packed.";
- DCHECK_EQ(1u, VideoFrame::NumPlanes(frame->format()));
- } else if (frame->format() == media::PIXEL_FORMAT_I420) {
- const bool is_new_buffer =
- client->known_buffers.insert(buffer_id).second;
- if (is_new_buffer) {
- // On the first use of a buffer on a client, share the memory handle.
- size_t memory_size = 0;
- base::SharedMemoryHandle remote_handle = buffer_pool_->ShareToProcess(
- buffer_id, client->render_process_handle, &memory_size);
+ // On the first use of a buffer on a client, share the memory handles.
+ const bool is_new_buffer = client->known_buffers.insert(buffer_id).second;
+ if (is_new_buffer) {
+ if (frame->HasTextures()) {
+ DCHECK(frame->coded_size() == frame->visible_rect().size())
+ << "Textures are always supposed to be tightly packed.";
+
+ if (frame->format() == media::PIXEL_FORMAT_I420) {
+ std::vector<gfx::GpuMemoryBufferHandle> handles(
+ VideoFrame::NumPlanes(frame->format()));
+ for (size_t i = 0; i < handles.size(); ++i)
+ buffer_pool_->ShareToProcess2(
+ buffer_id, i, client->render_process_handle, &handles[i]);
+
+ client->event_handler->OnBufferCreated2(
+ client->controller_id, handles, buffer->dimensions(),
+ buffer_id);
+ } else {
+ DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_ARGB);
+ }
+ } else if (frame->IsMappable()) {
+ DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_I420);
+ base::SharedMemoryHandle remote_handle;
+ buffer_pool_->ShareToProcess(
+ buffer_id, client->render_process_handle, &remote_handle);
+
client->event_handler->OnBufferCreated(
- client->controller_id, remote_handle, memory_size, buffer_id);
+ client->controller_id, remote_handle, buffer->mapped_size(),
+ buffer_id);
}
}

Powered by Google App Engine
This is Rietveld 408576698