1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- * Copyright 2020 The WebRTC Project Authors. All rights reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
- #ifndef CALL_ADAPTATION_VIDEO_SOURCE_RESTRICTIONS_H_
- #define CALL_ADAPTATION_VIDEO_SOURCE_RESTRICTIONS_H_
- #include <string>
- #include <utility>
- #include "absl/types/optional.h"
- namespace webrtc {
- // Describes optional restrictions to the resolution and frame rate of a video
- // source.
- class VideoSourceRestrictions {
- public:
- // Constructs without any restrictions.
- VideoSourceRestrictions();
- // All values must be positive or nullopt.
- // TODO(hbos): Support expressing "disable this stream"?
- VideoSourceRestrictions(absl::optional<size_t> max_pixels_per_frame,
- absl::optional<size_t> target_pixels_per_frame,
- absl::optional<double> max_frame_rate);
- bool operator==(const VideoSourceRestrictions& rhs) const {
- return max_pixels_per_frame_ == rhs.max_pixels_per_frame_ &&
- target_pixels_per_frame_ == rhs.target_pixels_per_frame_ &&
- max_frame_rate_ == rhs.max_frame_rate_;
- }
- bool operator!=(const VideoSourceRestrictions& rhs) const {
- return !(*this == rhs);
- }
- std::string ToString() const;
- // The source must produce a resolution less than or equal to
- // max_pixels_per_frame().
- const absl::optional<size_t>& max_pixels_per_frame() const;
- // The source should produce a resolution as close to the
- // target_pixels_per_frame() as possible, provided this does not exceed
- // max_pixels_per_frame().
- // The actual pixel count selected depends on the capabilities of the source.
- // TODO(hbos): Clarify how "target" is used. One possible implementation: open
- // the camera in the smallest resolution that is greater than or equal to the
- // target and scale it down to the target if it is greater. Is this an
- // accurate description of what this does today, or do we do something else?
- const absl::optional<size_t>& target_pixels_per_frame() const;
- const absl::optional<double>& max_frame_rate() const;
- void set_max_pixels_per_frame(absl::optional<size_t> max_pixels_per_frame);
- void set_target_pixels_per_frame(
- absl::optional<size_t> target_pixels_per_frame);
- void set_max_frame_rate(absl::optional<double> max_frame_rate);
- private:
- // These map to rtc::VideoSinkWants's |max_pixel_count| and
- // |target_pixel_count|.
- absl::optional<size_t> max_pixels_per_frame_;
- absl::optional<size_t> target_pixels_per_frame_;
- absl::optional<double> max_frame_rate_;
- };
- bool DidRestrictionsIncrease(VideoSourceRestrictions before,
- VideoSourceRestrictions after);
- bool DidRestrictionsDecrease(VideoSourceRestrictions before,
- VideoSourceRestrictions after);
- bool DidIncreaseResolution(VideoSourceRestrictions restrictions_before,
- VideoSourceRestrictions restrictions_after);
- bool DidDecreaseResolution(VideoSourceRestrictions restrictions_before,
- VideoSourceRestrictions restrictions_after);
- bool DidIncreaseFrameRate(VideoSourceRestrictions restrictions_before,
- VideoSourceRestrictions restrictions_after);
- bool DidDecreaseFrameRate(VideoSourceRestrictions restrictions_before,
- VideoSourceRestrictions restrictions_after);
- } // namespace webrtc
- #endif // CALL_ADAPTATION_VIDEO_SOURCE_RESTRICTIONS_H_
|