/* * Copyright (c) 2016 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. */ #include "modules/video_coding/utility/default_video_bitrate_allocator.h" #include #include #include namespace webrtc { DefaultVideoBitrateAllocator::DefaultVideoBitrateAllocator( const VideoCodec& codec) : codec_(codec) {} DefaultVideoBitrateAllocator::~DefaultVideoBitrateAllocator() {} // TODO(http://crbug.com/webrtc/9671): Do not split bitrate between simulcast // streams, but allocate everything to the first stream. VideoBitrateAllocation DefaultVideoBitrateAllocator::GetAllocation( uint32_t total_bitrate_bps, uint32_t framerate) { VideoBitrateAllocation allocation; if (total_bitrate_bps == 0 || !codec_.active) return allocation; uint32_t allocated_bitrate_bps = total_bitrate_bps; allocated_bitrate_bps = std::max(allocated_bitrate_bps, codec_.minBitrate * 1000); if (codec_.maxBitrate > 0) { allocated_bitrate_bps = std::min(allocated_bitrate_bps, codec_.maxBitrate * 1000); } size_t num_simulcast_streams = std::max(1, codec_.numberOfSimulcastStreams); // The bitrate is split between all the streams in proportion of powers of 2 // e.g. 1:2, 1:2:4, etc. for (size_t i = 0; i < num_simulcast_streams; i++) { allocation.SetBitrate( i, 0, allocated_bitrate_bps * (1 << i) / ((1 << num_simulcast_streams) - 1)); } return allocation; } } // namespace webrtc