| /* | 
 |  *  Copyright (c) 2018 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 API_VIDEO_CODECS_VP8_TEMPORAL_LAYERS_H_ | 
 | #define API_VIDEO_CODECS_VP8_TEMPORAL_LAYERS_H_ | 
 |  | 
 | #include <memory> | 
 | #include <vector> | 
 |  | 
 | #include "api/fec_controller_override.h" | 
 | #include "api/video_codecs/video_codec.h" | 
 | #include "api/video_codecs/vp8_frame_buffer_controller.h" | 
 | #include "api/video_codecs/vp8_frame_config.h" | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | // Two different flavors of temporal layers are currently available: | 
 | // kFixedPattern uses a fixed repeating pattern of 1-4 layers. | 
 | // kBitrateDynamic can allocate frames dynamically to 1 or 2 layers, based on | 
 | // the bitrate produced. | 
 | // TODO(eladalon): Remove this enum. | 
 | enum class Vp8TemporalLayersType { kFixedPattern, kBitrateDynamic }; | 
 |  | 
 | // This interface defines a way of getting the encoder settings needed to | 
 | // realize a temporal layer structure. | 
 | class Vp8TemporalLayers final : public Vp8FrameBufferController { | 
 |  public: | 
 |   Vp8TemporalLayers( | 
 |       std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers, | 
 |       FecControllerOverride* fec_controller_override); | 
 |   ~Vp8TemporalLayers() override = default; | 
 |  | 
 |   void SetQpLimits(size_t stream_index, int min_qp, int max_qp) override; | 
 |  | 
 |   size_t StreamCount() const override; | 
 |  | 
 |   bool SupportsEncoderFrameDropping(size_t stream_index) const override; | 
 |  | 
 |   void OnRatesUpdated(size_t stream_index, | 
 |                       const std::vector<uint32_t>& bitrates_bps, | 
 |                       int framerate_fps) override; | 
 |  | 
 |   Vp8EncoderConfig UpdateConfiguration(size_t stream_index) override; | 
 |  | 
 |   Vp8FrameConfig NextFrameConfig(size_t stream_index, | 
 |                                  uint32_t rtp_timestamp) override; | 
 |  | 
 |   void OnEncodeDone(size_t stream_index, | 
 |                     uint32_t rtp_timestamp, | 
 |                     size_t size_bytes, | 
 |                     bool is_keyframe, | 
 |                     int qp, | 
 |                     CodecSpecificInfo* info) override; | 
 |  | 
 |   void OnFrameDropped(size_t stream_index, uint32_t rtp_timestamp) override; | 
 |  | 
 |   void OnPacketLossRateUpdate(float packet_loss_rate) override; | 
 |  | 
 |   void OnRttUpdate(int64_t rtt_ms) override; | 
 |  | 
 |   void OnLossNotification( | 
 |       const VideoEncoder::LossNotification& loss_notification) override; | 
 |  | 
 |  private: | 
 |   std::vector<std::unique_ptr<Vp8FrameBufferController>> controllers_; | 
 | }; | 
 |  | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // API_VIDEO_CODECS_VP8_TEMPORAL_LAYERS_H_ |