Commit fc81eb70 authored by mcasas's avatar mcasas Committed by Commit bot

Video Capture Service: typemap video_capture's and media's VideoCaptureFormat

This CL introduces type mapping (via StructTraits) between
video_capture::mojom::VideoCaptureFormatDataView and
media::VideoCaptureFormat and adapts the code in
services/video_capture accordingly. This is needed to
progress in the migration of Video Capture messages between
renderer and browser being tracked in the mentioned bug.

BUG=651897, 642387
TEST= video_capture_unittests working.

Review-Url: https://codereview.chromium.org/2379253003
Cr-Commit-Position: refs/heads/master@{#423046}
parent c9afe77b
......@@ -20,6 +20,7 @@ _typemap_imports = [
"//mojo/public/cpp/bindings/tests/chromium_typemaps.gni",
"//services/shell/public/cpp/typemaps.gni",
"//services/ui/public/interfaces/display/typemaps.gni",
"//services/video_capture/public/interfaces/typemaps.gni",
"//skia/public/interfaces/typemaps.gni",
"//third_party/WebKit/public/public_typemaps.gni",
"//ui/base/mojo/typemaps.gni",
......
include_rules = [
"+media/base",
"+media/mojo",
"+media/capture/video",
"+ui/gfx/geometry",
]
......@@ -71,11 +71,11 @@ TEST_F(FakeDeviceDescriptorTest, CanUseSecondRequestedProxy) {
&wait_loop));
wait_loop.Run();
auto arbitrary_requested_format = mojom::VideoCaptureFormat::New();
arbitrary_requested_format->frame_size.SetSize(640, 480);
arbitrary_requested_format->frame_rate = 15;
arbitrary_requested_format->pixel_format = media::mojom::VideoFormat::I420;
arbitrary_requested_format->pixel_storage = mojom::VideoPixelStorage::CPU;
media::VideoCaptureFormat arbitrary_requested_format;
arbitrary_requested_format.frame_size.SetSize(640, 480);
arbitrary_requested_format.frame_rate = 15;
arbitrary_requested_format.pixel_format = media::PIXEL_FORMAT_I420;
arbitrary_requested_format.pixel_storage = media::PIXEL_STORAGE_CPU;
base::RunLoop wait_loop_2;
mojom::VideoCaptureDeviceClientPtr client_proxy;
......@@ -84,7 +84,7 @@ TEST_F(FakeDeviceDescriptorTest, CanUseSecondRequestedProxy) {
.WillRepeatedly(
InvokeWithoutArgs([&wait_loop_2]() { wait_loop_2.Quit(); }));
device_proxy_2->Start(std::move(arbitrary_requested_format),
device_proxy_2->Start(arbitrary_requested_format,
mojom::ResolutionChangePolicy::FIXED_RESOLUTION,
mojom::PowerLineFrequency::DEFAULT,
std::move(client_proxy));
......
......@@ -15,11 +15,11 @@ using testing::InvokeWithoutArgs;
namespace video_capture {
TEST_F(FakeDeviceTest, FrameCallbacksArrive) {
auto arbitrary_requested_format = mojom::VideoCaptureFormat::New();
arbitrary_requested_format->frame_size.SetSize(640, 480);
arbitrary_requested_format->frame_rate = 15;
arbitrary_requested_format->pixel_format = media::mojom::VideoFormat::I420;
arbitrary_requested_format->pixel_storage = mojom::VideoPixelStorage::CPU;
media::VideoCaptureFormat arbitrary_requested_format;
arbitrary_requested_format.frame_size.SetSize(640, 480);
arbitrary_requested_format.frame_rate = 15;
arbitrary_requested_format.pixel_format = media::PIXEL_FORMAT_I420;
arbitrary_requested_format.pixel_storage = media::PIXEL_STORAGE_CPU;
base::RunLoop wait_loop;
const int kNumFramesToWaitFor = 3;
......@@ -35,7 +35,7 @@ TEST_F(FakeDeviceTest, FrameCallbacksArrive) {
}
}));
fake_device_proxy_->Start(std::move(arbitrary_requested_format),
fake_device_proxy_->Start(arbitrary_requested_format,
mojom::ResolutionChangePolicy::FIXED_RESOLUTION,
mojom::PowerLineFrequency::DEFAULT,
std::move(client_proxy));
......
......@@ -31,12 +31,10 @@ void MockDeviceVideoCaptureServiceTest::SetUp() {
base::Bind([](mojom::DeviceAccessResultCode result_code) {}));
// Start the mock device with an arbitrary format
gfx::Size requested_size(800, 600);
requested_format_ = mojom::VideoCaptureFormat::New();
requested_format_->frame_size = requested_size;
requested_format_->frame_rate = 15;
requested_format_->pixel_format = media::mojom::VideoFormat::I420;
requested_format_->pixel_storage = mojom::VideoPixelStorage::CPU;
requested_format_.frame_size = gfx::Size(800, 600);
requested_format_.frame_rate = 15;
requested_format_.pixel_format = media::PIXEL_FORMAT_I420;
requested_format_.pixel_storage = media::PIXEL_STORAGE_CPU;
mock_client_ = base::MakeUnique<MockVideoCaptureDeviceClient>(
mojo::GetProxy(&mock_client_proxy_));
}
......
......@@ -31,7 +31,7 @@ class MockDeviceVideoCaptureServiceTest : public shell::test::ServiceTest {
mojom::MockVideoCaptureDevicePtr mock_device_proxy_;
mojom::VideoCaptureDeviceProxyPtr device_proxy_;
mojom::VideoCaptureDeviceClientPtr mock_client_proxy_;
mojom::VideoCaptureFormatPtr requested_format_;
media::VideoCaptureFormat requested_format_;
};
} // namespace video_capture
......
......@@ -20,7 +20,7 @@ TEST_F(MockDeviceVideoCaptureServiceTest,
EXPECT_CALL(*mock_device_, StopAndDeAllocate())
.WillOnce(InvokeWithoutArgs([&wait_loop]() { wait_loop.Quit(); }));
device_proxy_->Start(std::move(requested_format_),
device_proxy_->Start(requested_format_,
mojom::ResolutionChangePolicy::FIXED_RESOLUTION,
mojom::PowerLineFrequency::DEFAULT,
std::move(mock_client_proxy_));
......@@ -39,7 +39,7 @@ TEST_F(MockDeviceVideoCaptureServiceTest,
EXPECT_CALL(*mock_device_, StopAndDeAllocate())
.WillOnce(InvokeWithoutArgs([&wait_loop]() { wait_loop.Quit(); }));
device_proxy_->Start(std::move(requested_format_),
device_proxy_->Start(requested_format_,
mojom::ResolutionChangePolicy::FIXED_RESOLUTION,
mojom::PowerLineFrequency::DEFAULT,
std::move(mock_client_proxy_));
......
......@@ -6,37 +6,6 @@
namespace video_capture {
media::VideoCaptureFormat ConvertFromMojoToMedia(
mojom::VideoCaptureFormatPtr format) {
media::VideoCaptureFormat result;
result.pixel_format = ConvertFromMojoToMedia(format->pixel_format);
result.pixel_storage = ConvertFromMojoToMedia(format->pixel_storage);
result.frame_size.SetSize(format->frame_size.width(),
format->frame_size.height());
result.frame_rate = format->frame_rate;
return result;
}
media::VideoPixelFormat ConvertFromMojoToMedia(
media::mojom::VideoFormat format) {
// Since there are static_asserts in place in
// media/mojo/common/media_type_converters.cc to guarantee equality of the
// underlying representations, we can simply static_cast to convert.
return static_cast<media::VideoPixelFormat>(format);
}
media::VideoPixelStorage ConvertFromMojoToMedia(
mojom::VideoPixelStorage storage) {
switch (storage) {
case mojom::VideoPixelStorage::CPU:
return media::PIXEL_STORAGE_CPU;
case mojom::VideoPixelStorage::GPUMEMORYBUFFER:
return media::PIXEL_STORAGE_GPUMEMORYBUFFER;
}
NOTREACHED();
return media::PIXEL_STORAGE_CPU;
}
media::ResolutionChangePolicy ConvertFromMojoToMedia(
mojom::ResolutionChangePolicy policy) {
switch (policy) {
......
......@@ -15,12 +15,6 @@ namespace video_capture {
// TODO(chfremer): Consider using Mojo type mapping instead of conversion
// methods. https://crbug.com/642387
media::VideoCaptureFormat ConvertFromMojoToMedia(
mojom::VideoCaptureFormatPtr format);
media::VideoPixelFormat ConvertFromMojoToMedia(
media::mojom::VideoFormat format);
media::VideoPixelStorage ConvertFromMojoToMedia(
mojom::VideoPixelStorage storage);
media::ResolutionChangePolicy ConvertFromMojoToMedia(
mojom::ResolutionChangePolicy policy);
media::PowerLineFrequency ConvertFromMojoToMedia(
......
# Copyright 2016 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.
typemaps = [ "//services/video_capture/public/interfaces/video_capture_format.typemap" ]
# Copyright 2016 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.
mojom = "//services/video_capture/public/interfaces/video_capture_format.mojom"
public_headers = [ "//media/base/video_capture_types.h" ]
traits_headers = [ "//services/video_capture/public/interfaces/video_capture_format_traits.h" ]
sources = [
"//services/video_capture/public/interfaces/video_capture_format_traits.cc",
]
public_deps = [
"//media",
"//media/capture",
"//ui/gfx/geometry/mojo",
"//ui/gfx/geometry/mojo:struct_traits",
]
type_mappings = [
"video_capture.mojom.VideoCaptureFormat=media::VideoCaptureFormat",
"video_capture.mojom.VideoPixelStorage=media::VideoPixelStorage",
]
// Copyright 2016 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 "services/video_capture/public/interfaces/video_capture_format_traits.h"
#include "ui/gfx/geometry/mojo/geometry.mojom.h"
#include "ui/gfx/geometry/mojo/geometry_struct_traits.h"
namespace mojo {
// static
bool StructTraits<video_capture::mojom::VideoCaptureFormatDataView,
media::VideoCaptureFormat>::
Read(video_capture::mojom::VideoCaptureFormatDataView data,
media::VideoCaptureFormat* out) {
if (!data.ReadFrameSize(&out->frame_size))
return false;
out->frame_rate = data.frame_rate();
// Since there are static_asserts in place in
// media/mojo/common/media_type_converters.cc to guarantee equality of the
// underlying representations, we can simply static_cast to convert.
// TODO(mcasas): Use EnumTraits for VideoPixelFormat, https://crbug.com/651897
out->pixel_format =
static_cast<media::VideoPixelFormat>(data.pixel_format());
if (!data.ReadPixelStorage(&out->pixel_storage))
return false;
return true;
}
// static
video_capture::mojom::VideoPixelStorage
EnumTraits<video_capture::mojom::VideoPixelStorage, media::VideoPixelStorage>::
ToMojom(media::VideoPixelStorage video_pixel_storage) {
switch (video_pixel_storage) {
case media::PIXEL_STORAGE_CPU:
return video_capture::mojom::VideoPixelStorage::CPU;
case media::PIXEL_STORAGE_GPUMEMORYBUFFER:
return video_capture::mojom::VideoPixelStorage::GPUMEMORYBUFFER;
}
NOTREACHED();
return video_capture::mojom::VideoPixelStorage::CPU;
}
// static
bool EnumTraits<video_capture::mojom::VideoPixelStorage,
media::VideoPixelStorage>::
FromMojom(video_capture::mojom::VideoPixelStorage input,
media::VideoPixelStorage* out) {
switch (input) {
case video_capture::mojom::VideoPixelStorage::CPU:
*out = media::PIXEL_STORAGE_CPU;
return true;
case video_capture::mojom::VideoPixelStorage::GPUMEMORYBUFFER:
*out = media::PIXEL_STORAGE_GPUMEMORYBUFFER;
return true;
}
NOTREACHED();
return false;
}
} // namespace mojo
// Copyright 2016 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.
#ifndef SERVICES_VIDEO_CAPTURE_PUBLIC_INTERFACES_VIDEO_CAPTURE_FORMAT_TYPEMAP_H_
#define SERVICES_VIDEO_CAPTURE_PUBLIC_INTERFACES_VIDEO_CAPTURE_FORMAT_TYPEMAP_H_
#include "media/base/video_capture_types.h"
#include "mojo/common/common_custom_types_struct_traits.h"
#include "services/video_capture/public/interfaces/video_capture_format.mojom.h"
namespace mojo {
template <>
struct StructTraits<video_capture::mojom::VideoCaptureFormatDataView,
media::VideoCaptureFormat> {
static const gfx::Size& frame_size(const media::VideoCaptureFormat& format) {
return format.frame_size;
}
static float frame_rate(const media::VideoCaptureFormat& format) {
return format.frame_rate;
}
static media::mojom::VideoFormat pixel_format(
const media::VideoCaptureFormat& format) {
return static_cast<media::mojom::VideoFormat>(format.pixel_format);
}
static video_capture::mojom::VideoPixelStorage pixel_storage(
const media::VideoCaptureFormat& format) {
return static_cast<video_capture::mojom::VideoPixelStorage>(
format.pixel_storage);
}
static bool Read(video_capture::mojom::VideoCaptureFormatDataView data,
media::VideoCaptureFormat* out);
};
template <>
struct EnumTraits<video_capture::mojom::VideoPixelStorage,
media::VideoPixelStorage> {
static video_capture::mojom::VideoPixelStorage ToMojom(
media::VideoPixelStorage video_pixel_storage);
static bool FromMojom(video_capture::mojom::VideoPixelStorage input,
media::VideoPixelStorage* out);
};
}
#endif // SERVICES_VIDEO_CAPTURE_PUBLIC_INTERFACES_VIDEO_CAPTURE_FORMAT_TYPEMAP_H_
......@@ -19,12 +19,12 @@ VideoCaptureDeviceProxyImpl::~VideoCaptureDeviceProxyImpl() {
}
void VideoCaptureDeviceProxyImpl::Start(
mojom::VideoCaptureFormatPtr requested_format,
const media::VideoCaptureFormat& requested_format,
mojom::ResolutionChangePolicy resolution_change_policy,
mojom::PowerLineFrequency power_line_frequency,
mojom::VideoCaptureDeviceClientPtr client) {
media::VideoCaptureParams params;
params.requested_format = ConvertFromMojoToMedia(std::move(requested_format));
params.requested_format = requested_format;
params.resolution_change_policy =
ConvertFromMojoToMedia(resolution_change_policy);
params.power_line_frequency = ConvertFromMojoToMedia(power_line_frequency);
......
......@@ -19,7 +19,7 @@ class VideoCaptureDeviceProxyImpl : public mojom::VideoCaptureDeviceProxy {
~VideoCaptureDeviceProxyImpl() override;
// mojom::VideoCaptureDeviceProxy:
void Start(mojom::VideoCaptureFormatPtr requested_format,
void Start(const media::VideoCaptureFormat& requested_format,
mojom::ResolutionChangePolicy resolution_change_policy,
mojom::PowerLineFrequency power_line_frequency,
mojom::VideoCaptureDeviceClientPtr client) override;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment