Extract bitrate allocation of spatial/temporal layers out of codec impl.
This CL makes a number of intervowen changes: * Add BitrateAllocation struct, that contains a codec independent view of how the target bitrate is distributed over spatial and temporal layers. * Adds the BitrateAllocator interface, which takes a bitrate and frame rate and produces a BitrateAllocation. * A default (non layered) implementation is added, and SimulcastRateAllocator is extended to fully handle VP8 allocation. This includes capturing TemporalLayer instances created by the encoder. * ViEEncoder now owns both the bitrate allocator and the temporal layer factories for VP8. This allows allocation to happen fully outside of the encoder implementation. This refactoring will make it possible for ViEEncoder to signal the full picture of target bitrates to the RTCP module. BUG=webrtc:6301 Review-Url: https://codereview.webrtc.org/2434073003 Cr-Commit-Position: refs/heads/master@{#14998}
This commit is contained in:
@ -45,6 +45,9 @@ class MockVideoEncoder : public VideoEncoder {
|
||||
MOCK_METHOD0(Reset, int32_t());
|
||||
MOCK_METHOD2(SetChannelParameters, int32_t(uint32_t packetLoss, int64_t rtt));
|
||||
MOCK_METHOD2(SetRates, int32_t(uint32_t newBitRate, uint32_t frameRate));
|
||||
MOCK_METHOD2(SetRateAllocation,
|
||||
int32_t(const BitrateAllocation& newBitRate,
|
||||
uint32_t frameRate));
|
||||
MOCK_METHOD1(SetPeriodicKeyFrames, int32_t(bool enable));
|
||||
};
|
||||
|
||||
|
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INITIALIZER_H_
|
||||
#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INITIALIZER_H_
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "webrtc/video_send_stream.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
class TemporalLayersFactory;
|
||||
class VideoBitrateAllocator;
|
||||
class VideoCodec;
|
||||
class VideoEncoderConfig;
|
||||
|
||||
class VideoCodecInitializer {
|
||||
public:
|
||||
// Takes an EncoderSettings, a VideoEncoderConfig and the VideoStream
|
||||
// configuration and translated them into the old school VideoCodec type.
|
||||
// It also creates a VideoBitrateAllocator instance, suitable for the codec
|
||||
// type used. For instance, VP8 will create an allocator than can handle
|
||||
// simulcast and temporal layering.
|
||||
// GetBitrateAllocator is called implicitly from here, no need to call again.
|
||||
static bool SetupCodec(
|
||||
const VideoEncoderConfig& config,
|
||||
const VideoSendStream::Config::EncoderSettings settings,
|
||||
const std::vector<VideoStream>& streams,
|
||||
VideoCodec* codec,
|
||||
std::unique_ptr<VideoBitrateAllocator>* bitrate_allocator);
|
||||
|
||||
// Create a bitrate allocator for the specified codec. |tl_factory| is
|
||||
// optional, if it is populated, ownership of that instance will be
|
||||
// transferred to the VideoBitrateAllocator instance.
|
||||
static std::unique_ptr<VideoBitrateAllocator> CreateBitrateAllocator(
|
||||
const VideoCodec& codec,
|
||||
std::unique_ptr<TemporalLayersFactory> tl_factory);
|
||||
|
||||
private:
|
||||
static VideoCodec VideoEncoderConfigToVideoCodec(
|
||||
const VideoEncoderConfig& config,
|
||||
const std::vector<VideoStream>& streams,
|
||||
const std::string& payload_name,
|
||||
int payload_type);
|
||||
};
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
#endif // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INITIALIZER_H_
|
@ -35,6 +35,7 @@ class EncodedImageCallback;
|
||||
// removing the VCM and use VideoSender/VideoReceiver as a public interface
|
||||
// directly.
|
||||
class VCMQMSettingsCallback;
|
||||
class VideoBitrateAllocator;
|
||||
class VideoEncoder;
|
||||
class VideoDecoder;
|
||||
struct CodecSpecificInfo;
|
||||
|
Reference in New Issue
Block a user