| Index: media/capture/video/video_capture_device_client.cc
|
| diff --git a/media/capture/video/video_capture_device_client.cc b/media/capture/video/video_capture_device_client.cc
|
| index 3321633b610852d5e5be905e54e489b912f4b6fc..c7a92be1266eadf4e43246ebc05e6883a4a165ec 100644
|
| --- a/media/capture/video/video_capture_device_client.cc
|
| +++ b/media/capture/video/video_capture_device_client.cc
|
| @@ -21,6 +21,7 @@
|
| #include "media/capture/video/video_capture_jpeg_decoder.h"
|
| #include "media/capture/video/video_frame_receiver.h"
|
| #include "media/capture/video_capture_types.h"
|
| +#include "mojo/public/cpp/system/platform_handle.h"
|
| #include "third_party/libyuv/include/libyuv.h"
|
|
|
| using media::VideoCaptureFormat;
|
| @@ -295,32 +296,46 @@ void VideoCaptureDeviceClient::OnIncomingCapturedBuffer(
|
| const VideoCaptureFormat& format,
|
| base::TimeTicks reference_time,
|
| base::TimeDelta timestamp) {
|
| - DCHECK(IsFormatSupported(format.pixel_format));
|
| - DCHECK_EQ(media::PIXEL_STORAGE_CPU, format.pixel_storage);
|
| + OnIncomingCapturedBufferExt(std::move(buffer), format, reference_time,
|
| + timestamp, gfx::Rect(format.frame_size),
|
| + VideoFrameMetadata());
|
| +}
|
|
|
| - scoped_refptr<VideoFrame> frame;
|
| - if (buffer->IsBackedByVideoFrame()) {
|
| - frame = buffer->GetVideoFrame();
|
| - frame->set_timestamp(timestamp);
|
| - } else {
|
| - frame = VideoFrame::WrapExternalSharedMemory(
|
| - format.pixel_format, format.frame_size, gfx::Rect(format.frame_size),
|
| - format.frame_size, reinterpret_cast<uint8_t*>(buffer->data()),
|
| - VideoFrame::AllocationSize(format.pixel_format, format.frame_size),
|
| - base::SharedMemory::NULLHandle(), 0u, timestamp);
|
| - }
|
| - if (!frame)
|
| - return;
|
| +void VideoCaptureDeviceClient::OnIncomingCapturedBufferExt(
|
| + std::unique_ptr<Buffer> buffer,
|
| + const VideoCaptureFormat& format,
|
| + base::TimeTicks reference_time,
|
| + base::TimeDelta timestamp,
|
| + gfx::Rect visible_rect,
|
| + const VideoFrameMetadata& additional_metadata) {
|
| + const int buffer_id = buffer->id();
|
| +
|
| + auto buffer_mojo_handle = buffer_pool_->GetHandleForTransit(buffer_id);
|
| + base::SharedMemoryHandle memory_handle;
|
| + size_t memory_size = 0;
|
| + bool read_only_flag = false;
|
| + const MojoResult unwrap_result_code = mojo::UnwrapSharedMemoryHandle(
|
| + std::move(buffer_mojo_handle), &memory_handle, &memory_size,
|
| + &read_only_flag);
|
| + DCHECK_EQ(MOJO_RESULT_OK, unwrap_result_code);
|
| +
|
| + scoped_refptr<media::VideoFrame> frame =
|
| + media::VideoFrame::WrapExternalSharedMemory(
|
| + format.pixel_format, // format
|
| + format.frame_size, // coded_size
|
| + visible_rect, // visible_rect
|
| + format.frame_size, // natural_size
|
| + static_cast<uint8_t*>(buffer->data()), // data
|
| + buffer->mapped_size(), // data_size
|
| + memory_handle, // handle
|
| + 0, // shared_memory_offset
|
| + timestamp); // timestamp
|
| + frame->metadata()->MergeMetadataFrom(&additional_metadata);
|
| frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE,
|
| format.frame_rate);
|
| frame->metadata()->SetTimeTicks(media::VideoFrameMetadata::REFERENCE_TIME,
|
| reference_time);
|
| - OnIncomingCapturedVideoFrame(std::move(buffer), std::move(frame));
|
| -}
|
|
|
| -void VideoCaptureDeviceClient::OnIncomingCapturedVideoFrame(
|
| - std::unique_ptr<Buffer> buffer,
|
| - scoped_refptr<VideoFrame> frame) {
|
| receiver_->OnIncomingCapturedVideoFrame(std::move(buffer), std::move(frame));
|
| }
|
|
|
|
|