blob: 2ffe6eacdf70ba06a6d395e924639de07601d454 [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 Alon45befc52019-07-02 11:20:09 +020035 Vp8TemporalLayers(
36 std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers,
37 FecControllerOverride* fec_controller_override);
Elad Alonde3360e2019-03-06 21:14:54 +010038 ~Vp8TemporalLayers() override = default;
Erik Språng8abd56c2018-10-01 18:47:03 +020039
Elad Alonfb087812019-05-02 23:25:34 +020040 void SetQpLimits(size_t stream_index, int min_qp, int max_qp) override;
41
Elad Aloncde8ab22019-03-20 11:56:20 +010042 size_t StreamCount() const override;
Erik Språng8abd56c2018-10-01 18:47:03 +020043
Elad Aloncde8ab22019-03-20 11:56:20 +010044 bool SupportsEncoderFrameDropping(size_t stream_index) const override;
Erik Språng8abd56c2018-10-01 18:47:03 +020045
Elad Aloncde8ab22019-03-20 11:56:20 +010046 void OnRatesUpdated(size_t stream_index,
47 const std::vector<uint32_t>& bitrates_bps,
48 int framerate_fps) override;
Erik Språng8abd56c2018-10-01 18:47:03 +020049
Elad Alonfb087812019-05-02 23:25:34 +020050 Vp8EncoderConfig UpdateConfiguration(size_t stream_index) override;
Erik Språng8abd56c2018-10-01 18:47:03 +020051
Elad Alon979c4422019-04-17 12:53:08 +020052 Vp8FrameConfig NextFrameConfig(size_t stream_index,
53 uint32_t rtp_timestamp) override;
Elad Aloncde8ab22019-03-20 11:56:20 +010054
55 void OnEncodeDone(size_t stream_index,
56 uint32_t rtp_timestamp,
Elad Alonde3360e2019-03-06 21:14:54 +010057 size_t size_bytes,
58 bool is_keyframe,
59 int qp,
Elad Aloncde8ab22019-03-20 11:56:20 +010060 CodecSpecificInfo* info) override;
61
Elad Alon6796ec22019-04-15 10:07:50 +020062 void OnFrameDropped(size_t stream_index, uint32_t rtp_timestamp) override;
63
Elad Aloncde8ab22019-03-20 11:56:20 +010064 void OnPacketLossRateUpdate(float packet_loss_rate) override;
65
66 void OnRttUpdate(int64_t rtt_ms) override;
67
Elad Alon6c371ca2019-04-04 12:28:51 +020068 void OnLossNotification(
Elad Alon123ee9b2019-04-17 12:48:06 +020069 const VideoEncoder::LossNotification& loss_notification) override;
Elad Alon6c371ca2019-04-04 12:28:51 +020070
Elad Aloncde8ab22019-03-20 11:56:20 +010071 private:
72 std::vector<std::unique_ptr<Vp8FrameBufferController>> controllers_;
Erik Språng8abd56c2018-10-01 18:47:03 +020073};
74
75} // namespace webrtc
76
Erik Språng4529fbc2018-10-12 10:30:31 +020077#endif // API_VIDEO_CODECS_VP8_TEMPORAL_LAYERS_H_