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)); |
} |