blob: efd013e4cd9a11cd421f37a4b0ac7b535648ad4f [file] [log] [blame]
Erik Språng8abd56c2018-10-01 18:47:03 +02001/*
2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Erik Språng4529fbc2018-10-12 10:30:31 +020011#ifndef API_VIDEO_CODECS_VP8_TEMPORAL_LAYERS_H_
12#define API_VIDEO_CODECS_VP8_TEMPORAL_LAYERS_H_
Erik Språng8abd56c2018-10-01 18:47:03 +020013
Elad Aloncde8ab22019-03-20 11:56:20 +010014#include <memory>
Erik Språng8abd56c2018-10-01 18:47:03 +020015#include <vector>
16
Elad Alon7e00c672019-06-28 18:12:15 +020017#include "api/fec_controller_override.h"
Elad Aloncde8ab22019-03-20 11:56:20 +010018#include "api/video_codecs/video_codec.h"
Elad Alonde3360e2019-03-06 21:14:54 +010019#include "api/video_codecs/vp8_frame_buffer_controller.h"
Elad Alon411b49b2019-01-29 14:05:55 +010020#include "api/video_codecs/vp8_frame_config.h"
Elad Alonf5b216a2019-01-28 14:25:17 +010021
Erik Språng8abd56c2018-10-01 18:47:03 +020022namespace webrtc {
23
Erik Språng4529fbc2018-10-12 10:30:31 +020024// Two different flavors of temporal layers are currently available:
25// kFixedPattern uses a fixed repeating pattern of 1-4 layers.
26// kBitrateDynamic can allocate frames dynamically to 1 or 2 layers, based on
27// the bitrate produced.
Elad Aloncde8ab22019-03-20 11:56:20 +010028// TODO(eladalon): Remove this enum.
Erik Språng4529fbc2018-10-12 10:30:31 +020029enum class Vp8TemporalLayersType { kFixedPattern, kBitrateDynamic };
Erik Språng8abd56c2018-10-01 18:47:03 +020030
Erik Språng8abd56c2018-10-01 18:47:03 +020031// This interface defines a way of getting the encoder settings needed to
Erik Språng4529fbc2018-10-12 10:30:31 +020032// realize a temporal layer structure.
Elad Aloncde8ab22019-03-20 11:56:20 +010033class Vp8TemporalLayers final : public Vp8FrameBufferController {
Erik Språng8abd56c2018-10-01 18:47:03 +020034 public:
Elad Aloncde8ab22019-03-20 11:56:20 +010035 explicit Vp8TemporalLayers(
36 std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers);
Elad Alonde3360e2019-03-06 21:14:54 +010037 ~Vp8TemporalLayers() override = default;
Erik Språng8abd56c2018-10-01 18:47:03 +020038
Elad Alonfb087812019-05-02 23:25:34 +020039 void SetQpLimits(size_t stream_index, int min_qp, int max_qp) override;
40
Elad Alon7e00c672019-06-28 18:12:15 +020041 void SetFecControllerOverride(
42 FecControllerOverride* fec_controller_override) override;
43
Elad Aloncde8ab22019-03-20 11:56:20 +010044 size_t StreamCount() const override;
Erik Språng8abd56c2018-10-01 18:47:03 +020045
Elad Aloncde8ab22019-03-20 11:56:20 +010046 bool SupportsEncoderFrameDropping(size_t stream_index) const override;
Erik Språng8abd56c2018-10-01 18:47:03 +020047
Elad Aloncde8ab22019-03-20 11:56:20 +010048 void OnRatesUpdated(size_t stream_index,
49 const std::vector<uint32_t>& bitrates_bps,
50 int framerate_fps) override;
Erik Språng8abd56c2018-10-01 18:47:03 +020051
Elad Alonfb087812019-05-02 23:25:34 +020052 Vp8EncoderConfig UpdateConfiguration(size_t stream_index) override;
Erik Språng8abd56c2018-10-01 18:47:03 +020053
Elad Alon979c4422019-04-17 12:53:08 +020054 Vp8FrameConfig NextFrameConfig(size_t stream_index,
55 uint32_t rtp_timestamp) override;
Elad Aloncde8ab22019-03-20 11:56:20 +010056
57 void OnEncodeDone(size_t stream_index,
58 uint32_t rtp_timestamp,
Elad Alonde3360e2019-03-06 21:14:54 +010059 size_t size_bytes,
60 bool is_keyframe,
61 int qp,
Elad Aloncde8ab22019-03-20 11:56:20 +010062 CodecSpecificInfo* info) override;
63
Elad Alon6796ec22019-04-15 10:07:50 +020064 void OnFrameDropped(size_t stream_index, uint32_t rtp_timestamp) override;
65
Elad Aloncde8ab22019-03-20 11:56:20 +010066 void OnPacketLossRateUpdate(float packet_loss_rate) override;
67
68 void OnRttUpdate(int64_t rtt_ms) override;
69
Elad Alon6c371ca2019-04-04 12:28:51 +020070 void OnLossNotification(
Elad Alon123ee9b2019-04-17 12:48:06 +020071 const VideoEncoder::LossNotification& loss_notification) override;
Elad Alon6c371ca2019-04-04 12:28:51 +020072
Elad Aloncde8ab22019-03-20 11:56:20 +010073 private:
74 std::vector<std::unique_ptr<Vp8FrameBufferController>> controllers_;
Erik Språng8abd56c2018-10-01 18:47:03 +020075};
76
77} // namespace webrtc
78
Erik Språng4529fbc2018-10-12 10:30:31 +020079#endif // API_VIDEO_CODECS_VP8_TEMPORAL_LAYERS_H_