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 #ifndef MEDIA_MOJO_MOJOM_VIDEO_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_
6 #define MEDIA_MOJO_MOJOM_VIDEO_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_
8 #include "base/notreached.h"
9 #include "media/base/bitrate.h"
10 #include "media/base/ipc/media_param_traits.h"
11 #include "media/base/video_bitrate_allocation.h"
12 #include "media/base/video_encoder.h"
13 #include "media/mojo/mojom/media_types.mojom-shared.h"
14 #include "media/mojo/mojom/video_encode_accelerator.mojom-shared.h"
15 #include "media/video/video_encode_accelerator.h"
16 #include "mojo/public/cpp/bindings/union_traits.h"
17 #include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
22 struct EnumTraits<media::mojom::VideoEncodeAcceleratorSupportedRateControlMode,
23 media::VideoEncodeAccelerator::SupportedRateControlMode> {
24 static media::mojom::VideoEncodeAcceleratorSupportedRateControlMode ToMojom(
25 media::VideoEncodeAccelerator::SupportedRateControlMode mode);
27 static bool FromMojom(
28 media::mojom::VideoEncodeAcceleratorSupportedRateControlMode input,
29 media::VideoEncodeAccelerator::SupportedRateControlMode* out);
34 media::mojom::VideoEncodeAcceleratorSupportedProfileDataView,
35 media::VideoEncodeAccelerator::SupportedProfile> {
36 static media::VideoCodecProfile profile(
37 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
38 return profile.profile;
41 static const gfx::Size& min_resolution(
42 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
43 return profile.min_resolution;
46 static const gfx::Size& max_resolution(
47 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
48 return profile.max_resolution;
51 static uint32_t max_framerate_numerator(
52 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
53 return profile.max_framerate_numerator;
56 static uint32_t max_framerate_denominator(
57 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
58 return profile.max_framerate_denominator;
61 static std::vector<media::VideoEncodeAccelerator::SupportedRateControlMode>
63 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
64 std::vector<media::VideoEncodeAccelerator::SupportedRateControlMode> modes;
65 if (profile.rate_control_modes &
66 media::VideoEncodeAccelerator::kConstantMode) {
67 modes.push_back(media::VideoEncodeAccelerator::kConstantMode);
69 if (profile.rate_control_modes &
70 media::VideoEncodeAccelerator::kVariableMode) {
71 modes.push_back(media::VideoEncodeAccelerator::kVariableMode);
73 if (profile.rate_control_modes &
74 media::VideoEncodeAccelerator::kExternalMode) {
75 modes.push_back(media::VideoEncodeAccelerator::kExternalMode);
80 static const std::vector<media::SVCScalabilityMode>& scalability_modes(
81 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
82 return profile.scalability_modes;
85 static bool is_software_codec(
86 const media::VideoEncodeAccelerator::SupportedProfile& profile) {
87 return profile.is_software_codec;
91 media::mojom::VideoEncodeAcceleratorSupportedProfileDataView data,
92 media::VideoEncodeAccelerator::SupportedProfile* out);
96 class StructTraits<media::mojom::VariableBitratePeakDataView, uint32_t> {
98 static constexpr uint32_t bps(const uint32_t peak_bps) { return peak_bps; }
100 static bool Read(media::mojom::VariableBitratePeakDataView data,
101 uint32_t* out_peak_bps);
105 class StructTraits<media::mojom::VideoBitrateAllocationDataView,
106 media::VideoBitrateAllocation> {
108 static std::vector<uint32_t> bitrates(
109 const media::VideoBitrateAllocation& bitrate_allocation);
111 static absl::optional<uint32_t> variable_bitrate_peak(
112 const media::VideoBitrateAllocation& bitrate_allocation) {
113 if (bitrate_allocation.GetMode() == media::Bitrate::Mode::kConstant) {
114 return absl::nullopt;
116 return absl::optional<uint32_t>(
117 bitrate_allocation.GetSumBitrate().peak_bps());
121 static bool Read(media::mojom::VideoBitrateAllocationDataView data,
122 media::VideoBitrateAllocation* out_bitrate_allocation);
126 class StructTraits<media::mojom::VideoEncodeOptionsDataView,
127 media::VideoEncoder::EncodeOptions> {
129 static bool force_keyframe(
130 const media::VideoEncoder::EncodeOptions& options) {
131 return options.key_frame;
134 static int32_t quantizer(const media::VideoEncoder::EncodeOptions& options) {
135 return options.quantizer.value_or(-1);
138 static bool Read(media::mojom::VideoEncodeOptionsDataView data,
139 media::VideoEncoder::EncodeOptions* out_options);
143 struct UnionTraits<media::mojom::CodecMetadataDataView,
144 media::BitstreamBufferMetadata> {
145 static media::mojom::CodecMetadataDataView::Tag GetTag(
146 const media::BitstreamBufferMetadata& metadata) {
148 return media::mojom::CodecMetadataDataView::Tag::kH264;
149 } else if (metadata.vp8) {
150 return media::mojom::CodecMetadataDataView::Tag::kVp8;
151 } else if (metadata.vp9) {
152 return media::mojom::CodecMetadataDataView::Tag::kVp9;
153 } else if (metadata.av1) {
154 return media::mojom::CodecMetadataDataView::Tag::kAv1;
155 } else if (metadata.h265) {
156 return media::mojom::CodecMetadataDataView::Tag::kH265;
158 NOTREACHED_NORETURN();
161 static bool IsNull(const media::BitstreamBufferMetadata& metadata) {
162 return !metadata.h264 && !metadata.vp8 && !metadata.vp9 && !metadata.av1 &&
166 static void SetToNull(media::BitstreamBufferMetadata* metadata) {
167 metadata->h264.reset();
168 metadata->vp8.reset();
169 metadata->vp9.reset();
170 metadata->av1.reset();
171 metadata->h265.reset();
174 static const media::H264Metadata& h264(
175 const media::BitstreamBufferMetadata& metadata) {
176 return *metadata.h264;
179 static const media::Vp8Metadata& vp8(
180 const media::BitstreamBufferMetadata& metadata) {
181 return *metadata.vp8;
184 static const media::Vp9Metadata& vp9(
185 const media::BitstreamBufferMetadata& metadata) {
186 return *metadata.vp9;
189 static const media::Av1Metadata& av1(
190 const media::BitstreamBufferMetadata& metadata) {
191 return *metadata.av1;
194 static const media::H265Metadata& h265(
195 const media::BitstreamBufferMetadata& metadata) {
196 return *metadata.h265;
199 static bool Read(media::mojom::CodecMetadataDataView data,
200 media::BitstreamBufferMetadata* metadata);
204 class StructTraits<media::mojom::BitstreamBufferMetadataDataView,
205 media::BitstreamBufferMetadata> {
207 static size_t payload_size_bytes(const media::BitstreamBufferMetadata& bbm) {
208 return bbm.payload_size_bytes;
210 static bool key_frame(const media::BitstreamBufferMetadata& bbm) {
211 return bbm.key_frame;
213 static base::TimeDelta timestamp(const media::BitstreamBufferMetadata& bbm) {
214 return bbm.timestamp;
216 static int32_t qp(const media::BitstreamBufferMetadata& bbm) {
219 static const media::BitstreamBufferMetadata& codec_metadata(
220 const media::BitstreamBufferMetadata& bbm) {
223 static absl::optional<gfx::Size> encoded_size(
224 const media::BitstreamBufferMetadata& bbm) {
225 return bbm.encoded_size;
227 static absl::optional<gfx::ColorSpace> encoded_color_space(
228 const media::BitstreamBufferMetadata& bbm) {
229 return bbm.encoded_color_space;
232 static bool Read(media::mojom::BitstreamBufferMetadataDataView data,
233 media::BitstreamBufferMetadata* out_metadata);
237 class StructTraits<media::mojom::H264MetadataDataView, media::H264Metadata> {
239 static uint8_t temporal_idx(const media::H264Metadata& h264) {
240 return h264.temporal_idx;
243 static bool layer_sync(const media::H264Metadata& h264) {
244 return h264.layer_sync;
247 static bool Read(media::mojom::H264MetadataDataView data,
248 media::H264Metadata* out_metadata);
252 class StructTraits<media::mojom::H265MetadataDataView, media::H265Metadata> {
254 static uint8_t temporal_idx(const media::H265Metadata& h265) {
255 return h265.temporal_idx;
258 static bool Read(media::mojom::H265MetadataDataView data,
259 media::H265Metadata* out_metadata);
263 class StructTraits<media::mojom::Vp8MetadataDataView, media::Vp8Metadata> {
265 static bool non_reference(const media::Vp8Metadata& vp8) {
266 return vp8.non_reference;
269 static uint8_t temporal_idx(const media::Vp8Metadata& vp8) {
270 return vp8.temporal_idx;
273 static bool layer_sync(const media::Vp8Metadata& vp8) {
274 return vp8.layer_sync;
277 static bool Read(media::mojom::Vp8MetadataDataView data,
278 media::Vp8Metadata* out_metadata);
282 class StructTraits<media::mojom::Vp9MetadataDataView, media::Vp9Metadata> {
284 static bool inter_pic_predicted(const media::Vp9Metadata& vp9) {
285 return vp9.inter_pic_predicted;
287 static bool temporal_up_switch(const media::Vp9Metadata& vp9) {
288 return vp9.temporal_up_switch;
290 static bool referenced_by_upper_spatial_layers(
291 const media::Vp9Metadata& vp9) {
292 return vp9.referenced_by_upper_spatial_layers;
294 static bool reference_lower_spatial_layers(const media::Vp9Metadata& vp9) {
295 return vp9.reference_lower_spatial_layers;
297 static bool end_of_picture(const media::Vp9Metadata& vp9) {
298 return vp9.end_of_picture;
300 static uint8_t temporal_idx(const media::Vp9Metadata& vp9) {
301 return vp9.temporal_idx;
303 static uint8_t spatial_idx(const media::Vp9Metadata& vp9) {
304 return vp9.spatial_idx;
306 static const std::vector<gfx::Size>& spatial_layer_resolutions(
307 const media::Vp9Metadata& vp9) {
308 return vp9.spatial_layer_resolutions;
310 static uint8_t begin_active_spatial_layer_index(
311 const media::Vp9Metadata& vp9) {
312 return vp9.begin_active_spatial_layer_index;
314 static uint8_t end_active_spatial_layer_index(const media::Vp9Metadata& vp9) {
315 return vp9.end_active_spatial_layer_index;
317 static const std::vector<uint8_t>& p_diffs(const media::Vp9Metadata& vp9) {
321 static bool Read(media::mojom::Vp9MetadataDataView data,
322 media::Vp9Metadata* out_metadata);
326 class StructTraits<media::mojom::Av1MetadataDataView, media::Av1Metadata> {
328 static uint8_t temporal_idx(const media::Av1Metadata& av1) {
329 return av1.temporal_idx;
332 static bool Read(media::mojom::Av1MetadataDataView data,
333 media::Av1Metadata* out_metadata);
337 struct EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_StorageType,
338 media::VideoEncodeAccelerator::Config::StorageType> {
339 static media::mojom::VideoEncodeAcceleratorConfig_StorageType ToMojom(
340 media::VideoEncodeAccelerator::Config::StorageType input);
342 static bool FromMojom(
343 media::mojom::VideoEncodeAcceleratorConfig_StorageType,
344 media::VideoEncodeAccelerator::Config::StorageType* output);
348 struct EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_EncoderType,
349 media::VideoEncodeAccelerator::Config::EncoderType> {
350 static media::mojom::VideoEncodeAcceleratorConfig_EncoderType ToMojom(
351 media::VideoEncodeAccelerator::Config::EncoderType input);
353 static bool FromMojom(
354 media::mojom::VideoEncodeAcceleratorConfig_EncoderType,
355 media::VideoEncodeAccelerator::Config::EncoderType* output);
359 struct EnumTraits<media::mojom::VideoEncodeAcceleratorConfig_ContentType,
360 media::VideoEncodeAccelerator::Config::ContentType> {
361 static media::mojom::VideoEncodeAcceleratorConfig_ContentType ToMojom(
362 media::VideoEncodeAccelerator::Config::ContentType input);
364 static bool FromMojom(
365 media::mojom::VideoEncodeAcceleratorConfig_ContentType,
366 media::VideoEncodeAccelerator::Config::ContentType* output);
370 struct StructTraits<media::mojom::SpatialLayerDataView,
371 media::VideoEncodeAccelerator::Config::SpatialLayer> {
372 static int32_t width(
373 const media::VideoEncodeAccelerator::Config::SpatialLayer& input) {
377 static int32_t height(
378 const media::VideoEncodeAccelerator::Config::SpatialLayer& input) {
382 static uint32_t bitrate_bps(
383 const media::VideoEncodeAccelerator::Config::SpatialLayer& input) {
384 return input.bitrate_bps;
387 static uint32_t framerate(
388 const media::VideoEncodeAccelerator::Config::SpatialLayer& input) {
389 return input.framerate;
392 static uint8_t max_qp(
393 const media::VideoEncodeAccelerator::Config::SpatialLayer& input) {
397 static uint8_t num_of_temporal_layers(
398 const media::VideoEncodeAccelerator::Config::SpatialLayer& input) {
399 return input.num_of_temporal_layers;
402 static bool Read(media::mojom::SpatialLayerDataView input,
403 media::VideoEncodeAccelerator::Config::SpatialLayer* output);
407 struct StructTraits<media::mojom::ConstantBitrateDataView, media::Bitrate> {
408 static uint32_t target_bps(const media::Bitrate& input) {
409 return input.target_bps();
412 static bool Read(media::mojom::ConstantBitrateDataView input,
413 media::Bitrate* output);
417 struct StructTraits<media::mojom::VariableBitrateDataView, media::Bitrate> {
418 static uint32_t target_bps(const media::Bitrate& input) {
419 return input.target_bps();
421 static uint32_t peak_bps(const media::Bitrate& input) {
422 return input.peak_bps();
424 static bool Read(media::mojom::VariableBitrateDataView input,
425 media::Bitrate* output);
429 struct StructTraits<media::mojom::ExternalBitrateDataView, media::Bitrate> {
430 static bool Read(media::mojom::ExternalBitrateDataView input,
431 media::Bitrate* output);
435 struct UnionTraits<media::mojom::BitrateDataView, media::Bitrate> {
436 static media::mojom::BitrateDataView::Tag GetTag(const media::Bitrate& input);
437 static media::Bitrate constant(const media::Bitrate& input) { return input; }
438 static media::Bitrate variable(const media::Bitrate& input) { return input; }
439 static media::Bitrate external(const media::Bitrate& input) { return input; }
440 static bool Read(media::mojom::BitrateDataView input, media::Bitrate* output);
444 struct StructTraits<media::mojom::VideoEncodeAcceleratorConfigDataView,
445 media::VideoEncodeAccelerator::Config> {
446 static media::VideoPixelFormat input_format(
447 const media::VideoEncodeAccelerator::Config& input) {
448 return input.input_format;
451 static const gfx::Size& input_visible_size(
452 const media::VideoEncodeAccelerator::Config& input) {
453 return input.input_visible_size;
456 static media::VideoCodecProfile output_profile(
457 const media::VideoEncodeAccelerator::Config& input) {
458 return input.output_profile;
461 static const media::Bitrate& bitrate(
462 const media::VideoEncodeAccelerator::Config& input) {
463 return input.bitrate;
466 static uint32_t initial_framerate(
467 const media::VideoEncodeAccelerator::Config& input) {
468 return input.initial_framerate.value_or(0);
471 static bool has_initial_framerate(
472 const media::VideoEncodeAccelerator::Config& input) {
473 return input.initial_framerate.has_value();
476 static uint32_t gop_length(
477 const media::VideoEncodeAccelerator::Config& input) {
478 return input.gop_length.value_or(0);
481 static bool has_gop_length(
482 const media::VideoEncodeAccelerator::Config& input) {
483 return input.gop_length.has_value();
486 static uint8_t h264_output_level(
487 const media::VideoEncodeAccelerator::Config& input) {
488 return input.h264_output_level.value_or(0);
491 static bool has_h264_output_level(
492 const media::VideoEncodeAccelerator::Config& input) {
493 return input.h264_output_level.has_value();
496 static bool is_constrained_h264(
497 const media::VideoEncodeAccelerator::Config& input) {
498 return input.is_constrained_h264;
501 static media::VideoEncodeAccelerator::Config::StorageType storage_type(
502 const media::VideoEncodeAccelerator::Config& input) {
503 return input.storage_type.value_or(
504 media::VideoEncodeAccelerator::Config::StorageType::kShmem);
507 static bool has_storage_type(
508 const media::VideoEncodeAccelerator::Config& input) {
509 return input.storage_type.has_value();
512 static media::VideoEncodeAccelerator::Config::ContentType content_type(
513 const media::VideoEncodeAccelerator::Config& input) {
514 return input.content_type;
517 static const std::vector<media::VideoEncodeAccelerator::Config::SpatialLayer>&
518 spatial_layers(const media::VideoEncodeAccelerator::Config& input) {
519 return input.spatial_layers;
522 static media::SVCInterLayerPredMode inter_layer_pred(
523 const media::VideoEncodeAccelerator::Config& input) {
524 return input.inter_layer_pred;
527 static bool require_low_delay(
528 const media::VideoEncodeAccelerator::Config& input) {
529 return input.require_low_delay;
532 static media::VideoEncodeAccelerator::Config::EncoderType
533 required_encoder_type(const media::VideoEncodeAccelerator::Config& input) {
534 return input.required_encoder_type;
537 static bool Read(media::mojom::VideoEncodeAcceleratorConfigDataView input,
538 media::VideoEncodeAccelerator::Config* output);
543 #endif // MEDIA_MOJO_MOJOM_VIDEO_ENCODE_ACCELERATOR_MOJOM_TRAITS_H_