[go: nahoru, domu]

blob: 94bafbe34381085c8adbd7baddfc825164092a10 [file] [log] [blame]
Avi Drissmand387f0922022-09-14 20:51:311// Copyright 2017 The Chromium Authors
Miguel Casas-Sanchez15e2e592017-07-19 01:45:252// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Miyoung Shin25bb8c092019-08-03 00:56:575#include "media/mojo/mojom/video_encode_accelerator_mojom_traits.h"
Miguel Casas-Sanchez15e2e592017-07-19 01:45:256
Arthur Sonzogni581b9e82024-01-30 17:25:157#include <optional>
8
Hans Wennborg7e26d908e2020-04-24 20:55:499#include "base/notreached.h"
Erik Språngf169a572018-06-29 08:44:2910#include "media/base/video_bitrate_allocation.h"
Ken Rockot5a4c9e62020-07-22 21:55:1611#include "media/mojo/mojom/video_encode_accelerator.mojom.h"
Clarissa Garvey9d93d112022-05-24 20:59:1312#include "media/video/video_encode_accelerator.h"
Erik Språnge24828d2018-07-10 11:33:1513#include "mojo/public/cpp/base/time_mojom_traits.h"
Miguel Casas-Sanchez15e2e592017-07-19 01:45:2514
15namespace mojo {
16
17// static
Clarissa Garvey9d93d112022-05-24 20:59:1318media::mojom::VideoEncodeAcceleratorSupportedRateControlMode
19EnumTraits<media::mojom::VideoEncodeAcceleratorSupportedRateControlMode,
20 media::VideoEncodeAccelerator::SupportedRateControlMode>::
21 ToMojom(media::VideoEncodeAccelerator::SupportedRateControlMode mode) {
22 switch (mode) {
23 case media::VideoEncodeAccelerator::kNoMode:
24 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
25 kNoMode;
26 case media::VideoEncodeAccelerator::kConstantMode:
27 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
28 kConstantMode;
29 case media::VideoEncodeAccelerator::kVariableMode:
30 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
31 kVariableMode;
Eugene Zemtsova48f4a22023-06-27 21:43:4032 case media::VideoEncodeAccelerator::kExternalMode:
33 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
34 kExternalMode;
Clarissa Garvey9d93d112022-05-24 20:59:1335 }
Peter Boström0ce6af602023-05-15 21:27:2436 NOTREACHED_NORETURN();
Clarissa Garvey9d93d112022-05-24 20:59:1337}
38
39// static
40bool EnumTraits<media::mojom::VideoEncodeAcceleratorSupportedRateControlMode,
41 media::VideoEncodeAccelerator::SupportedRateControlMode>::
42 FromMojom(media::mojom::VideoEncodeAcceleratorSupportedRateControlMode mode,
43 media::VideoEncodeAccelerator::SupportedRateControlMode* out) {
44 switch (mode) {
45 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::kNoMode:
46 *out = media::VideoEncodeAccelerator::kNoMode;
47 return true;
48 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
49 kConstantMode:
50 *out = media::VideoEncodeAccelerator::kConstantMode;
51 return true;
52 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
53 kVariableMode:
54 *out = media::VideoEncodeAccelerator::kVariableMode;
55 return true;
Eugene Zemtsova48f4a22023-06-27 21:43:4056 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
57 kExternalMode:
58 *out = media::VideoEncodeAccelerator::kExternalMode;
59 return true;
Clarissa Garvey9d93d112022-05-24 20:59:1360 }
Peter Boström0ce6af602023-05-15 21:27:2461 NOTREACHED_NORETURN();
Clarissa Garvey9d93d112022-05-24 20:59:1362}
63
64// static
Hirokazu Hondaeb11e4a92020-02-19 11:25:0065bool StructTraits<media::mojom::VideoEncodeAcceleratorSupportedProfileDataView,
66 media::VideoEncodeAccelerator::SupportedProfile>::
67 Read(media::mojom::VideoEncodeAcceleratorSupportedProfileDataView data,
68 media::VideoEncodeAccelerator::SupportedProfile* out) {
69 if (!data.ReadMinResolution(&out->min_resolution) ||
70 !data.ReadMaxResolution(&out->max_resolution) ||
71 !data.ReadProfile(&out->profile)) {
72 return false;
73 }
74
75 out->max_framerate_numerator = data.max_framerate_numerator();
76 out->max_framerate_denominator = data.max_framerate_denominator();
Clarissa Garvey9d93d112022-05-24 20:59:1377 out->rate_control_modes = media::VideoEncodeAccelerator::kNoMode;
78 std::vector<media::VideoEncodeAccelerator::SupportedRateControlMode> modes;
79 if (!data.ReadRateControlModes(&modes))
80 return false;
81 for (const auto& mode : modes) {
82 out->rate_control_modes |= mode;
83 }
Zhaoliang Ma640402732021-08-30 07:14:2684
85 std::vector<media::SVCScalabilityMode> scalability_modes;
86 if (!data.ReadScalabilityModes(&scalability_modes))
87 return false;
88 out->scalability_modes = std::move(scalability_modes);
89
Dale Curtisa86d7aa2022-12-20 08:06:0990 out->is_software_codec = data.is_software_codec();
91
Hirokazu Hondaeb11e4a92020-02-19 11:25:0092 return true;
93}
94
95// static
Clarissa Garveyb5e8c6b2022-03-30 18:49:1096bool StructTraits<media::mojom::VariableBitratePeakDataView, uint32_t>::Read(
97 media::mojom::VariableBitratePeakDataView data,
98 uint32_t* out_peak_bps) {
99 uint32_t peak_bps = data.bps();
100 if (peak_bps == 0)
101 return false;
102 *out_peak_bps = peak_bps;
103 return true;
104}
105
106// static
Clarissa Garvey1726b822022-01-28 20:06:07107std::vector<uint32_t> StructTraits<media::mojom::VideoBitrateAllocationDataView,
108 media::VideoBitrateAllocation>::
Erik Språngf169a572018-06-29 08:44:29109 bitrates(const media::VideoBitrateAllocation& bitrate_allocation) {
Clarissa Garvey1726b822022-01-28 20:06:07110 std::vector<uint32_t> bitrates;
111 uint32_t sum_bps = 0;
Erik Språngf169a572018-06-29 08:44:29112 for (size_t si = 0; si < media::VideoBitrateAllocation::kMaxSpatialLayers;
113 ++si) {
114 for (size_t ti = 0; ti < media::VideoBitrateAllocation::kMaxTemporalLayers;
115 ++ti) {
116 if (sum_bps == bitrate_allocation.GetSumBps()) {
117 // The rest is all zeros, no need to iterate further.
118 return bitrates;
119 }
Clarissa Garvey1726b822022-01-28 20:06:07120 const uint32_t layer_bitrate = bitrate_allocation.GetBitrateBps(si, ti);
Erik Språngf169a572018-06-29 08:44:29121 bitrates.emplace_back(layer_bitrate);
122 sum_bps += layer_bitrate;
123 }
124 }
125 return bitrates;
126}
127
128// static
129bool StructTraits<media::mojom::VideoBitrateAllocationDataView,
130 media::VideoBitrateAllocation>::
131 Read(media::mojom::VideoBitrateAllocationDataView data,
132 media::VideoBitrateAllocation* out_bitrate_allocation) {
Arthur Sonzogni581b9e82024-01-30 17:25:15133 std::optional<uint32_t> peak_bps;
Clarissa Garveyb5e8c6b2022-03-30 18:49:10134 if (!data.ReadVariableBitratePeak(&peak_bps))
135 return false;
136 if (peak_bps.has_value()) {
137 *out_bitrate_allocation =
138 media::VideoBitrateAllocation(media::Bitrate::Mode::kVariable);
139 } else {
140 *out_bitrate_allocation =
141 media::VideoBitrateAllocation(media::Bitrate::Mode::kConstant);
142 }
Clarissa Garvey1726b822022-01-28 20:06:07143 ArrayDataView<uint32_t> bitrates;
Erik Språngf169a572018-06-29 08:44:29144 data.GetBitratesDataView(&bitrates);
145 size_t size = bitrates.size();
146 if (size > media::VideoBitrateAllocation::kMaxSpatialLayers *
147 media::VideoBitrateAllocation::kMaxTemporalLayers) {
148 return false;
149 }
150 for (size_t i = 0; i < size; ++i) {
Clarissa Garvey1726b822022-01-28 20:06:07151 const uint32_t bitrate = bitrates[i];
Erik Språngf169a572018-06-29 08:44:29152 const size_t si = i / media::VideoBitrateAllocation::kMaxTemporalLayers;
153 const size_t ti = i % media::VideoBitrateAllocation::kMaxTemporalLayers;
154 if (!out_bitrate_allocation->SetBitrate(si, ti, bitrate)) {
155 return false;
156 }
157 }
Clarissa Garveyb5e8c6b2022-03-30 18:49:10158
159 if (peak_bps.has_value()) {
160 if (!out_bitrate_allocation->SetPeakBps(*peak_bps)) {
161 // Invalid (too low) peak for the sum of the bitrates.
162 return false;
163 }
164 }
165
Erik Språngf169a572018-06-29 08:44:29166 return true;
167}
168
Erik Språnge24828d2018-07-10 11:33:15169// static
Eugene Zemtsov04028832023-06-23 00:22:25170bool StructTraits<media::mojom::VideoEncodeOptionsDataView,
171 media::VideoEncoder::EncodeOptions>::
172 Read(media::mojom::VideoEncodeOptionsDataView data,
173 media::VideoEncoder::EncodeOptions* out_options) {
174 out_options->key_frame = data.force_keyframe();
175 int32_t quantizer = data.quantizer();
176 if (quantizer < 0) {
177 out_options->quantizer.reset();
178 } else {
179 out_options->quantizer = data.quantizer();
180 }
181
182 return true;
183}
184
185// static
Hirokazu Hondabf652e72020-07-02 04:08:00186bool UnionTraits<media::mojom::CodecMetadataDataView,
187 media::BitstreamBufferMetadata>::
188 Read(media::mojom::CodecMetadataDataView data,
189 media::BitstreamBufferMetadata* out) {
190 switch (data.tag()) {
Daniel Cheng40fbe2f2022-04-20 22:12:53191 case media::mojom::CodecMetadataDataView::Tag::kH264: {
Hirokazu Hondab7a2f882021-08-04 03:19:24192 return data.ReadH264(&out->h264);
193 }
Daniel Cheng40fbe2f2022-04-20 22:12:53194 case media::mojom::CodecMetadataDataView::Tag::kVp8: {
Hirokazu Hondabf652e72020-07-02 04:08:00195 return data.ReadVp8(&out->vp8);
196 }
Daniel Cheng40fbe2f2022-04-20 22:12:53197 case media::mojom::CodecMetadataDataView::Tag::kVp9: {
Hirokazu Hondabf652e72020-07-02 04:08:00198 return data.ReadVp9(&out->vp9);
199 }
Daniel Cheng40fbe2f2022-04-20 22:12:53200 case media::mojom::CodecMetadataDataView::Tag::kAv1: {
Qiu Jianlinb683c4b2021-12-14 01:55:08201 return data.ReadAv1(&out->av1);
202 }
Qiu Jianlin3d5e7162022-10-26 10:26:24203 case media::mojom::CodecMetadataDataView::Tag::kH265: {
204 return data.ReadH265(&out->h265);
205 }
Hirokazu Hondabf652e72020-07-02 04:08:00206 }
Peter Boström0ce6af602023-05-15 21:27:24207 NOTREACHED_NORETURN();
Hirokazu Hondabf652e72020-07-02 04:08:00208}
209
210// static
Erik Språnge24828d2018-07-10 11:33:15211bool StructTraits<media::mojom::BitstreamBufferMetadataDataView,
212 media::BitstreamBufferMetadata>::
213 Read(media::mojom::BitstreamBufferMetadataDataView data,
Hirokazu Hondabf652e72020-07-02 04:08:00214 media::BitstreamBufferMetadata* metadata) {
215 metadata->payload_size_bytes = data.payload_size_bytes();
216 metadata->key_frame = data.key_frame();
217 if (!data.ReadTimestamp(&metadata->timestamp)) {
Erik Språnge24828d2018-07-10 11:33:15218 return false;
219 }
Hirokazu Honda76b82142024-01-17 03:27:17220 metadata->end_of_picture = data.end_of_picture();
Zhaoliang Mac27f3432021-12-16 05:49:47221 metadata->qp = data.qp();
Dale Curtisc7e40022022-12-17 00:37:52222 if (!data.ReadEncodedSize(&metadata->encoded_size)) {
223 return false;
224 }
Dale Curtisf2f10a12023-03-20 17:42:21225 if (!data.ReadEncodedColorSpace(&metadata->encoded_color_space)) {
226 return false;
227 }
Hirokazu Hondabf652e72020-07-02 04:08:00228
229 return data.ReadCodecMetadata(metadata);
Erik Språnge24828d2018-07-10 11:33:15230}
231
232// static
Hirokazu Hondab7a2f882021-08-04 03:19:24233bool StructTraits<media::mojom::H264MetadataDataView, media::H264Metadata>::
234 Read(media::mojom::H264MetadataDataView data,
235 media::H264Metadata* out_metadata) {
236 out_metadata->temporal_idx = data.temporal_idx();
237 out_metadata->layer_sync = data.layer_sync();
238 return true;
239}
240
241// static
Qiu Jianlin3d5e7162022-10-26 10:26:24242bool StructTraits<media::mojom::H265MetadataDataView, media::H265Metadata>::
243 Read(media::mojom::H265MetadataDataView data,
244 media::H265Metadata* out_metadata) {
245 out_metadata->temporal_idx = data.temporal_idx();
Qiu Jianlin3d5e7162022-10-26 10:26:24246 return true;
247}
248
249// static
Erik Språnge24828d2018-07-10 11:33:15250bool StructTraits<media::mojom::Vp8MetadataDataView, media::Vp8Metadata>::Read(
251 media::mojom::Vp8MetadataDataView data,
252 media::Vp8Metadata* out_metadata) {
253 out_metadata->non_reference = data.non_reference();
254 out_metadata->temporal_idx = data.temporal_idx();
255 out_metadata->layer_sync = data.layer_sync();
256 return true;
257}
Pin-chih Line6ff3d972018-07-27 11:15:04258
259// static
Hirokazu Hondabf652e72020-07-02 04:08:00260bool StructTraits<media::mojom::Vp9MetadataDataView, media::Vp9Metadata>::Read(
261 media::mojom::Vp9MetadataDataView data,
262 media::Vp9Metadata* out_metadata) {
Zhaoliang Madef7827b2021-08-05 07:19:29263 out_metadata->inter_pic_predicted = data.inter_pic_predicted();
Hirokazu Hondabf652e72020-07-02 04:08:00264 out_metadata->temporal_up_switch = data.temporal_up_switch();
Zhaoliang Ma641a7b02021-06-15 06:53:13265 out_metadata->referenced_by_upper_spatial_layers =
266 data.referenced_by_upper_spatial_layers();
267 out_metadata->reference_lower_spatial_layers =
268 data.reference_lower_spatial_layers();
Hirokazu Hondabf652e72020-07-02 04:08:00269 out_metadata->temporal_idx = data.temporal_idx();
Zhaoliang Ma641a7b02021-06-15 06:53:13270 out_metadata->spatial_idx = data.spatial_idx();
Hirokazu Hondaf574a262023-08-31 01:53:37271 out_metadata->begin_active_spatial_layer_index =
272 data.begin_active_spatial_layer_index();
273 out_metadata->end_active_spatial_layer_index =
274 data.end_active_spatial_layer_index();
Zhaoliang Ma641a7b02021-06-15 06:53:13275 return data.ReadSpatialLayerResolutions(
276 &out_metadata->spatial_layer_resolutions) &&
277 data.ReadPDiffs(&out_metadata->p_diffs);
Hirokazu Hondabf652e72020-07-02 04:08:00278}
279
280// static
Qiu Jianlinb683c4b2021-12-14 01:55:08281bool StructTraits<media::mojom::Av1MetadataDataView, media::Av1Metadata>::Read(
282 media::mojom::Av1MetadataDataView data,
283 media::Av1Metadata* out_metadata) {
Qiu Jianlinb683c4b2021-12-14 01:55:08284 out_metadata->temporal_idx = data.temporal_idx();
Hirokazu Honda827b4992023-04-05 01:21:17285 return true;
Qiu Jianlinb683c4b2021-12-14 01:55:08286}
287
288// static
Ken Rockot5a4c9e62020-07-22 21:55:16289media::mojom::VideoEncodeAcceleratorConfig_StorageType
290EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_StorageType,
Fish Lin752b49192019-05-31 05:04:21291 media::VideoEncodeAccelerator::Config::StorageType>::
292 ToMojom(media::VideoEncodeAccelerator::Config::StorageType input) {
293 switch (input) {
Hirokazu Hondaa1de52c2021-02-17 03:24:16294 case media::VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer:
295 return media::mojom::VideoEncodeAcceleratorConfig_StorageType::
296 kGpuMemoryBuffer;
Fish Lin752b49192019-05-31 05:04:21297 case media::VideoEncodeAccelerator::Config::StorageType::kShmem:
Ken Rockot5a4c9e62020-07-22 21:55:16298 return media::mojom::VideoEncodeAcceleratorConfig_StorageType::kShmem;
Fish Lin752b49192019-05-31 05:04:21299 }
Peter Boström0ce6af602023-05-15 21:27:24300 NOTREACHED_NORETURN();
Fish Lin752b49192019-05-31 05:04:21301}
302
303// static
Ken Rockot5a4c9e62020-07-22 21:55:16304bool EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_StorageType,
Fish Lin752b49192019-05-31 05:04:21305 media::VideoEncodeAccelerator::Config::StorageType>::
Ken Rockot5a4c9e62020-07-22 21:55:16306 FromMojom(media::mojom::VideoEncodeAcceleratorConfig_StorageType input,
Fish Lin752b49192019-05-31 05:04:21307 media::VideoEncodeAccelerator::Config::StorageType* output) {
308 switch (input) {
Ken Rockot5a4c9e62020-07-22 21:55:16309 case media::mojom::VideoEncodeAcceleratorConfig_StorageType::kShmem:
Fish Lin752b49192019-05-31 05:04:21310 *output = media::VideoEncodeAccelerator::Config::StorageType::kShmem;
311 return true;
Hirokazu Hondaa1de52c2021-02-17 03:24:16312 case media::mojom::VideoEncodeAcceleratorConfig_StorageType::
313 kGpuMemoryBuffer:
314 *output =
315 media::VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer;
Fish Lin752b49192019-05-31 05:04:21316 return true;
317 }
Peter Boström0ce6af602023-05-15 21:27:24318 NOTREACHED_NORETURN();
Fish Lin752b49192019-05-31 05:04:21319}
320
321// static
Dale Curtis13f72b72022-11-17 23:37:23322media::mojom::VideoEncodeAcceleratorConfig_EncoderType
323EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_EncoderType,
324 media::VideoEncodeAccelerator::Config::EncoderType>::
325 ToMojom(media::VideoEncodeAccelerator::Config::EncoderType input) {
326 switch (input) {
327 case media::VideoEncodeAccelerator::Config::EncoderType::kHardware:
328 return media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kHardware;
329 case media::VideoEncodeAccelerator::Config::EncoderType::kSoftware:
330 return media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kSoftware;
331 case media::VideoEncodeAccelerator::Config::EncoderType::kNoPreference:
332 return media::mojom::VideoEncodeAcceleratorConfig_EncoderType::
333 kNoPreference;
334 }
Peter Boström0ce6af602023-05-15 21:27:24335 NOTREACHED_NORETURN();
Dale Curtis13f72b72022-11-17 23:37:23336}
337
338// static
339bool EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_EncoderType,
340 media::VideoEncodeAccelerator::Config::EncoderType>::
341 FromMojom(media::mojom::VideoEncodeAcceleratorConfig_EncoderType input,
342 media::VideoEncodeAccelerator::Config::EncoderType* output) {
343 switch (input) {
344 case media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kHardware:
345 *output = media::VideoEncodeAccelerator::Config::EncoderType::kHardware;
346 return true;
347 case media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kSoftware:
348 *output = media::VideoEncodeAccelerator::Config::EncoderType::kSoftware;
349 return true;
350 case media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kNoPreference:
351 *output =
352 media::VideoEncodeAccelerator::Config::EncoderType::kNoPreference;
353 return true;
354 }
Peter Boström0ce6af602023-05-15 21:27:24355 NOTREACHED_NORETURN();
Dale Curtis13f72b72022-11-17 23:37:23356}
357
358// static
Ken Rockot5a4c9e62020-07-22 21:55:16359media::mojom::VideoEncodeAcceleratorConfig_ContentType
360EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_ContentType,
Erik Språngf5420d12018-09-03 09:09:40361 media::VideoEncodeAccelerator::Config::ContentType>::
362 ToMojom(media::VideoEncodeAccelerator::Config::ContentType input) {
363 switch (input) {
364 case media::VideoEncodeAccelerator::Config::ContentType::kDisplay:
Ken Rockot5a4c9e62020-07-22 21:55:16365 return media::mojom::VideoEncodeAcceleratorConfig_ContentType::kDisplay;
Erik Språngf5420d12018-09-03 09:09:40366 case media::VideoEncodeAccelerator::Config::ContentType::kCamera:
Ken Rockot5a4c9e62020-07-22 21:55:16367 return media::mojom::VideoEncodeAcceleratorConfig_ContentType::kCamera;
Erik Språngf5420d12018-09-03 09:09:40368 }
Peter Boström0ce6af602023-05-15 21:27:24369 NOTREACHED_NORETURN();
Erik Språngf5420d12018-09-03 09:09:40370}
Zhaoliang Ma2bae0df2021-06-07 02:58:01371
Erik Språngf5420d12018-09-03 09:09:40372// static
Ken Rockot5a4c9e62020-07-22 21:55:16373bool EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_ContentType,
Erik Språngf5420d12018-09-03 09:09:40374 media::VideoEncodeAccelerator::Config::ContentType>::
Ken Rockot5a4c9e62020-07-22 21:55:16375 FromMojom(media::mojom::VideoEncodeAcceleratorConfig_ContentType input,
Erik Språngf5420d12018-09-03 09:09:40376 media::VideoEncodeAccelerator::Config::ContentType* output) {
377 switch (input) {
Ken Rockot5a4c9e62020-07-22 21:55:16378 case media::mojom::VideoEncodeAcceleratorConfig_ContentType::kCamera:
Erik Språngf5420d12018-09-03 09:09:40379 *output = media::VideoEncodeAccelerator::Config::ContentType::kCamera;
380 return true;
Ken Rockot5a4c9e62020-07-22 21:55:16381 case media::mojom::VideoEncodeAcceleratorConfig_ContentType::kDisplay:
Erik Språngf5420d12018-09-03 09:09:40382 *output = media::VideoEncodeAccelerator::Config::ContentType::kDisplay;
383 return true;
384 }
Peter Boström0ce6af602023-05-15 21:27:24385 NOTREACHED_NORETURN();
Erik Språngf5420d12018-09-03 09:09:40386}
387
388// static
Joey Arhar60b3f6a2020-04-03 21:52:17389bool StructTraits<media::mojom::SpatialLayerDataView,
390 media::VideoEncodeAccelerator::Config::SpatialLayer>::
391 Read(media::mojom::SpatialLayerDataView input,
392 media::VideoEncodeAccelerator::Config::SpatialLayer* output) {
393 output->width = input.width();
394 output->height = input.height();
395 output->bitrate_bps = input.bitrate_bps();
396 output->framerate = input.framerate();
397 output->max_qp = input.max_qp();
398 output->num_of_temporal_layers = input.num_of_temporal_layers();
399 return true;
400}
401
402// static
Clarissa Garvey3b4dc7b12022-02-25 02:52:01403bool StructTraits<media::mojom::ConstantBitrateDataView, media::Bitrate>::Read(
404 media::mojom::ConstantBitrateDataView input,
405 media::Bitrate* output) {
Clarissa Garvey86223e42022-03-02 19:02:01406 *output = media::Bitrate::ConstantBitrate(input.target_bps());
Clarissa Garvey3b4dc7b12022-02-25 02:52:01407 return true;
408}
409
410// static
411bool StructTraits<media::mojom::VariableBitrateDataView, media::Bitrate>::Read(
412 media::mojom::VariableBitrateDataView input,
413 media::Bitrate* output) {
Clarissa Garvey86223e42022-03-02 19:02:01414 if (input.target_bps() > input.peak_bps())
Clarissa Garvey3b4dc7b12022-02-25 02:52:01415 return false;
Clarissa Garvey86223e42022-03-02 19:02:01416 if (input.peak_bps() == 0u)
Clarissa Garvey3b4dc7b12022-02-25 02:52:01417 return false;
Clarissa Garvey86223e42022-03-02 19:02:01418 *output =
419 media::Bitrate::VariableBitrate(input.target_bps(), input.peak_bps());
Clarissa Garvey3b4dc7b12022-02-25 02:52:01420 return true;
421}
422
423// static
Eugene Zemtsov01fd0022023-02-24 23:00:33424bool StructTraits<media::mojom::ExternalBitrateDataView, media::Bitrate>::Read(
425 media::mojom::ExternalBitrateDataView input,
426 media::Bitrate* output) {
427 *output = media::Bitrate::ExternalRateControl();
428 return true;
429}
430
431// static
Clarissa Garvey3b4dc7b12022-02-25 02:52:01432media::mojom::BitrateDataView::Tag
433UnionTraits<media::mojom::BitrateDataView, media::Bitrate>::GetTag(
434 const media::Bitrate& input) {
435 switch (input.mode()) {
Clarissa Garvey76708b62021-06-30 22:53:26436 case media::Bitrate::Mode::kConstant:
Clarissa Garvey3b4dc7b12022-02-25 02:52:01437 return media::mojom::BitrateDataView::Tag::kConstant;
Clarissa Garvey76708b62021-06-30 22:53:26438 case media::Bitrate::Mode::kVariable:
Clarissa Garvey3b4dc7b12022-02-25 02:52:01439 return media::mojom::BitrateDataView::Tag::kVariable;
Eugene Zemtsov01fd0022023-02-24 23:00:33440 case media::Bitrate::Mode::kExternal:
441 return media::mojom::BitrateDataView::Tag::kExternal;
Clarissa Garvey76708b62021-06-30 22:53:26442 }
Peter Boström0ce6af602023-05-15 21:27:24443 NOTREACHED_NORETURN();
Clarissa Garvey76708b62021-06-30 22:53:26444}
445
446// static
Clarissa Garvey3b4dc7b12022-02-25 02:52:01447bool UnionTraits<media::mojom::BitrateDataView, media::Bitrate>::Read(
Clarissa Garvey76708b62021-06-30 22:53:26448 media::mojom::BitrateDataView input,
449 media::Bitrate* output) {
Clarissa Garvey3b4dc7b12022-02-25 02:52:01450 switch (input.tag()) {
451 case media::mojom::BitrateDataView::Tag::kConstant:
452 return input.ReadConstant(output);
453 case media::mojom::BitrateDataView::Tag::kVariable:
454 return input.ReadVariable(output);
Eugene Zemtsov01fd0022023-02-24 23:00:33455 case media::mojom::BitrateDataView::Tag::kExternal:
456 return input.ReadExternal(output);
Clarissa Garvey76708b62021-06-30 22:53:26457 }
458
Peter Boström0ce6af602023-05-15 21:27:24459 NOTREACHED_NORETURN();
Clarissa Garvey76708b62021-06-30 22:53:26460}
461
462// static
Pin-chih Line6ff3d972018-07-27 11:15:04463bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView,
464 media::VideoEncodeAccelerator::Config>::
465 Read(media::mojom::VideoEncodeAcceleratorConfigDataView input,
466 media::VideoEncodeAccelerator::Config* output) {
467 media::VideoPixelFormat input_format;
468 if (!input.ReadInputFormat(&input_format))
469 return false;
470
471 gfx::Size input_visible_size;
472 if (!input.ReadInputVisibleSize(&input_visible_size))
473 return false;
474
475 media::VideoCodecProfile output_profile;
476 if (!input.ReadOutputProfile(&output_profile))
477 return false;
478
Clarissa Garvey76708b62021-06-30 22:53:26479 media::Bitrate bitrate;
480 if (!input.ReadBitrate(&bitrate))
481 return false;
Clarissa Garvey76708b62021-06-30 22:53:26482
Arthur Sonzogni581b9e82024-01-30 17:25:15483 std::optional<uint32_t> initial_framerate;
Erik Språngf5420d12018-09-03 09:09:40484 if (input.has_initial_framerate())
Pin-chih Linfc7b5a82018-08-13 05:44:17485 initial_framerate = input.initial_framerate();
Pin-chih Linfc7b5a82018-08-13 05:44:17486
Arthur Sonzogni581b9e82024-01-30 17:25:15487 std::optional<uint32_t> gop_length;
Fish Lin46827d02019-04-03 03:46:54488 if (input.has_gop_length())
489 gop_length = input.gop_length();
490
Arthur Sonzogni581b9e82024-01-30 17:25:15491 std::optional<uint8_t> h264_output_level;
Erik Språngf5420d12018-09-03 09:09:40492 if (input.has_h264_output_level())
Pin-chih Line6ff3d972018-07-27 11:15:04493 h264_output_level = input.h264_output_level();
Erik Språngf5420d12018-09-03 09:09:40494
Chunbo Hua738df532020-07-16 16:02:45495 bool is_constrained_h264 = input.is_constrained_h264();
496
Arthur Sonzogni581b9e82024-01-30 17:25:15497 std::optional<media::VideoEncodeAccelerator::Config::StorageType>
Fish Lin752b49192019-05-31 05:04:21498 storage_type;
499 if (input.has_storage_type()) {
500 if (!input.ReadStorageType(&storage_type))
501 return false;
502 }
503
Erik Språngf5420d12018-09-03 09:09:40504 media::VideoEncodeAccelerator::Config::ContentType content_type;
505 if (!input.ReadContentType(&content_type))
506 return false;
Pin-chih Line6ff3d972018-07-27 11:15:04507
Hirokazu Honda24e34922023-12-12 13:31:40508 uint8_t drop_frame_thresh_percentage = input.drop_frame_thresh_percentage();
509 if (drop_frame_thresh_percentage > 100) {
510 return false;
511 }
Joey Arhar60b3f6a2020-04-03 21:52:17512 std::vector<media::VideoEncodeAccelerator::Config::SpatialLayer>
513 spatial_layers;
514 if (!input.ReadSpatialLayers(&spatial_layers))
515 return false;
516
Hirokazu Honda4723b5e32023-07-03 00:31:04517 media::SVCInterLayerPredMode inter_layer_pred;
Zhaoliang Ma2bae0df2021-06-07 02:58:01518 if (!input.ReadInterLayerPred(&inter_layer_pred))
519 return false;
520
Dale Curtis13f72b72022-11-17 23:37:23521 media::VideoEncodeAccelerator::Config::EncoderType required_encoder_type;
522 if (!input.ReadRequiredEncoderType(&required_encoder_type))
523 return false;
524
Hirokazu Hondaf9ba5f42023-12-01 08:51:00525 struct CheckVEAConfig {
526 // The variable declaration order must be the same as
527 // VideoEncodeAccelerator::Config.
528 media::VideoPixelFormat input_format;
529 gfx::Size input_visible_size;
530 media::VideoCodecProfile output_profile;
531 media::Bitrate bitrate;
Arthur Sonzogni581b9e82024-01-30 17:25:15532 std::optional<uint32_t> initial_framerate;
533 std::optional<uint32_t> gop_length;
534 std::optional<uint8_t> h264_output_level;
Hirokazu Hondaf9ba5f42023-12-01 08:51:00535 bool is_constrained_h264;
Arthur Sonzogni581b9e82024-01-30 17:25:15536 std::optional<media::VideoEncodeAccelerator::Config::StorageType>
Hirokazu Hondaf9ba5f42023-12-01 08:51:00537 storage_type;
538 media::VideoEncodeAccelerator::Config::ContentType content_type;
Hirokazu Honda24e34922023-12-12 13:31:40539 uint8_t drop_frame_thresh_percentage;
Hirokazu Hondaf9ba5f42023-12-01 08:51:00540 std::vector<media::VideoEncodeAccelerator::Config::SpatialLayer>
541 spatial_layers;
542 media::SVCInterLayerPredMode inter_layer_pred;
543 bool require_low_delay = true;
544 media::VideoEncodeAccelerator::Config::EncoderType required_encoder_type;
545 };
546 static_assert(
547 sizeof(CheckVEAConfig) == sizeof(media::VideoEncodeAccelerator::Config),
548 "Please apply removed/added values in VideoEncodeAccelerator::Config "
549 "to the following copy and then remove/add the values in CheckVEAConfig");
Eugene Zemtsovcc675432021-05-19 04:04:30550
Hirokazu Hondaf9ba5f42023-12-01 08:51:00551 *output = media::VideoEncodeAccelerator::Config(
552 input_format, input_visible_size, output_profile, bitrate);
553 output->initial_framerate = initial_framerate;
554 output->gop_length = gop_length;
555 output->h264_output_level = h264_output_level;
556 output->is_constrained_h264 = is_constrained_h264;
557 output->storage_type = storage_type;
558 output->content_type = content_type;
Hirokazu Honda24e34922023-12-12 13:31:40559 output->drop_frame_thresh_percentage = drop_frame_thresh_percentage;
Hirokazu Hondaf9ba5f42023-12-01 08:51:00560 output->spatial_layers = spatial_layers;
561 output->inter_layer_pred = inter_layer_pred;
Eugene Zemtsovcc675432021-05-19 04:04:30562 output->require_low_delay = input.require_low_delay();
Dale Curtis13f72b72022-11-17 23:37:23563 output->required_encoder_type = required_encoder_type;
Clarissa Garvey76708b62021-06-30 22:53:26564
Pin-chih Line6ff3d972018-07-27 11:15:04565 return true;
566}
567
Miguel Casas-Sanchez15e2e592017-07-19 01:45:25568} // namespace mojo