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)26std::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() const55Vp8TemporalLayersFactory::Clone() const { 56 return std::make_unique<Vp8TemporalLayersFactory>(); 57 } 58 59 } // namespace webrtc 60