123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- #ifndef CALL_ADAPTATION_VIDEO_STREAM_ADAPTER_H_
- #define CALL_ADAPTATION_VIDEO_STREAM_ADAPTER_H_
- #include <memory>
- #include <utility>
- #include <vector>
- #include "absl/types/optional.h"
- #include "absl/types/variant.h"
- #include "api/adaptation/resource.h"
- #include "api/rtp_parameters.h"
- #include "api/video/video_adaptation_counters.h"
- #include "api/video/video_stream_encoder_observer.h"
- #include "call/adaptation/adaptation_constraint.h"
- #include "call/adaptation/degradation_preference_provider.h"
- #include "call/adaptation/video_source_restrictions.h"
- #include "call/adaptation/video_stream_input_state.h"
- #include "call/adaptation/video_stream_input_state_provider.h"
- #include "modules/video_coding/utility/quality_scaler.h"
- #include "rtc_base/experiments/balanced_degradation_settings.h"
- #include "rtc_base/thread_annotations.h"
- namespace webrtc {
- class VideoSourceRestrictionsListener {
- public:
- virtual ~VideoSourceRestrictionsListener();
-
-
-
- virtual void OnVideoSourceRestrictionsUpdated(
- VideoSourceRestrictions restrictions,
- const VideoAdaptationCounters& adaptation_counters,
- rtc::scoped_refptr<Resource> reason,
- const VideoSourceRestrictions& unfiltered_restrictions) = 0;
- };
- class VideoStreamAdapter;
- extern const int kMinFrameRateFps;
- VideoSourceRestrictions FilterRestrictionsByDegradationPreference(
- VideoSourceRestrictions source_restrictions,
- DegradationPreference degradation_preference);
- int GetHigherResolutionThan(int pixel_count);
- class Adaptation final {
- public:
- enum class Status {
-
-
- kValid,
-
-
- kLimitReached,
-
-
-
- kAwaitingPreviousAdaptation,
-
- kInsufficientInput,
-
- kAdaptationDisabled,
-
- kRejectedByConstraint,
- };
- static const char* StatusToString(Status status);
- Status status() const;
- const VideoStreamInputState& input_state() const;
- const VideoSourceRestrictions& restrictions() const;
- const VideoAdaptationCounters& counters() const;
- private:
- friend class VideoStreamAdapter;
-
- Adaptation(int validation_id,
- VideoSourceRestrictions restrictions,
- VideoAdaptationCounters counters,
- VideoStreamInputState input_state);
-
- Adaptation(int validation_id, Status invalid_status);
-
-
-
-
- const int validation_id_;
- const Status status_;
-
- const VideoStreamInputState input_state_;
- const VideoSourceRestrictions restrictions_;
- const VideoAdaptationCounters counters_;
- };
- class VideoStreamAdapter {
- public:
- VideoStreamAdapter(VideoStreamInputStateProvider* input_state_provider,
- VideoStreamEncoderObserver* encoder_stats_observer);
- ~VideoStreamAdapter();
- VideoSourceRestrictions source_restrictions() const;
- const VideoAdaptationCounters& adaptation_counters() const;
- void ClearRestrictions();
- void AddRestrictionsListener(
- VideoSourceRestrictionsListener* restrictions_listener);
- void RemoveRestrictionsListener(
- VideoSourceRestrictionsListener* restrictions_listener);
- void AddAdaptationConstraint(AdaptationConstraint* adaptation_constraint);
- void RemoveAdaptationConstraint(AdaptationConstraint* adaptation_constraint);
-
-
-
- void SetDegradationPreference(DegradationPreference degradation_preference);
-
-
- Adaptation GetAdaptationUp();
- Adaptation GetAdaptationDown();
- Adaptation GetAdaptationTo(const VideoAdaptationCounters& counters,
- const VideoSourceRestrictions& restrictions);
-
-
-
-
- Adaptation GetAdaptDownResolution();
-
- void ApplyAdaptation(const Adaptation& adaptation,
- rtc::scoped_refptr<Resource> resource);
- struct RestrictionsWithCounters {
- VideoSourceRestrictions restrictions;
- VideoAdaptationCounters counters;
- };
- private:
- void BroadcastVideoRestrictionsUpdate(
- const VideoStreamInputState& input_state,
- const rtc::scoped_refptr<Resource>& resource);
- bool HasSufficientInputForAdaptation(const VideoStreamInputState& input_state)
- const RTC_RUN_ON(&sequence_checker_);
- using RestrictionsOrState =
- absl::variant<RestrictionsWithCounters, Adaptation::Status>;
- RestrictionsOrState GetAdaptationUpStep(
- const VideoStreamInputState& input_state) const
- RTC_RUN_ON(&sequence_checker_);
- RestrictionsOrState GetAdaptationDownStep(
- const VideoStreamInputState& input_state,
- const RestrictionsWithCounters& current_restrictions) const
- RTC_RUN_ON(&sequence_checker_);
- RestrictionsOrState GetAdaptDownResolutionStepForBalanced(
- const VideoStreamInputState& input_state) const
- RTC_RUN_ON(&sequence_checker_);
- RestrictionsOrState AdaptIfFpsDiffInsufficient(
- const VideoStreamInputState& input_state,
- const RestrictionsWithCounters& restrictions) const
- RTC_RUN_ON(&sequence_checker_);
- Adaptation GetAdaptationUp(const VideoStreamInputState& input_state) const
- RTC_RUN_ON(&sequence_checker_);
- Adaptation GetAdaptationDown(const VideoStreamInputState& input_state) const
- RTC_RUN_ON(&sequence_checker_);
- static RestrictionsOrState DecreaseResolution(
- const VideoStreamInputState& input_state,
- const RestrictionsWithCounters& current_restrictions);
- static RestrictionsOrState IncreaseResolution(
- const VideoStreamInputState& input_state,
- const RestrictionsWithCounters& current_restrictions);
-
-
- RestrictionsOrState DecreaseFramerate(
- const VideoStreamInputState& input_state,
- const RestrictionsWithCounters& current_restrictions) const
- RTC_RUN_ON(&sequence_checker_);
- RestrictionsOrState IncreaseFramerate(
- const VideoStreamInputState& input_state,
- const RestrictionsWithCounters& current_restrictions) const
- RTC_RUN_ON(&sequence_checker_);
- struct RestrictionsOrStateVisitor;
- Adaptation RestrictionsOrStateToAdaptation(
- RestrictionsOrState step_or_state,
- const VideoStreamInputState& input_state) const
- RTC_RUN_ON(&sequence_checker_);
- SequenceChecker sequence_checker_ RTC_GUARDED_BY(&sequence_checker_);
-
-
- VideoStreamInputStateProvider* input_state_provider_;
-
- VideoStreamEncoderObserver* const encoder_stats_observer_;
-
- const BalancedDegradationSettings balanced_settings_;
-
-
- int adaptation_validation_id_ RTC_GUARDED_BY(&sequence_checker_);
-
-
-
- DegradationPreference degradation_preference_
- RTC_GUARDED_BY(&sequence_checker_);
-
-
-
-
-
-
- struct AwaitingFrameSizeChange {
- AwaitingFrameSizeChange(bool pixels_increased, int frame_size);
- const bool pixels_increased;
- const int frame_size_pixels;
- };
- absl::optional<AwaitingFrameSizeChange> awaiting_frame_size_change_
- RTC_GUARDED_BY(&sequence_checker_);
-
- VideoSourceRestrictions last_video_source_restrictions_
- RTC_GUARDED_BY(&sequence_checker_);
- VideoSourceRestrictions last_filtered_restrictions_
- RTC_GUARDED_BY(&sequence_checker_);
- std::vector<VideoSourceRestrictionsListener*> restrictions_listeners_
- RTC_GUARDED_BY(&sequence_checker_);
- std::vector<AdaptationConstraint*> adaptation_constraints_
- RTC_GUARDED_BY(&sequence_checker_);
- RestrictionsWithCounters current_restrictions_
- RTC_GUARDED_BY(&sequence_checker_);
- };
- }
- #endif
|