| Index: media/mojo/interfaces/video_frame_struct_traits_unittest.cc
|
| diff --git a/media/mojo/interfaces/video_frame_struct_traits_unittest.cc b/media/mojo/interfaces/video_frame_struct_traits_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cfe3c2b122210bfb77c6f784da5f87a20bc852df
|
| --- /dev/null
|
| +++ b/media/mojo/interfaces/video_frame_struct_traits_unittest.cc
|
| @@ -0,0 +1,121 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "media/mojo/interfaces/video_frame_struct_traits.h"
|
| +
|
| +#include "base/macros.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "gpu/command_buffer/common/mailbox.h"
|
| +#include "gpu/command_buffer/common/mailbox_holder.h"
|
| +#include "gpu/command_buffer/common/sync_token.h"
|
| +#include "media/base/video_frame.h"
|
| +#include "media/mojo/common/mojo_shared_buffer_video_frame.h"
|
| +#include "media/mojo/interfaces/traits_test_service.mojom.h"
|
| +#include "mojo/public/cpp/bindings/binding_set.h"
|
| +#include "mojo/public/cpp/bindings/interface_request.h"
|
| +#include "mojo/public/cpp/system/buffer.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "ui/gfx/geometry/rect.h"
|
| +#include "ui/gfx/geometry/size.h"
|
| +
|
| +namespace media {
|
| +
|
| +namespace {
|
| +
|
| +class VideoFrameStructTraitsTest : public testing::Test,
|
| + public media::mojom::TraitsTestService {
|
| + public:
|
| + VideoFrameStructTraitsTest() = default;
|
| +
|
| + protected:
|
| + media::mojom::TraitsTestServicePtr GetTraitsTestProxy() {
|
| + media::mojom::TraitsTestServicePtr proxy;
|
| + traits_test_bindings_.AddBinding(this, mojo::MakeRequest(&proxy));
|
| + return proxy;
|
| + }
|
| +
|
| + bool RoundTrip(scoped_refptr<VideoFrame>* frame) {
|
| + scoped_refptr<VideoFrame> input = std::move(*frame);
|
| + media::mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
|
| + return proxy->EchoVideoFrame(std::move(input), frame);
|
| + }
|
| +
|
| + private:
|
| + void EchoVideoFrame(const scoped_refptr<VideoFrame>& f,
|
| + EchoVideoFrameCallback callback) override {
|
| + std::move(callback).Run(f);
|
| + }
|
| +
|
| + base::MessageLoop loop_;
|
| + mojo::BindingSet<TraitsTestService> traits_test_bindings_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(VideoFrameStructTraitsTest);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +TEST_F(VideoFrameStructTraitsTest, Null) {
|
| + scoped_refptr<VideoFrame> frame;
|
| +
|
| + ASSERT_TRUE(RoundTrip(&frame));
|
| + EXPECT_FALSE(frame);
|
| +}
|
| +
|
| +TEST_F(VideoFrameStructTraitsTest, EOS) {
|
| + scoped_refptr<VideoFrame> frame = VideoFrame::CreateEOSFrame();
|
| +
|
| + ASSERT_TRUE(RoundTrip(&frame));
|
| + ASSERT_TRUE(frame);
|
| + EXPECT_TRUE(frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
|
| +}
|
| +
|
| +TEST_F(VideoFrameStructTraitsTest, MojoSharedBufferVideoFrame) {
|
| + scoped_refptr<VideoFrame> frame =
|
| + MojoSharedBufferVideoFrame::CreateDefaultI420(
|
| + gfx::Size(100, 100), base::TimeDelta::FromSeconds(100));
|
| +
|
| + ASSERT_TRUE(RoundTrip(&frame));
|
| + ASSERT_TRUE(frame);
|
| + EXPECT_FALSE(frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
|
| + EXPECT_EQ(frame->coded_size(), gfx::Size(100, 100));
|
| + EXPECT_EQ(frame->timestamp(), base::TimeDelta::FromSeconds(100));
|
| +
|
| + ASSERT_EQ(frame->storage_type(), VideoFrame::STORAGE_MOJO_SHARED_BUFFER);
|
| + MojoSharedBufferVideoFrame* mojo_shared_buffer_frame =
|
| + static_cast<MojoSharedBufferVideoFrame*>(frame.get());
|
| + EXPECT_TRUE(mojo_shared_buffer_frame->Handle().is_valid());
|
| +}
|
| +
|
| +TEST_F(VideoFrameStructTraitsTest, MojoSharedBufferVideoFrame_InvalidOffsets) {
|
| + mojo::ScopedSharedBufferHandle handle = mojo::SharedBufferHandle::Create(128);
|
| + scoped_refptr<VideoFrame> frame = MojoSharedBufferVideoFrame::Create(
|
| + PIXEL_FORMAT_I420, gfx::Size(100, 100), gfx::Rect(0, 0, 100, 100),
|
| + gfx::Size(100, 100), std::move(handle), 128, 0, 0, 0, 100, 100, 100,
|
| + base::TimeDelta::FromSeconds(100));
|
| + EXPECT_DEATH(RoundTrip(&frame), "");
|
| +}
|
| +
|
| +TEST_F(VideoFrameStructTraitsTest, MailboxVideoFrame) {
|
| + gpu::Mailbox mailbox = gpu::Mailbox::Generate();
|
| + gpu::MailboxHolder mailbox_holder[VideoFrame::kMaxPlanes];
|
| + mailbox_holder[0] = gpu::MailboxHolder(mailbox, gpu::SyncToken(), 0);
|
| + scoped_refptr<VideoFrame> frame = VideoFrame::WrapNativeTextures(
|
| + PIXEL_FORMAT_ARGB, mailbox_holder, VideoFrame::ReleaseMailboxCB(),
|
| + gfx::Size(100, 100), gfx::Rect(10, 10, 80, 80), gfx::Size(200, 100),
|
| + base::TimeDelta::FromSeconds(100));
|
| +
|
| + ASSERT_TRUE(RoundTrip(&frame));
|
| + ASSERT_TRUE(frame);
|
| + EXPECT_FALSE(frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
|
| + EXPECT_EQ(frame->format(), PIXEL_FORMAT_ARGB);
|
| + EXPECT_EQ(frame->coded_size(), gfx::Size(100, 100));
|
| + EXPECT_EQ(frame->visible_rect(), gfx::Rect(10, 10, 80, 80));
|
| + EXPECT_EQ(frame->natural_size(), gfx::Size(200, 100));
|
| + EXPECT_EQ(frame->timestamp(), base::TimeDelta::FromSeconds(100));
|
| + ASSERT_TRUE(frame->HasTextures());
|
| + ASSERT_EQ(frame->mailbox_holder(0).mailbox, mailbox);
|
| +}
|
| +
|
| +} // namespace media
|
|
|