1 // Copyright 2019 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "media/mojo/mojom/video_encode_accelerator_mojom_traits.h"
7 #include "media/base/video_bitrate_allocation.h"
8 #include "media/mojo/mojom/video_encode_accelerator.mojom.h"
9 #include "media/mojo/mojom/video_encoder_info_mojom_traits.h"
10 #include "media/video/video_encode_accelerator.h"
11 #include "media/video/video_encoder_info.h"
12 #include "mojo/public/cpp/test_support/test_utils.h"
13 #include "testing/gtest/include/gtest/gtest.h"
17 TEST(VideoEncodeAcceleratorSupportedProfile, RoundTrip) {
18 ::media::VideoEncodeAccelerator::SupportedProfile input;
19 input.profile = VP9PROFILE_PROFILE0;
20 input.min_resolution = gfx::Size(64, 64);
21 input.max_resolution = gfx::Size(4096, 4096);
22 input.max_framerate_numerator = 30;
23 input.max_framerate_denominator = 1;
24 input.rate_control_modes = VideoEncodeAccelerator::kConstantMode |
25 VideoEncodeAccelerator::kVariableMode;
26 input.scalability_modes.push_back(::media::SVCScalabilityMode::kL1T3);
27 input.scalability_modes.push_back(::media::SVCScalabilityMode::kL3T3Key);
29 ::media::VideoEncodeAccelerator::SupportedProfile output;
30 ASSERT_TRUE(mojo::test::SerializeAndDeserialize<
31 mojom::VideoEncodeAcceleratorSupportedProfile>(input, output));
32 EXPECT_EQ(input, output);
35 TEST(VideoEncoderInfoStructTraitTest, RoundTrip) {
36 ::media::VideoEncoderInfo input;
37 input.implementation_name = "FakeVideoEncodeAccelerator";
38 // Set `frame_delay` but leave `input_capacity` empty.
39 input.frame_delay = 3;
41 for (size_t i = 0; i < ::media::VideoEncoderInfo::kMaxSpatialLayers; ++i)
42 input.fps_allocation[i] = {5, 5, 10};
43 // Resolution bitrate limits.
44 input.resolution_bitrate_limits.push_back(::media::ResolutionBitrateLimit(
45 gfx::Size(123, 456), 123456, 123456, 789012));
46 input.resolution_bitrate_limits.push_back(::media::ResolutionBitrateLimit(
47 gfx::Size(789, 1234), 1234567, 1234567, 7890123));
49 input.supports_native_handle = true;
50 input.has_trusted_rate_controller = true;
51 input.is_hardware_accelerated = true;
52 input.supports_simulcast = true;
54 ::media::VideoEncoderInfo output = input;
55 ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::VideoEncoderInfo>(
57 EXPECT_EQ(input, output);
60 TEST(VideoBitrateAllocationStructTraitTest, ConstantBitrate_RoundTrip) {
61 ::media::VideoBitrateAllocation input_allocation;
62 ASSERT_TRUE(input_allocation.SetBitrate(0, 0, 1000u));
63 ASSERT_TRUE(input_allocation.SetBitrate(1, 0, 3500u));
64 ASSERT_TRUE(input_allocation.SetBitrate(0, 1, 2000u));
65 ASSERT_TRUE(input_allocation.SetBitrate(1, 1, 5000u));
66 ::media::VideoBitrateAllocation output_allocation;
69 mojo::test::SerializeAndDeserialize<mojom::VideoBitrateAllocation>(
70 input_allocation, output_allocation));
72 EXPECT_EQ(input_allocation, output_allocation);
75 TEST(VideoBitrateAllocationStructTraitTest,
76 VariableBitrate_PeakGreaterThanSum_RoundTrip) {
77 ::media::VideoBitrateAllocation input_allocation(Bitrate::Mode::kVariable);
78 input_allocation.SetBitrate(0, 0, 5000u);
79 input_allocation.SetPeakBps(654321u);
80 ::media::VideoBitrateAllocation output_allocation;
83 mojo::test::SerializeAndDeserialize<mojom::VideoBitrateAllocation>(
84 input_allocation, output_allocation));
86 EXPECT_EQ(input_allocation, output_allocation);
89 TEST(VideoBitrateAllocationStructTraitTest,
90 VariableBitrate_PeakEqualsSum_RoundTrip) {
91 ::media::VideoBitrateAllocation input_allocation(Bitrate::Mode::kVariable);
92 input_allocation.SetBitrate(0, 0, 5000u);
93 input_allocation.SetPeakBps(5000u);
94 ::media::VideoBitrateAllocation output_allocation;
97 mojo::test::SerializeAndDeserialize<mojom::VideoBitrateAllocation>(
98 input_allocation, output_allocation));
100 EXPECT_EQ(input_allocation, output_allocation);
103 TEST(VideoBitrateAllocationStructTraitTest,
104 VariableBitrate_InvalidTooLowPeak_Fails) {
105 mojom::VideoBitrateAllocationPtr mojom_allocation =
106 mojom::VideoBitrateAllocation::New();
107 std::vector<uint32_t> bitrates = {1000u, 2500u, 3000u};
108 mojom_allocation->bitrates = bitrates;
109 mojom::VariableBitratePeakPtr mojom_peak = mojom::VariableBitratePeak::New();
110 mojom_peak->bps = 6499u; // invalid: must be >=6500u
111 mojom_allocation->variable_bitrate_peak = std::move(mojom_peak);
112 VideoBitrateAllocation output;
115 mojo::test::SerializeAndDeserialize<mojom::VideoBitrateAllocation>(
116 mojom_allocation, output));
119 TEST(VideoBitrateAllocationStructTraitTest,
120 VariableBitrate_InvalidZeroPeak_Fails) {
121 mojom::VideoBitrateAllocationPtr mojom_allocation =
122 mojom::VideoBitrateAllocation::New();
123 std::vector<uint32_t> bitrates = {0u};
124 mojom_allocation->bitrates = bitrates;
125 mojom::VariableBitratePeakPtr mojom_peak = mojom::VariableBitratePeak::New();
126 mojom_peak->bps = 0u;
127 mojom_allocation->variable_bitrate_peak = std::move(mojom_peak);
128 VideoBitrateAllocation output;
131 mojo::test::SerializeAndDeserialize<mojom::VideoBitrateAllocation>(
132 mojom_allocation, output));
135 TEST(SpatialLayerStructTraitTest, RoundTrip) {
136 ::media::VideoEncodeAccelerator::Config::SpatialLayer input_spatial_layer;
137 input_spatial_layer.width = 320;
138 input_spatial_layer.width = 180;
139 input_spatial_layer.bitrate_bps = 12345678u;
140 input_spatial_layer.framerate = 24u;
141 input_spatial_layer.max_qp = 30u;
142 input_spatial_layer.num_of_temporal_layers = 3u;
143 ::media::VideoEncodeAccelerator::Config::SpatialLayer output_spatial_layer;
144 ASSERT_TRUE(mojo::test::SerializeAndDeserialize<mojom::SpatialLayer>(
145 input_spatial_layer, output_spatial_layer));
146 EXPECT_EQ(input_spatial_layer, output_spatial_layer);
149 TEST(VideoEncodeAcceleratorConfigStructTraitTest, RoundTrip) {
150 std::vector<::media::VideoEncodeAccelerator::Config::SpatialLayer>
151 input_spatial_layers(3);
152 constexpr gfx::Size kBaseSize(320, 180);
153 constexpr uint32_t kBaseBitrateBps = 123456u;
154 constexpr uint32_t kBaseFramerate = 24u;
155 for (size_t i = 0; i < input_spatial_layers.size(); ++i) {
156 input_spatial_layers[i].width =
157 static_cast<int32_t>(kBaseSize.width() * (i + 1));
158 input_spatial_layers[i].height =
159 static_cast<int32_t>(kBaseSize.height() * (i + 1));
160 input_spatial_layers[i].bitrate_bps = kBaseBitrateBps * (i + 1) / 2;
161 input_spatial_layers[i].framerate = kBaseFramerate * 2 / (i + 1);
162 input_spatial_layers[i].max_qp = 30 * (i + 1) / 2;
163 input_spatial_layers[i].num_of_temporal_layers = 3 - i;
165 constexpr ::media::Bitrate kBitrate =
166 ::media::Bitrate::ConstantBitrate(kBaseBitrateBps);
168 ::media::VideoEncodeAccelerator::Config input_config(
169 ::media::PIXEL_FORMAT_NV12, kBaseSize, ::media::VP9PROFILE_PROFILE0,
170 kBitrate, kBaseFramerate, absl::nullopt, absl::nullopt, false,
171 ::media::VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer,
172 ::media::VideoEncodeAccelerator::Config::ContentType::kCamera,
173 input_spatial_layers, ::media::SVCInterLayerPredMode::kOnKeyPic);
175 ::media::VideoEncodeAccelerator::Config output_config{};
177 mojo::test::SerializeAndDeserialize<mojom::VideoEncodeAcceleratorConfig>(
178 input_config, output_config));
179 EXPECT_EQ(input_config, output_config);
182 TEST(VideoEncodeAcceleratorConfigStructTraitTest, RoundTripVariableBitrate) {
183 constexpr gfx::Size kBaseSize(320, 180);
184 constexpr uint32_t kBaseBitrateBps = 123456u;
185 constexpr uint32_t kMaximumBitrate = 999999u;
186 const ::media::Bitrate kBitrate =
187 ::media::Bitrate::VariableBitrate(kBaseBitrateBps, kMaximumBitrate);
188 ::media::VideoEncodeAccelerator::Config input_config(
189 ::media::PIXEL_FORMAT_NV12, kBaseSize, ::media::VP9PROFILE_PROFILE0,
192 ::media::VideoEncodeAccelerator::Config output_config{};
194 mojo::test::SerializeAndDeserialize<mojom::VideoEncodeAcceleratorConfig>(
195 input_config, output_config));
196 EXPECT_EQ(input_config, output_config);
199 TEST(VariableBitrateStructTraitTest, PeakZeroBps_Rejected) {
200 mojom::VariableBitratePtr mojom_variable_bitrate =
201 mojom::VariableBitrate::New();
202 mojom_variable_bitrate->target_bps = 0u;
203 mojom_variable_bitrate->peak_bps = 0u;
206 bool result = mojo::test::SerializeAndDeserialize<mojom::VariableBitrate>(
207 mojom_variable_bitrate, output);
208 EXPECT_FALSE(result);
211 TEST(VariableBitrateStructTraitTest, PeakLessThanTarget_Rejected) {
212 mojom::VariableBitratePtr mojom_variable_bitrate =
213 mojom::VariableBitrate::New();
214 mojom_variable_bitrate->target_bps = 6000u;
215 mojom_variable_bitrate->peak_bps = 5999u;
218 bool result = mojo::test::SerializeAndDeserialize<mojom::VariableBitrate>(
219 mojom_variable_bitrate, output);
220 EXPECT_FALSE(result);
223 TEST(BitstreamBufferMetadataTraitTest, RoundTrip) {
224 ::media::BitstreamBufferMetadata input_metadata;
225 input_metadata.payload_size_bytes = 1234;
226 input_metadata.key_frame = true;
227 input_metadata.timestamp = base::Milliseconds(123456);
228 ::media::BitstreamBufferMetadata output_metadata;
230 mojo::test::SerializeAndDeserialize<mojom::BitstreamBufferMetadata>(
231 input_metadata, output_metadata));
232 EXPECT_EQ(input_metadata, output_metadata);
235 h264.temporal_idx = 1;
236 h264.layer_sync = true;
237 input_metadata.h264 = h264;
238 output_metadata = ::media::BitstreamBufferMetadata();
240 mojo::test::SerializeAndDeserialize<mojom::BitstreamBufferMetadata>(
241 input_metadata, output_metadata));
242 EXPECT_EQ(input_metadata, output_metadata);
243 input_metadata.h264.reset();
246 vp8.non_reference = true;
247 vp8.temporal_idx = 1;
248 vp8.layer_sync = false;
249 input_metadata.vp8 = vp8;
250 output_metadata = ::media::BitstreamBufferMetadata();
252 mojo::test::SerializeAndDeserialize<mojom::BitstreamBufferMetadata>(
253 input_metadata, output_metadata));
254 EXPECT_EQ(input_metadata, output_metadata);
255 input_metadata.vp8.reset();
258 vp9.inter_pic_predicted = true;
259 vp9.temporal_up_switch = true;
260 vp9.referenced_by_upper_spatial_layers = true;
261 vp9.reference_lower_spatial_layers = true;
262 vp9.end_of_picture = true;
263 vp9.temporal_idx = 2;
265 vp9.spatial_layer_resolutions = {gfx::Size(320, 180), gfx::Size(640, 360)};
266 vp9.p_diffs = {0, 1};
267 input_metadata.vp9 = vp9;
268 output_metadata = ::media::BitstreamBufferMetadata();
270 mojo::test::SerializeAndDeserialize<mojom::BitstreamBufferMetadata>(
271 input_metadata, output_metadata));
272 EXPECT_EQ(input_metadata, output_metadata);