| Index: media/mojo/services/mojo_video_decoder_service.cc
|
| diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc
|
| index a535f608234665b88937e7c978e8feda09507f7d..84465d19c6e05b9bdcad01e6b0774a389cde1c3a 100644
|
| --- a/media/mojo/services/mojo_video_decoder_service.cc
|
| +++ b/media/mojo/services/mojo_video_decoder_service.cc
|
| @@ -14,6 +14,7 @@
|
| #include "media/base/video_frame.h"
|
| #include "media/mojo/common/media_type_converters.h"
|
| #include "media/mojo/common/mojo_decoder_buffer_converter.h"
|
| +#include "media/mojo/common/mojo_shared_buffer_video_frame.h"
|
| #include "media/mojo/services/mojo_media_client.h"
|
| #include "mojo/public/c/system/types.h"
|
| #include "mojo/public/cpp/system/buffer.h"
|
| @@ -73,9 +74,43 @@ void MojoVideoDecoderService::OnDecoderInitialized(
|
|
|
| void MojoVideoDecoderService::OnDecoderOutput(
|
| const scoped_refptr<VideoFrame>& frame) {
|
| - DVLOG(1) << __FUNCTION__;
|
| + VLOG(0) << __FUNCTION__;
|
| DCHECK(client_);
|
| - client_->OnVideoFrameDecoded(mojom::VideoFrame::From(frame));
|
| +
|
| + const size_t y_plane_size =
|
| + frame->rows(VideoFrame::kYPlane) * frame->stride(VideoFrame::kYPlane);
|
| + const size_t u_plane_size =
|
| + frame->rows(VideoFrame::kUPlane) * frame->stride(VideoFrame::kUPlane);
|
| +
|
| + // Allocate a mojo::SharedBufferHandle big enough to contain |frame|'s data.
|
| + size_t buffer_size =
|
| + VideoFrame::AllocationSize(frame->format(), frame->coded_size());
|
| + mojo::ScopedSharedBufferHandle shared_buffer =
|
| + mojo::SharedBufferHandle::Create(buffer_size);
|
| + DCHECK(shared_buffer.is_valid());
|
| + mojo::ScopedSharedBufferMapping shared_buffer_memory =
|
| + shared_buffer->Map(buffer_size);
|
| +
|
| + // Copy data into the shared buffer.
|
| + size_t offset = 0;
|
| + static size_t planes[] = {VideoFrame::kYPlane, VideoFrame::kUPlane,
|
| + VideoFrame::kVPlane};
|
| + for (size_t plane : planes) {
|
| + size_t plane_size = frame->rows(plane) * frame->stride(plane);
|
| + memcpy(reinterpret_cast<uint8_t*>(shared_buffer_memory.get()) + offset,
|
| + frame->data(plane), plane_size);
|
| + offset += plane_size;
|
| + }
|
| +
|
| + // Create a MojoSharedBufferVideoFrame whose dimensions match |color_frame|.
|
| + scoped_refptr<VideoFrame> mojo_frame = MojoSharedBufferVideoFrame::Create(
|
| + frame->format(), frame->coded_size(), frame->visible_rect(),
|
| + frame->natural_size(), std::move(shared_buffer), buffer_size, 0,
|
| + y_plane_size, y_plane_size + u_plane_size,
|
| + frame->stride(VideoFrame::kYPlane), frame->stride(VideoFrame::kUPlane),
|
| + frame->stride(VideoFrame::kVPlane), frame->timestamp());
|
| +
|
| + client_->OnVideoFrameDecoded(mojom::VideoFrame::From(mojo_frame));
|
| }
|
|
|
| void MojoVideoDecoderService::Decode(mojom::DecoderBufferPtr buffer,
|
|
|