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

Unified Diff: content/renderer/media/video_capture_impl.cc

Issue 2395913003: Cleanup of passing GpuMemoryBuffer backed video frames (Closed)
Patch Set: Rebase Created 4 years, 2 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
« no previous file with comments | « content/renderer/media/video_capture_impl.h ('k') | content/renderer/media/video_capture_message_filter.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/video_capture_impl.cc
diff --git a/content/renderer/media/video_capture_impl.cc b/content/renderer/media/video_capture_impl.cc
index bc1c4bce27116e91c31aeb3666c87984e58508f9..c8ca0f58190d47e5623ce885ed361902d0b856b5 100644
--- a/content/renderer/media/video_capture_impl.cc
+++ b/content/renderer/media/video_capture_impl.cc
@@ -20,7 +20,6 @@
#include "base/threading/thread_task_runner_handle.h"
#include "content/child/child_process.h"
#include "content/common/media/video_capture_messages.h"
-#include "gpu/ipc/client/gpu_memory_buffer_impl.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/limits.h"
#include "media/base/video_frame.h"
@@ -48,58 +47,6 @@ class VideoCaptureImpl::ClientBuffer
DISALLOW_COPY_AND_ASSIGN(ClientBuffer);
};
-// A holder of a GpuMemoryBuffer-backed buffer, Map()ed on ctor and Unmap()ed on
-// dtor. Creates and owns GpuMemoryBuffer instances.
-class VideoCaptureImpl::ClientBuffer2
- : public base::RefCountedThreadSafe<ClientBuffer2> {
- public:
- ClientBuffer2(
- const std::vector<gfx::GpuMemoryBufferHandle>& client_handles,
- const gfx::Size& size)
- : handles_(client_handles),
- size_(size) {
- const media::VideoPixelFormat format = media::PIXEL_FORMAT_I420;
- DCHECK_EQ(handles_.size(), media::VideoFrame::NumPlanes(format));
- for (size_t i = 0; i < handles_.size(); ++i) {
- const size_t width = media::VideoFrame::Columns(i, format, size_.width());
- const size_t height = media::VideoFrame::Rows(i, format, size_.height());
- buffers_.push_back(gpu::GpuMemoryBufferImpl::CreateFromHandle(
- handles_[i], gfx::Size(width, height), gfx::BufferFormat::R_8,
- gfx::BufferUsage::GPU_READ_CPU_READ_WRITE,
- base::Bind(&ClientBuffer2::DestroyGpuMemoryBuffer,
- base::Unretained(this))));
- bool rv = buffers_[i]->Map();
- DCHECK(rv);
- data_[i] = reinterpret_cast<uint8_t*>(buffers_[i]->memory(0u));
- strides_[i] = width;
- }
- }
-
- uint8_t* data(int plane) const { return data_[plane]; }
- int32_t stride(int plane) const { return strides_[plane]; }
- std::vector<gfx::GpuMemoryBufferHandle> gpu_memory_buffer_handles() {
- return handles_;
- }
-
- private:
- friend class base::RefCountedThreadSafe<ClientBuffer2>;
-
- virtual ~ClientBuffer2() {
- for (auto* buffer : buffers_)
- buffer->Unmap();
- }
-
- void DestroyGpuMemoryBuffer(const gpu::SyncToken& sync_token) {}
-
- const std::vector<gfx::GpuMemoryBufferHandle> handles_;
- const gfx::Size size_;
- ScopedVector<gfx::GpuMemoryBuffer> buffers_;
- uint8_t* data_[media::VideoFrame::kMaxPlanes];
- int32_t strides_[media::VideoFrame::kMaxPlanes];
-
- DISALLOW_COPY_AND_ASSIGN(ClientBuffer2);
-};
-
VideoCaptureImpl::ClientInfo::ClientInfo() {}
VideoCaptureImpl::ClientInfo::ClientInfo(const ClientInfo& other) = default;
VideoCaptureImpl::ClientInfo::~ClientInfo() {}
@@ -203,7 +150,6 @@ void VideoCaptureImpl::StopCapture(int client_id) {
DVLOG(1) << "StopCapture: No more client, stopping ...";
StopDevice();
client_buffers_.clear();
- client_buffer2s_.clear();
weak_factory_.InvalidateWeakPtrs();
}
@@ -256,24 +202,6 @@ void VideoCaptureImpl::OnBufferCreated(base::SharedMemoryHandle handle,
DCHECK(inserted);
}
-void VideoCaptureImpl::OnBufferCreated2(
- const std::vector<gfx::GpuMemoryBufferHandle>& handles,
- const gfx::Size& size,
- int buffer_id) {
- DCHECK(io_task_runner_->BelongsToCurrentThread());
-
- // In case client calls StopCapture before the arrival of created buffer,
- // just close this buffer and return.
- if (state_ != VIDEO_CAPTURE_STATE_STARTED)
- return;
-
- const bool inserted =
- client_buffer2s_.insert(std::make_pair(buffer_id,
- new ClientBuffer2(handles, size)))
- .second;
- DCHECK(inserted);
-}
-
void VideoCaptureImpl::OnBufferDestroyed(int buffer_id) {
DCHECK(io_task_runner_->BelongsToCurrentThread());
@@ -282,13 +210,6 @@ void VideoCaptureImpl::OnBufferDestroyed(int buffer_id) {
DCHECK(!cb_iter->second.get() || cb_iter->second->HasOneRef())
<< "Instructed to delete buffer we are still using.";
client_buffers_.erase(cb_iter);
- } else {
- const auto& cb2_iter = client_buffer2s_.find(buffer_id);
- if (cb2_iter != client_buffer2s_.end()) {
- DCHECK(!cb2_iter->second.get() || cb2_iter->second->HasOneRef())
- << "Instructed to delete buffer we are still using.";
- client_buffer2s_.erase(cb2_iter);
- }
}
}
@@ -301,15 +222,13 @@ void VideoCaptureImpl::OnBufferReceived(
const gfx::Size& coded_size,
const gfx::Rect& visible_rect) {
DCHECK(io_task_runner_->BelongsToCurrentThread());
+ // Crash in debug builds since the host should not have provided a buffer
+ // with an unsupported pixel format or storage type.
+ DCHECK_EQ(media::PIXEL_FORMAT_I420, pixel_format);
+ DCHECK(storage_type == media::VideoFrame::STORAGE_SHMEM);
if (state_ != VIDEO_CAPTURE_STATE_STARTED ||
pixel_format != media::PIXEL_FORMAT_I420 ||
- (storage_type != media::VideoFrame::STORAGE_SHMEM &&
- storage_type != media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS)) {
- // Crash in debug builds since the host should not have provided a buffer
- // with an unsupported pixel format or storage type.
- DCHECK_EQ(media::PIXEL_FORMAT_I420, pixel_format);
- DCHECK(storage_type == media::VideoFrame::STORAGE_SHMEM ||
- storage_type == media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS);
+ storage_type != media::VideoFrame::STORAGE_SHMEM) {
Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id,
gpu::SyncToken(), -1.0));
return;
@@ -340,56 +259,26 @@ void VideoCaptureImpl::OnBufferReceived(
(reference_time - base::TimeTicks()).InMicroseconds(),
"time_delta", timestamp.InMicroseconds());
- scoped_refptr<media::VideoFrame> frame;
- BufferFinishedCallback buffer_finished_callback;
- std::unique_ptr<gpu::SyncToken> release_sync_token(new gpu::SyncToken);
- switch (storage_type) {
- case media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS: {
- const auto& iter = client_buffer2s_.find(buffer_id);
- DCHECK(iter != client_buffer2s_.end());
- scoped_refptr<ClientBuffer2> buffer = iter->second;
- const auto& handles = buffer->gpu_memory_buffer_handles();
- frame = media::VideoFrame::WrapExternalYuvGpuMemoryBuffers(
- media::PIXEL_FORMAT_I420, coded_size, gfx::Rect(coded_size),
- coded_size, buffer->stride(media::VideoFrame::kYPlane),
- buffer->stride(media::VideoFrame::kUPlane),
- buffer->stride(media::VideoFrame::kVPlane),
- buffer->data(media::VideoFrame::kYPlane),
- buffer->data(media::VideoFrame::kUPlane),
- buffer->data(media::VideoFrame::kVPlane),
- handles[media::VideoFrame::kYPlane],
- handles[media::VideoFrame::kUPlane],
- handles[media::VideoFrame::kVPlane], timestamp);
- buffer_finished_callback = media::BindToCurrentLoop(
- base::Bind(&VideoCaptureImpl::OnClientBufferFinished2,
- weak_factory_.GetWeakPtr(), buffer_id, buffer));
- break;
- }
- case media::VideoFrame::STORAGE_SHMEM: {
- const auto& iter = client_buffers_.find(buffer_id);
- DCHECK(iter != client_buffers_.end());
- const scoped_refptr<ClientBuffer> buffer = iter->second;
- frame = media::VideoFrame::WrapExternalSharedMemory(
+ const auto& iter = client_buffers_.find(buffer_id);
+ DCHECK(iter != client_buffers_.end());
+ const scoped_refptr<ClientBuffer> buffer = iter->second;
+ scoped_refptr<media::VideoFrame> frame =
+ media::VideoFrame::WrapExternalSharedMemory(
pixel_format, coded_size, visible_rect,
gfx::Size(visible_rect.width(), visible_rect.height()),
reinterpret_cast<uint8_t*>(buffer->buffer()->memory()),
buffer->buffer_size(), buffer->buffer()->handle(),
0 /* shared_memory_offset */, timestamp);
- buffer_finished_callback = media::BindToCurrentLoop(
- base::Bind(&VideoCaptureImpl::OnClientBufferFinished,
- weak_factory_.GetWeakPtr(), buffer_id, buffer));
- break;
- }
- default:
- NOTREACHED();
- break;
- }
if (!frame) {
Send(new VideoCaptureHostMsg_BufferReady(device_id_, buffer_id,
gpu::SyncToken(), -1.0));
return;
}
+ BufferFinishedCallback buffer_finished_callback = media::BindToCurrentLoop(
+ base::Bind(&VideoCaptureImpl::OnClientBufferFinished,
+ weak_factory_.GetWeakPtr(), buffer_id, buffer));
+ std::unique_ptr<gpu::SyncToken> release_sync_token(new gpu::SyncToken);
frame->AddDestructionObserver(
base::Bind(&VideoCaptureImpl::DidFinishConsumingFrame, frame->metadata(),
base::Passed(&release_sync_token), buffer_finished_callback));
@@ -412,14 +301,6 @@ void VideoCaptureImpl::OnClientBufferFinished(
release_sync_token,
consumer_resource_utilization));
}
-void VideoCaptureImpl::OnClientBufferFinished2(
- int buffer_id,
- const scoped_refptr<ClientBuffer2>& gpu_memory_buffer /* ignored_buffer */,
- const gpu::SyncToken& release_sync_token,
- double consumer_resource_utilization) {
- OnClientBufferFinished(buffer_id, scoped_refptr<ClientBuffer>(),
- release_sync_token, consumer_resource_utilization);
-}
void VideoCaptureImpl::OnStateChanged(VideoCaptureState state) {
DCHECK(io_task_runner_->BelongsToCurrentThread());
@@ -433,7 +314,6 @@ void VideoCaptureImpl::OnStateChanged(VideoCaptureState state) {
state_ = VIDEO_CAPTURE_STATE_STOPPED;
DVLOG(1) << "OnStateChanged: stopped!, device_id = " << device_id_;
client_buffers_.clear();
- client_buffer2s_.clear();
weak_factory_.InvalidateWeakPtrs();
if (!clients_.empty() || !clients_pending_on_restart_.empty())
RestartCapture();
« no previous file with comments | « content/renderer/media/video_capture_impl.h ('k') | content/renderer/media/video_capture_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698