| Index: content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| diff --git a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| index fc111e4263bfd1acf784eb620976ce226812ec7c..b9c561feeac08a5170894b0f4b7e54d0fbc5c18f 100644
|
| --- a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| @@ -20,6 +20,7 @@
|
| #include "content/public/common/content_switches.h"
|
| #include "media/base/video_frame.h"
|
| #include "media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.h"
|
| +#include "mojo/public/cpp/system/platform_handle.h"
|
|
|
| namespace content {
|
|
|
| @@ -81,7 +82,7 @@ void VideoCaptureGpuJpegDecoder::DecodeCapturedData(
|
| const media::VideoCaptureFormat& frame_format,
|
| base::TimeTicks reference_time,
|
| base::TimeDelta timestamp,
|
| - std::unique_ptr<media::VideoCaptureDevice::Client::Buffer> out_buffer) {
|
| + media::VideoCaptureDevice::Client::Buffer out_buffer) {
|
| DCHECK(CalledOnValidThread());
|
| DCHECK(decoder_);
|
|
|
| @@ -121,20 +122,30 @@ void VideoCaptureGpuJpegDecoder::DecodeCapturedData(
|
| // Mask against 30 bits, to avoid (undefined) wraparound on signed integer.
|
| next_bitstream_buffer_id_ = (next_bitstream_buffer_id_ + 1) & 0x3FFFFFFF;
|
|
|
| -#if defined(OS_POSIX) && !defined(OS_MACOSX)
|
| + // The APIs of |decoder_| and |decode_done_cb_| require us to wrap the
|
| + // |out_buffer| in a VideoFrame.
|
| const gfx::Size dimensions = frame_format.frame_size;
|
| - base::SharedMemoryHandle out_handle = out_buffer->AsPlatformFile();
|
| + std::unique_ptr<media::VideoCaptureBufferHandle> out_buffer_access =
|
| + out_buffer.handle_provider()->GetHandleForInProcessAccess();
|
| + base::SharedMemoryHandle memory_handle;
|
| + size_t memory_size = 0;
|
| + bool read_only_flag = false;
|
| + const MojoResult result = mojo::UnwrapSharedMemoryHandle(
|
| + out_buffer.handle_provider()->GetHandleForInterProcessTransit(),
|
| + &memory_handle, &memory_size, &read_only_flag);
|
| + DCHECK_EQ(MOJO_RESULT_OK, result);
|
| + DCHECK_GT(memory_size, 0u);
|
| scoped_refptr<media::VideoFrame> out_frame =
|
| media::VideoFrame::WrapExternalSharedMemory(
|
| - media::PIXEL_FORMAT_I420, // format
|
| - dimensions, // coded_size
|
| - gfx::Rect(dimensions), // visible_rect
|
| - dimensions, // natural_size
|
| - static_cast<uint8_t*>(out_buffer->data()), // data
|
| - out_buffer->mapped_size(), // data_size
|
| - out_handle, // handle
|
| - 0, // shared_memory_offset
|
| - timestamp); // timestamp
|
| + media::PIXEL_FORMAT_I420, // format
|
| + dimensions, // coded_size
|
| + gfx::Rect(dimensions), // visible_rect
|
| + dimensions, // natural_size
|
| + out_buffer_access->data(), // data
|
| + out_buffer_access->mapped_size(), // data_size
|
| + std::move(memory_handle), // handle
|
| + 0, // shared_memory_offset
|
| + timestamp); // timestamp
|
| if (!out_frame) {
|
| base::AutoLock lock(lock_);
|
| decoder_status_ = FAILED;
|
| @@ -153,9 +164,6 @@ void VideoCaptureGpuJpegDecoder::DecodeCapturedData(
|
| base::Bind(decode_done_cb_, base::Passed(&out_buffer), out_frame);
|
| }
|
| decoder_->Decode(in_buffer, std::move(out_frame));
|
| -#else
|
| - NOTREACHED();
|
| -#endif
|
| }
|
|
|
| void VideoCaptureGpuJpegDecoder::VideoFrameReady(int32_t bitstream_buffer_id) {
|
|
|