xref: /aosp_15_r20/external/webrtc/api/video_codecs/vp8_temporal_layers_factory.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2019 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 
11 #include "api/video_codecs/vp8_temporal_layers_factory.h"
12 
13 #include <algorithm>
14 #include <memory>
15 #include <utility>
16 #include <vector>
17 
18 #include "api/fec_controller_override.h"
19 #include "modules/video_coding/codecs/vp8/default_temporal_layers.h"
20 #include "modules/video_coding/codecs/vp8/screenshare_layers.h"
21 #include "modules/video_coding/utility/simulcast_utility.h"
22 #include "rtc_base/checks.h"
23 
24 namespace webrtc {
25 
Create(const VideoCodec & codec,const VideoEncoder::Settings & settings,FecControllerOverride * fec_controller_override)26 std::unique_ptr<Vp8FrameBufferController> Vp8TemporalLayersFactory::Create(
27     const VideoCodec& codec,
28     const VideoEncoder::Settings& settings,
29     FecControllerOverride* fec_controller_override) {
30   std::vector<std::unique_ptr<Vp8FrameBufferController>> controllers;
31   const int num_streams = SimulcastUtility::NumberOfSimulcastStreams(codec);
32   RTC_DCHECK_GE(num_streams, 1);
33   controllers.reserve(num_streams);
34 
35   for (int i = 0; i < num_streams; ++i) {
36     int num_temporal_layers =
37         SimulcastUtility::NumberOfTemporalLayers(codec, i);
38     RTC_DCHECK_GE(num_temporal_layers, 1);
39     if (SimulcastUtility::IsConferenceModeScreenshare(codec) && i == 0) {
40       // Legacy screenshare layers supports max 2 layers.
41       num_temporal_layers = std::max(2, num_temporal_layers);
42       controllers.push_back(
43           std::make_unique<ScreenshareLayers>(num_temporal_layers));
44     } else {
45       controllers.push_back(
46           std::make_unique<DefaultTemporalLayers>(num_temporal_layers));
47     }
48   }
49 
50   return std::make_unique<Vp8TemporalLayers>(std::move(controllers),
51                                              fec_controller_override);
52 }
53 
54 std::unique_ptr<Vp8FrameBufferControllerFactory>
Clone() const55 Vp8TemporalLayersFactory::Clone() const {
56   return std::make_unique<Vp8TemporalLayersFactory>();
57 }
58 
59 }  // namespace webrtc
60