Chromium Code Reviews| 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 01a77723e4ea50b4a12734baeffe1f3a06f384b7..a886257ff36e872e292f317503a4034adecf98b8 100644 |
| --- a/content/browser/renderer_host/media/video_capture_controller.cc |
| +++ b/content/browser/renderer_host/media/video_capture_controller.cc |
| @@ -19,7 +19,6 @@ |
| #include "content/common/gpu/client/gl_helper.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/common/content_switches.h" |
| -#include "gpu/command_buffer/common/mailbox_holder.h" |
| #include "media/base/video_frame.h" |
| #if !defined(OS_ANDROID) |
| @@ -158,6 +157,26 @@ void VideoCaptureController::AddClient( |
| << ", " << session_id |
| << ")"; |
| + // Check that requested VideoCaptureParams are valid and supported. If not, |
| + // report an error immediately and punt. |
| + if (!params.IsValid() || |
| + params.requested_format.pixel_format != media::PIXEL_FORMAT_I420 || |
| + (params.requested_format.pixel_storage != media::PIXEL_STORAGE_CPU && |
| + params.requested_format.pixel_storage != |
| + media::PIXEL_STORAGE_GPUMEMORYBUFFER)) { |
| + // Crash in debug builds since the renderer should not have asked for |
| + // invalid or unsupported parameters. |
| + LOG(DFATAL) << "Invalid or unsupported video capture parameters requested: " |
| + << "frame_size=" |
| + << params.requested_format.frame_size.ToString() |
| + << ", frame_rate=" << params.requested_format.frame_rate |
| + << ", pixel_format=" << media::VideoPixelFormatToString( |
| + params.requested_format.pixel_format) |
| + << ", pixel_storage=" << params.requested_format.pixel_storage; |
|
mcasas
2015/11/17 02:23:47
Nit: Consider using [1]
media::VideoCaptureFormat
miu
2015/11/17 04:28:02
Done.
|
| + event_handler->OnError(id); |
| + return; |
| + } |
| + |
| // If this is the first client added to the controller, cache the parameters. |
| if (!controller_clients_.size()) |
| video_capture_format_ = params.requested_format; |
| @@ -343,11 +362,20 @@ 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)) |
| - << "Format and/or storage type combination not supported (received: " |
| - << media::VideoPixelFormatToString(frame->format()) << ")"; |
| + // Only I420 pixel format is currently supported. |
| + DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_I420) |
| + << "Unsupported pixel format: " |
| + << media::VideoPixelFormatToString(frame->format()); |
| + |
| + // Sanity-checks to confirm |frame| is actually being backed by |buffer|. |
| + DCHECK(frame->storage_type() == media::VideoFrame::STORAGE_SHMEM || |
| + (frame->storage_type() == |
| + media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS)); |
| + DCHECK(frame->data(media::VideoFrame::kYPlane) >= buffer->data(0) && |
| + (frame->data(media::VideoFrame::kYPlane) < |
| + (reinterpret_cast<const uint8*>(buffer->data(0)) + |
| + buffer->mapped_size()))) |
| + << "VideoFrame does not appear to be backed by Buffer"; |
| for (const auto& client : controller_clients_) { |
| if (client->session_closed || client->paused) |
| @@ -428,31 +456,32 @@ void VideoCaptureController::DoNewBufferOnIOThread( |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| const int buffer_id = buffer->id(); |
| - if (frame->HasTextures()) { |
| - DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_ARGB); |
| - DCHECK(frame->coded_size() == frame->visible_rect().size()) |
| - << "Textures shouldn't be crop-marked or letterboxed."; |
| - return; |
| - } |
| - |
| - DCHECK_EQ(frame->format(), media::PIXEL_FORMAT_I420); |
| - if (frame->storage_type() == media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS) { |
| - std::vector<gfx::GpuMemoryBufferHandle> handles; |
| - for (size_t i = 0; i < media::VideoFrame::NumPlanes(frame->format()); ++i) { |
| - gfx::GpuMemoryBufferHandle remote_handle; |
| - buffer_pool_->ShareToProcess2(buffer_id, i, client->render_process_handle, |
| - &remote_handle); |
| - handles.push_back(remote_handle); |
| + switch (frame->storage_type()) { |
| + case media::VideoFrame::STORAGE_GPU_MEMORY_BUFFERS: { |
| + std::vector<gfx::GpuMemoryBufferHandle> handles; |
| + const size_t num_planes = media::VideoFrame::NumPlanes(frame->format()); |
| + for (size_t i = 0; i < num_planes; ++i) { |
| + gfx::GpuMemoryBufferHandle remote_handle; |
| + buffer_pool_->ShareToProcess2( |
| + buffer_id, i, client->render_process_handle, &remote_handle); |
| + handles.push_back(remote_handle); |
| + } |
| + client->event_handler->OnBufferCreated2(client->controller_id, handles, |
| + buffer->dimensions(), buffer_id); |
| + break; |
| + } |
| + case media::VideoFrame::STORAGE_SHMEM: { |
| + base::SharedMemoryHandle remote_handle; |
| + buffer_pool_->ShareToProcess(buffer_id, client->render_process_handle, |
| + &remote_handle); |
| + client->event_handler->OnBufferCreated( |
| + client->controller_id, remote_handle, buffer->mapped_size(), |
| + buffer_id); |
| + break; |
| } |
| - client->event_handler->OnBufferCreated2(client->controller_id, handles, |
| - buffer->dimensions(), buffer_id); |
| - } else { |
| - base::SharedMemoryHandle remote_handle; |
| - buffer_pool_->ShareToProcess(buffer_id, client->render_process_handle, |
| - &remote_handle); |
| - |
| - client->event_handler->OnBufferCreated(client->controller_id, remote_handle, |
| - buffer->mapped_size(), buffer_id); |
| + default: |
| + NOTREACHED(); |
| + break; |
| } |
| } |