// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_PEERCONNECTION_STATS_COLLECTING_ENCODER_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_PEERCONNECTION_STATS_COLLECTING_ENCODER_H_ #include <algorithm> #include <vector> #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/thread_annotations.h" #include "base/time/time.h" #include "media/base/video_codecs.h" #include "third_party/blink/renderer/platform/peerconnection/linear_histogram.h" #include "third_party/blink/renderer/platform/peerconnection/stats_collector.h" #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/wtf/deque.h" #include "third_party/webrtc/api/video_codecs/sdp_video_format.h" #include "third_party/webrtc/api/video_codecs/video_encoder.h" namespace blink { // This class acts as a wrapper around the WebRTC video encoder that is used in // Chrome. // // Its purpose is to collect encode performance statistics for the current video // stream. The performance statistics is pushed to a local database through a // callback and is later used to determine if a specific video configuration is // considered to be smooth or not, see // https://w3c.github.io/media-capabilities/. Smooth will be an optimistic // prediction and data collection therefore only takes place if there's a single // encoder active. // // It's assumed that Configure(), Encode(), and RegisterEncodeCompleteCallback() // are called on the encode sequence. Encoded() may be called on either the // encode sequecene or the gpu sequence depending on if the underlying encoder // is a HW or SW encoder. However, the calls to Encoded() on these sequences are // mutual exclusive. Release() may be called on any sequence as long as the // encoding sequence has stopped. class PLATFORM_EXPORT StatsCollectingEncoder : private StatsCollector, public webrtc::VideoEncoder, private webrtc::EncodedImageCallback { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_PEERCONNECTION_STATS_COLLECTING_ENCODER_H_