blob: bfcea49efc439967deeed2b7fb6232fad878919f [file] [log] [blame]
// Copyright 2020 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 MEDIA_MOJO_MOJOM_VIDEO_FRAME_METADATA_MOJOM_TRAITS_H_
#define MEDIA_MOJO_MOJOM_VIDEO_FRAME_METADATA_MOJOM_TRAITS_H_
#include "base/memory/ref_counted.h"
#include "media/base/ipc/media_param_traits_macros.h"
#include "media/base/video_frame_metadata.h"
#include "media/base/video_transformation.h"
#include "media/mojo/mojom/media_types.mojom-shared.h"
#include "media/mojo/mojom/media_types_enum_mojom_traits.h"
#include "media/mojo/mojom/video_transformation_mojom_traits.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
namespace mojo {
// Creates a has_foo() and a foo() to serialize a foo absl::optional<>.
#define GENERATE_OPT_SERIALIZATION(type, field, default_value) \
static bool has_##field(const media::VideoFrameMetadata& input) { \
return input.field.has_value(); \
} \
\
static type field(const media::VideoFrameMetadata& input) { \
return input.field.value_or(default_value); \
}
template <>
struct StructTraits<media::mojom::VideoFrameMetadataDataView,
media::VideoFrameMetadata> {
static bool allow_overlay(const media::VideoFrameMetadata& input) {
return input.allow_overlay;
}
static bool end_of_stream(const media::VideoFrameMetadata& input) {
return input.end_of_stream;
}
static bool texture_owner(const media::VideoFrameMetadata& input) {
return input.texture_owner;
}
static bool wants_promotion_hint(const media::VideoFrameMetadata& input) {
return input.wants_promotion_hint;
}
static bool protected_video(const media::VideoFrameMetadata& input) {
return input.protected_video;
}
static bool hw_protected(const media::VideoFrameMetadata& input) {
return input.hw_protected;
}
static uint32_t hw_protected_validation_id(
const media::VideoFrameMetadata& input) {
return input.hw_protected_validation_id;
}
static bool power_efficient(const media::VideoFrameMetadata& input) {
return input.power_efficient;
}
static bool read_lock_fences_enabled(const media::VideoFrameMetadata& input) {
return input.read_lock_fences_enabled;
}
static bool interactive_content(const media::VideoFrameMetadata& input) {
return input.interactive_content;
}
static bool texture_origin_is_top_left(
const media::VideoFrameMetadata& input) {
return input.texture_origin_is_top_left;
}
GENERATE_OPT_SERIALIZATION(int, capture_counter, 0)
GENERATE_OPT_SERIALIZATION(
media::VideoFrameMetadata::CopyMode,
copy_mode,
media::VideoFrameMetadata::CopyMode::kCopyToNewTexture)
static absl::optional<media::VideoTransformation> transformation(
const media::VideoFrameMetadata& input) {
return input.transformation;
}
GENERATE_OPT_SERIALIZATION(double, device_scale_factor, 0.0)
GENERATE_OPT_SERIALIZATION(double, page_scale_factor, 0.0)
GENERATE_OPT_SERIALIZATION(double, root_scroll_offset_x, 0.0)
GENERATE_OPT_SERIALIZATION(double, root_scroll_offset_y, 0.0)
GENERATE_OPT_SERIALIZATION(double, top_controls_visible_height, 0.0)
GENERATE_OPT_SERIALIZATION(double, frame_rate, 0.0)
GENERATE_OPT_SERIALIZATION(double, rtp_timestamp, 0.0)
static absl::optional<gfx::Rect> capture_update_rect(
const media::VideoFrameMetadata& input) {
return input.capture_update_rect;
}
static absl::optional<base::UnguessableToken> overlay_plane_id(
const media::VideoFrameMetadata& input) {
return input.overlay_plane_id;
}
static absl::optional<base::TimeTicks> receive_time(
const media::VideoFrameMetadata& input) {
return input.receive_time;
}
static absl::optional<base::TimeTicks> capture_begin_time(
const media::VideoFrameMetadata& input) {
return input.capture_begin_time;
}
static absl::optional<base::TimeTicks> capture_end_time(
const media::VideoFrameMetadata& input) {
return input.capture_end_time;
}
static absl::optional<base::TimeTicks> decode_begin_time(
const media::VideoFrameMetadata& input) {
return input.decode_begin_time;
}
static absl::optional<base::TimeTicks> decode_end_time(
const media::VideoFrameMetadata& input) {
return input.decode_end_time;
}
static absl::optional<base::TimeTicks> reference_time(
const media::VideoFrameMetadata& input) {
return input.reference_time;
}
static absl::optional<base::TimeDelta> processing_time(
const media::VideoFrameMetadata& input) {
return input.processing_time;
}
static absl::optional<base::TimeDelta> frame_duration(
const media::VideoFrameMetadata& input) {
return input.frame_duration;
}
static absl::optional<base::TimeDelta> wallclock_frame_duration(
const media::VideoFrameMetadata& input) {
return input.wallclock_frame_duration;
}
static bool Read(media::mojom::VideoFrameMetadataDataView input,
media::VideoFrameMetadata* output);
};
} // namespace mojo
#endif // MEDIA_MOJO_MOJOM_VIDEO_FRAME_METADATA_MOJOM_TRAITS_H_