| Index: media/mojo/common/media_type_converters.cc
|
| diff --git a/media/mojo/common/media_type_converters.cc b/media/mojo/common/media_type_converters.cc
|
| index 5735cb0f55ba8dad32688c386a6cb86deefffb23..c12fbccff438717b063166145257aa85aa544da3 100644
|
| --- a/media/mojo/common/media_type_converters.cc
|
| +++ b/media/mojo/common/media_type_converters.cc
|
| @@ -20,8 +20,10 @@
|
| #include "media/base/media_keys.h"
|
| #include "media/base/video_decoder_config.h"
|
| #include "media/base/video_frame.h"
|
| +#include "media/mojo/common/mojo_shared_buffer_video_frame.h"
|
| #include "media/mojo/interfaces/demuxer_stream.mojom.h"
|
| #include "mojo/converters/geometry/geometry_type_converters.h"
|
| +#include "mojo/public/cpp/system/buffer.h"
|
|
|
| namespace mojo {
|
|
|
| @@ -293,54 +295,6 @@ ASSERT_CDM_MESSAGE_TYPE(LICENSE_REQUEST);
|
| ASSERT_CDM_MESSAGE_TYPE(LICENSE_RENEWAL);
|
| ASSERT_CDM_MESSAGE_TYPE(LICENSE_RELEASE);
|
|
|
| -namespace {
|
| -
|
| -// Copy the data for plane |plane| from |input| into the vector |dest|. This
|
| -// function only copies the actual frame data. Any padding data is skipped.
|
| -void CopyPlaneDataToVector(const scoped_refptr<media::VideoFrame>& input,
|
| - size_t plane,
|
| - std::vector<uint8_t>* dest) {
|
| - DCHECK(dest->empty());
|
| - uint8_t* source = input->data(plane);
|
| - size_t num_rows = input->rows(plane);
|
| - size_t stride = input->stride(plane);
|
| - size_t row_bytes = input->row_bytes(plane);
|
| - DCHECK_GE(stride, row_bytes);
|
| -
|
| - // Copy |row_bytes| for each row, but increment by |stride| to point at the
|
| - // subsequent row.
|
| - dest->reserve(num_rows * row_bytes);
|
| - for (size_t i = 0; i < num_rows; ++i) {
|
| - dest->insert(dest->end(), source, source + row_bytes);
|
| - source += stride;
|
| - }
|
| -}
|
| -
|
| -// Copy the data from |input| into the plane |plane| of |frame|. If there is
|
| -// padding in |frame|, it is unchanged.
|
| -void CopyPlaneData(const std::vector<uint8_t>& input,
|
| - size_t plane,
|
| - const scoped_refptr<media::VideoFrame>& frame) {
|
| - const uint8_t* source = input.data();
|
| - uint8_t* dest = frame->data(plane);
|
| - size_t num_rows = frame->rows(plane);
|
| - size_t stride = frame->stride(plane);
|
| - size_t row_bytes = frame->row_bytes(plane);
|
| - DCHECK_GE(stride, row_bytes);
|
| - DCHECK_EQ(input.size(), num_rows * row_bytes);
|
| -
|
| - // Copy |row_bytes| for each row. |input| contains only the data bytes, so
|
| - // |source| is only incremented by |row_bytes|. |dest| may contain padding,
|
| - // so increment by |stride| to point at the subsequent row.
|
| - for (size_t i = 0; i < num_rows; ++i) {
|
| - memcpy(dest, source, row_bytes);
|
| - source += row_bytes;
|
| - dest += stride;
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| // static
|
| media::interfaces::SubsampleEntryPtr TypeConverter<
|
| media::interfaces::SubsampleEntryPtr,
|
| @@ -643,36 +597,38 @@ media::interfaces::VideoFramePtr
|
| TypeConverter<media::interfaces::VideoFramePtr,
|
| scoped_refptr<media::VideoFrame>>::
|
| Convert(const scoped_refptr<media::VideoFrame>& input) {
|
| - media::interfaces::VideoFramePtr buffer(media::interfaces::VideoFrame::New());
|
| - buffer->end_of_stream =
|
| + media::interfaces::VideoFramePtr frame(media::interfaces::VideoFrame::New());
|
| + frame->end_of_stream =
|
| input->metadata()->IsTrue(media::VideoFrameMetadata::END_OF_STREAM);
|
| - if (buffer->end_of_stream)
|
| - return buffer;
|
| -
|
| - // handle non EOS buffer.
|
| - buffer->format = static_cast<media::interfaces::VideoFormat>(input->format());
|
| - buffer->coded_size = Size::From(input->coded_size());
|
| - buffer->visible_rect = Rect::From(input->visible_rect());
|
| - buffer->natural_size = Size::From(input->natural_size());
|
| - buffer->timestamp_usec = input->timestamp().InMicroseconds();
|
| -
|
| - if (!input->coded_size().IsEmpty()) {
|
| - // TODO(jrummell): Use a shared buffer rather than copying the data for
|
| - // each plane.
|
| - std::vector<uint8_t> y_data;
|
| - CopyPlaneDataToVector(input, media::VideoFrame::kYPlane, &y_data);
|
| - buffer->y_data.Swap(&y_data);
|
| -
|
| - std::vector<uint8_t> u_data;
|
| - CopyPlaneDataToVector(input, media::VideoFrame::kUPlane, &u_data);
|
| - buffer->u_data.Swap(&u_data);
|
| -
|
| - std::vector<uint8_t> v_data;
|
| - CopyPlaneDataToVector(input, media::VideoFrame::kVPlane, &v_data);
|
| - buffer->v_data.Swap(&v_data);
|
| - }
|
| -
|
| - return buffer;
|
| + if (frame->end_of_stream)
|
| + return frame;
|
| +
|
| + // Handle non EOS frame. It must be a MojoSharedBufferVideoFrame.
|
| + // TODO(jrummell): Support other types of VideoFrame.
|
| + CHECK_EQ(media::VideoFrame::STORAGE_MOJO_SHARED_BUFFER,
|
| + input->storage_type());
|
| + media::MojoSharedBufferVideoFrame* input_frame =
|
| + static_cast<media::MojoSharedBufferVideoFrame*>(input.get());
|
| + mojo::ScopedSharedBufferHandle duplicated_handle;
|
| + const MojoResult result =
|
| + DuplicateBuffer(input_frame->Handle(), nullptr, &duplicated_handle);
|
| + CHECK_EQ(MOJO_RESULT_OK, result);
|
| + CHECK(duplicated_handle.is_valid());
|
| +
|
| + frame->format = static_cast<media::interfaces::VideoFormat>(input->format());
|
| + frame->coded_size = Size::From(input->coded_size());
|
| + frame->visible_rect = Rect::From(input->visible_rect());
|
| + frame->natural_size = Size::From(input->natural_size());
|
| + frame->timestamp_usec = input->timestamp().InMicroseconds();
|
| + frame->frame_data = std::move(duplicated_handle);
|
| + frame->frame_data_size = input_frame->MappedSize();
|
| + frame->y_stride = input_frame->stride(media::VideoFrame::kYPlane);
|
| + frame->u_stride = input_frame->stride(media::VideoFrame::kUPlane);
|
| + frame->v_stride = input_frame->stride(media::VideoFrame::kVPlane);
|
| + frame->y_offset = input_frame->PlaneOffset(media::VideoFrame::kYPlane);
|
| + frame->u_offset = input_frame->PlaneOffset(media::VideoFrame::kUPlane);
|
| + frame->v_offset = input_frame->PlaneOffset(media::VideoFrame::kVPlane);
|
| + return frame;
|
| }
|
|
|
| // static
|
| @@ -683,16 +639,13 @@ TypeConverter<scoped_refptr<media::VideoFrame>,
|
| if (input->end_of_stream)
|
| return media::VideoFrame::CreateEOSFrame();
|
|
|
| - scoped_refptr<media::VideoFrame> frame = media::VideoFrame::CreateFrame(
|
| + return media::MojoSharedBufferVideoFrame::Create(
|
| static_cast<media::VideoPixelFormat>(input->format),
|
| input->coded_size.To<gfx::Size>(), input->visible_rect.To<gfx::Rect>(),
|
| - input->natural_size.To<gfx::Size>(),
|
| + input->natural_size.To<gfx::Size>(), std::move(input->frame_data),
|
| + input->frame_data_size, input->y_offset, input->u_offset, input->v_offset,
|
| + input->y_stride, input->u_stride, input->v_stride,
|
| base::TimeDelta::FromMicroseconds(input->timestamp_usec));
|
| - CopyPlaneData(input->y_data.storage(), media::VideoFrame::kYPlane, frame);
|
| - CopyPlaneData(input->u_data.storage(), media::VideoFrame::kUPlane, frame);
|
| - CopyPlaneData(input->v_data.storage(), media::VideoFrame::kVPlane, frame);
|
| -
|
| - return frame;
|
| }
|
|
|
| } // namespace mojo
|
|
|