1 // Copyright 2017 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 "base/notreached.h"
8 #include "media/base/video_bitrate_allocation.h"
9 #include "media/mojo/mojom/video_encode_accelerator.mojom.h"
10 #include "media/video/video_encode_accelerator.h"
11 #include "mojo/public/cpp/base/time_mojom_traits.h"
12 #include "third_party/abseil-cpp/absl/types/optional.h"
17 media::mojom::VideoEncodeAcceleratorSupportedRateControlMode
18 EnumTraits<media::mojom::VideoEncodeAcceleratorSupportedRateControlMode,
19 media::VideoEncodeAccelerator::SupportedRateControlMode>::
20 ToMojom(media::VideoEncodeAccelerator::SupportedRateControlMode mode) {
22 case media::VideoEncodeAccelerator::kNoMode:
23 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
25 case media::VideoEncodeAccelerator::kConstantMode:
26 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
28 case media::VideoEncodeAccelerator::kVariableMode:
29 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
31 case media::VideoEncodeAccelerator::kExternalMode:
32 return media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
35 NOTREACHED_NORETURN();
39 bool EnumTraits<media::mojom::VideoEncodeAcceleratorSupportedRateControlMode,
40 media::VideoEncodeAccelerator::SupportedRateControlMode>::
41 FromMojom(media::mojom::VideoEncodeAcceleratorSupportedRateControlMode mode,
42 media::VideoEncodeAccelerator::SupportedRateControlMode* out) {
44 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::kNoMode:
45 *out = media::VideoEncodeAccelerator::kNoMode;
47 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
49 *out = media::VideoEncodeAccelerator::kConstantMode;
51 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
53 *out = media::VideoEncodeAccelerator::kVariableMode;
55 case media::mojom::VideoEncodeAcceleratorSupportedRateControlMode::
57 *out = media::VideoEncodeAccelerator::kExternalMode;
60 NOTREACHED_NORETURN();
64 bool StructTraits<media::mojom::VideoEncodeAcceleratorSupportedProfileDataView,
65 media::VideoEncodeAccelerator::SupportedProfile>::
66 Read(media::mojom::VideoEncodeAcceleratorSupportedProfileDataView data,
67 media::VideoEncodeAccelerator::SupportedProfile* out) {
68 if (!data.ReadMinResolution(&out->min_resolution) ||
69 !data.ReadMaxResolution(&out->max_resolution) ||
70 !data.ReadProfile(&out->profile)) {
74 out->max_framerate_numerator = data.max_framerate_numerator();
75 out->max_framerate_denominator = data.max_framerate_denominator();
76 out->rate_control_modes = media::VideoEncodeAccelerator::kNoMode;
77 std::vector<media::VideoEncodeAccelerator::SupportedRateControlMode> modes;
78 if (!data.ReadRateControlModes(&modes))
80 for (const auto& mode : modes) {
81 out->rate_control_modes |= mode;
84 std::vector<media::SVCScalabilityMode> scalability_modes;
85 if (!data.ReadScalabilityModes(&scalability_modes))
87 out->scalability_modes = std::move(scalability_modes);
89 out->is_software_codec = data.is_software_codec();
95 bool StructTraits<media::mojom::VariableBitratePeakDataView, uint32_t>::Read(
96 media::mojom::VariableBitratePeakDataView data,
97 uint32_t* out_peak_bps) {
98 uint32_t peak_bps = data.bps();
101 *out_peak_bps = peak_bps;
106 std::vector<uint32_t> StructTraits<media::mojom::VideoBitrateAllocationDataView,
107 media::VideoBitrateAllocation>::
108 bitrates(const media::VideoBitrateAllocation& bitrate_allocation) {
109 std::vector<uint32_t> bitrates;
110 uint32_t sum_bps = 0;
111 for (size_t si = 0; si < media::VideoBitrateAllocation::kMaxSpatialLayers;
113 for (size_t ti = 0; ti < media::VideoBitrateAllocation::kMaxTemporalLayers;
115 if (sum_bps == bitrate_allocation.GetSumBps()) {
116 // The rest is all zeros, no need to iterate further.
119 const uint32_t layer_bitrate = bitrate_allocation.GetBitrateBps(si, ti);
120 bitrates.emplace_back(layer_bitrate);
121 sum_bps += layer_bitrate;
128 bool StructTraits<media::mojom::VideoBitrateAllocationDataView,
129 media::VideoBitrateAllocation>::
130 Read(media::mojom::VideoBitrateAllocationDataView data,
131 media::VideoBitrateAllocation* out_bitrate_allocation) {
132 absl::optional<uint32_t> peak_bps;
133 if (!data.ReadVariableBitratePeak(&peak_bps))
135 if (peak_bps.has_value()) {
136 *out_bitrate_allocation =
137 media::VideoBitrateAllocation(media::Bitrate::Mode::kVariable);
139 *out_bitrate_allocation =
140 media::VideoBitrateAllocation(media::Bitrate::Mode::kConstant);
142 ArrayDataView<uint32_t> bitrates;
143 data.GetBitratesDataView(&bitrates);
144 size_t size = bitrates.size();
145 if (size > media::VideoBitrateAllocation::kMaxSpatialLayers *
146 media::VideoBitrateAllocation::kMaxTemporalLayers) {
149 for (size_t i = 0; i < size; ++i) {
150 const uint32_t bitrate = bitrates[i];
151 const size_t si = i / media::VideoBitrateAllocation::kMaxTemporalLayers;
152 const size_t ti = i % media::VideoBitrateAllocation::kMaxTemporalLayers;
153 if (!out_bitrate_allocation->SetBitrate(si, ti, bitrate)) {
158 if (peak_bps.has_value()) {
159 if (!out_bitrate_allocation->SetPeakBps(*peak_bps)) {
160 // Invalid (too low) peak for the sum of the bitrates.
169 bool StructTraits<media::mojom::VideoEncodeOptionsDataView,
170 media::VideoEncoder::EncodeOptions>::
171 Read(media::mojom::VideoEncodeOptionsDataView data,
172 media::VideoEncoder::EncodeOptions* out_options) {
173 out_options->key_frame = data.force_keyframe();
174 int32_t quantizer = data.quantizer();
176 out_options->quantizer.reset();
178 out_options->quantizer = data.quantizer();
185 bool UnionTraits<media::mojom::CodecMetadataDataView,
186 media::BitstreamBufferMetadata>::
187 Read(media::mojom::CodecMetadataDataView data,
188 media::BitstreamBufferMetadata* out) {
189 switch (data.tag()) {
190 case media::mojom::CodecMetadataDataView::Tag::kH264: {
191 return data.ReadH264(&out->h264);
193 case media::mojom::CodecMetadataDataView::Tag::kVp8: {
194 return data.ReadVp8(&out->vp8);
196 case media::mojom::CodecMetadataDataView::Tag::kVp9: {
197 return data.ReadVp9(&out->vp9);
199 case media::mojom::CodecMetadataDataView::Tag::kAv1: {
200 return data.ReadAv1(&out->av1);
202 case media::mojom::CodecMetadataDataView::Tag::kH265: {
203 return data.ReadH265(&out->h265);
206 NOTREACHED_NORETURN();
210 bool StructTraits<media::mojom::BitstreamBufferMetadataDataView,
211 media::BitstreamBufferMetadata>::
212 Read(media::mojom::BitstreamBufferMetadataDataView data,
213 media::BitstreamBufferMetadata* metadata) {
214 metadata->payload_size_bytes = data.payload_size_bytes();
215 metadata->key_frame = data.key_frame();
216 if (!data.ReadTimestamp(&metadata->timestamp)) {
219 metadata->qp = data.qp();
220 if (!data.ReadEncodedSize(&metadata->encoded_size)) {
223 if (!data.ReadEncodedColorSpace(&metadata->encoded_color_space)) {
227 return data.ReadCodecMetadata(metadata);
231 bool StructTraits<media::mojom::H264MetadataDataView, media::H264Metadata>::
232 Read(media::mojom::H264MetadataDataView data,
233 media::H264Metadata* out_metadata) {
234 out_metadata->temporal_idx = data.temporal_idx();
235 out_metadata->layer_sync = data.layer_sync();
240 bool StructTraits<media::mojom::H265MetadataDataView, media::H265Metadata>::
241 Read(media::mojom::H265MetadataDataView data,
242 media::H265Metadata* out_metadata) {
243 out_metadata->temporal_idx = data.temporal_idx();
248 bool StructTraits<media::mojom::Vp8MetadataDataView, media::Vp8Metadata>::Read(
249 media::mojom::Vp8MetadataDataView data,
250 media::Vp8Metadata* out_metadata) {
251 out_metadata->non_reference = data.non_reference();
252 out_metadata->temporal_idx = data.temporal_idx();
253 out_metadata->layer_sync = data.layer_sync();
258 bool StructTraits<media::mojom::Vp9MetadataDataView, media::Vp9Metadata>::Read(
259 media::mojom::Vp9MetadataDataView data,
260 media::Vp9Metadata* out_metadata) {
261 out_metadata->inter_pic_predicted = data.inter_pic_predicted();
262 out_metadata->temporal_up_switch = data.temporal_up_switch();
263 out_metadata->referenced_by_upper_spatial_layers =
264 data.referenced_by_upper_spatial_layers();
265 out_metadata->reference_lower_spatial_layers =
266 data.reference_lower_spatial_layers();
267 out_metadata->end_of_picture = data.end_of_picture();
268 out_metadata->temporal_idx = data.temporal_idx();
269 out_metadata->spatial_idx = data.spatial_idx();
270 out_metadata->begin_active_spatial_layer_index =
271 data.begin_active_spatial_layer_index();
272 out_metadata->end_active_spatial_layer_index =
273 data.end_active_spatial_layer_index();
274 return data.ReadSpatialLayerResolutions(
275 &out_metadata->spatial_layer_resolutions) &&
276 data.ReadPDiffs(&out_metadata->p_diffs);
280 bool StructTraits<media::mojom::Av1MetadataDataView, media::Av1Metadata>::Read(
281 media::mojom::Av1MetadataDataView data,
282 media::Av1Metadata* out_metadata) {
283 out_metadata->temporal_idx = data.temporal_idx();
288 media::mojom::VideoEncodeAcceleratorConfig_StorageType
289 EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_StorageType,
290 media::VideoEncodeAccelerator::Config::StorageType>::
291 ToMojom(media::VideoEncodeAccelerator::Config::StorageType input) {
293 case media::VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer:
294 return media::mojom::VideoEncodeAcceleratorConfig_StorageType::
296 case media::VideoEncodeAccelerator::Config::StorageType::kShmem:
297 return media::mojom::VideoEncodeAcceleratorConfig_StorageType::kShmem;
299 NOTREACHED_NORETURN();
303 bool EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_StorageType,
304 media::VideoEncodeAccelerator::Config::StorageType>::
305 FromMojom(media::mojom::VideoEncodeAcceleratorConfig_StorageType input,
306 media::VideoEncodeAccelerator::Config::StorageType* output) {
308 case media::mojom::VideoEncodeAcceleratorConfig_StorageType::kShmem:
309 *output = media::VideoEncodeAccelerator::Config::StorageType::kShmem;
311 case media::mojom::VideoEncodeAcceleratorConfig_StorageType::
314 media::VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer;
317 NOTREACHED_NORETURN();
321 media::mojom::VideoEncodeAcceleratorConfig_EncoderType
322 EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_EncoderType,
323 media::VideoEncodeAccelerator::Config::EncoderType>::
324 ToMojom(media::VideoEncodeAccelerator::Config::EncoderType input) {
326 case media::VideoEncodeAccelerator::Config::EncoderType::kHardware:
327 return media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kHardware;
328 case media::VideoEncodeAccelerator::Config::EncoderType::kSoftware:
329 return media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kSoftware;
330 case media::VideoEncodeAccelerator::Config::EncoderType::kNoPreference:
331 return media::mojom::VideoEncodeAcceleratorConfig_EncoderType::
334 NOTREACHED_NORETURN();
338 bool EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_EncoderType,
339 media::VideoEncodeAccelerator::Config::EncoderType>::
340 FromMojom(media::mojom::VideoEncodeAcceleratorConfig_EncoderType input,
341 media::VideoEncodeAccelerator::Config::EncoderType* output) {
343 case media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kHardware:
344 *output = media::VideoEncodeAccelerator::Config::EncoderType::kHardware;
346 case media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kSoftware:
347 *output = media::VideoEncodeAccelerator::Config::EncoderType::kSoftware;
349 case media::mojom::VideoEncodeAcceleratorConfig_EncoderType::kNoPreference:
351 media::VideoEncodeAccelerator::Config::EncoderType::kNoPreference;
354 NOTREACHED_NORETURN();
358 media::mojom::VideoEncodeAcceleratorConfig_ContentType
359 EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_ContentType,
360 media::VideoEncodeAccelerator::Config::ContentType>::
361 ToMojom(media::VideoEncodeAccelerator::Config::ContentType input) {
363 case media::VideoEncodeAccelerator::Config::ContentType::kDisplay:
364 return media::mojom::VideoEncodeAcceleratorConfig_ContentType::kDisplay;
365 case media::VideoEncodeAccelerator::Config::ContentType::kCamera:
366 return media::mojom::VideoEncodeAcceleratorConfig_ContentType::kCamera;
368 NOTREACHED_NORETURN();
372 bool EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_ContentType,
373 media::VideoEncodeAccelerator::Config::ContentType>::
374 FromMojom(media::mojom::VideoEncodeAcceleratorConfig_ContentType input,
375 media::VideoEncodeAccelerator::Config::ContentType* output) {
377 case media::mojom::VideoEncodeAcceleratorConfig_ContentType::kCamera:
378 *output = media::VideoEncodeAccelerator::Config::ContentType::kCamera;
380 case media::mojom::VideoEncodeAcceleratorConfig_ContentType::kDisplay:
381 *output = media::VideoEncodeAccelerator::Config::ContentType::kDisplay;
384 NOTREACHED_NORETURN();
388 bool StructTraits<media::mojom::SpatialLayerDataView,
389 media::VideoEncodeAccelerator::Config::SpatialLayer>::
390 Read(media::mojom::SpatialLayerDataView input,
391 media::VideoEncodeAccelerator::Config::SpatialLayer* output) {
392 output->width = input.width();
393 output->height = input.height();
394 output->bitrate_bps = input.bitrate_bps();
395 output->framerate = input.framerate();
396 output->max_qp = input.max_qp();
397 output->num_of_temporal_layers = input.num_of_temporal_layers();
402 bool StructTraits<media::mojom::ConstantBitrateDataView, media::Bitrate>::Read(
403 media::mojom::ConstantBitrateDataView input,
404 media::Bitrate* output) {
405 *output = media::Bitrate::ConstantBitrate(input.target_bps());
410 bool StructTraits<media::mojom::VariableBitrateDataView, media::Bitrate>::Read(
411 media::mojom::VariableBitrateDataView input,
412 media::Bitrate* output) {
413 if (input.target_bps() > input.peak_bps())
415 if (input.peak_bps() == 0u)
418 media::Bitrate::VariableBitrate(input.target_bps(), input.peak_bps());
423 bool StructTraits<media::mojom::ExternalBitrateDataView, media::Bitrate>::Read(
424 media::mojom::ExternalBitrateDataView input,
425 media::Bitrate* output) {
426 *output = media::Bitrate::ExternalRateControl();
431 media::mojom::BitrateDataView::Tag
432 UnionTraits<media::mojom::BitrateDataView, media::Bitrate>::GetTag(
433 const media::Bitrate& input) {
434 switch (input.mode()) {
435 case media::Bitrate::Mode::kConstant:
436 return media::mojom::BitrateDataView::Tag::kConstant;
437 case media::Bitrate::Mode::kVariable:
438 return media::mojom::BitrateDataView::Tag::kVariable;
439 case media::Bitrate::Mode::kExternal:
440 return media::mojom::BitrateDataView::Tag::kExternal;
442 NOTREACHED_NORETURN();
446 bool UnionTraits<media::mojom::BitrateDataView, media::Bitrate>::Read(
447 media::mojom::BitrateDataView input,
448 media::Bitrate* output) {
449 switch (input.tag()) {
450 case media::mojom::BitrateDataView::Tag::kConstant:
451 return input.ReadConstant(output);
452 case media::mojom::BitrateDataView::Tag::kVariable:
453 return input.ReadVariable(output);
454 case media::mojom::BitrateDataView::Tag::kExternal:
455 return input.ReadExternal(output);
458 NOTREACHED_NORETURN();
462 bool StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView,
463 media::VideoEncodeAccelerator::Config>::
464 Read(media::mojom::VideoEncodeAcceleratorConfigDataView input,
465 media::VideoEncodeAccelerator::Config* output) {
466 media::VideoPixelFormat input_format;
467 if (!input.ReadInputFormat(&input_format))
470 gfx::Size input_visible_size;
471 if (!input.ReadInputVisibleSize(&input_visible_size))
474 media::VideoCodecProfile output_profile;
475 if (!input.ReadOutputProfile(&output_profile))
478 media::Bitrate bitrate;
479 if (!input.ReadBitrate(&bitrate))
482 absl::optional<uint32_t> initial_framerate;
483 if (input.has_initial_framerate())
484 initial_framerate = input.initial_framerate();
486 absl::optional<uint32_t> gop_length;
487 if (input.has_gop_length())
488 gop_length = input.gop_length();
490 absl::optional<uint8_t> h264_output_level;
491 if (input.has_h264_output_level())
492 h264_output_level = input.h264_output_level();
494 bool is_constrained_h264 = input.is_constrained_h264();
496 absl::optional<media::VideoEncodeAccelerator::Config::StorageType>
498 if (input.has_storage_type()) {
499 if (!input.ReadStorageType(&storage_type))
503 media::VideoEncodeAccelerator::Config::ContentType content_type;
504 if (!input.ReadContentType(&content_type))
507 std::vector<media::VideoEncodeAccelerator::Config::SpatialLayer>
509 if (!input.ReadSpatialLayers(&spatial_layers))
512 media::SVCInterLayerPredMode inter_layer_pred;
513 if (!input.ReadInterLayerPred(&inter_layer_pred))
516 media::VideoEncodeAccelerator::Config::EncoderType required_encoder_type;
517 if (!input.ReadRequiredEncoderType(&required_encoder_type))
520 *output = media::VideoEncodeAccelerator::Config(
521 input_format, input_visible_size, output_profile, bitrate,
522 initial_framerate, gop_length, h264_output_level, is_constrained_h264,
523 storage_type, content_type, spatial_layers, inter_layer_pred);
525 output->require_low_delay = input.require_low_delay();
526 output->required_encoder_type = required_encoder_type;