Wire up target_media_bitrate in VideoSendStream.

Also wires up target_enc_bitrate in WebRtcVideoEngine2.

BUG=1667,1788
R=mflodman@webrtc.org, stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/42479004

Cr-Commit-Position: refs/heads/master@{#8515}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8515 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
pbos@webrtc.org
2015-02-26 13:15:22 +00:00
parent 9dd0ebc379
commit 891d48393e
24 changed files with 172 additions and 54 deletions

View File

@ -93,7 +93,8 @@ VCMExtDecoderMapItem::VCMExtDecoderMapItem(
internal_render_timing(internal_render_timing) {
}
VCMCodecDataBase::VCMCodecDataBase()
VCMCodecDataBase::VCMCodecDataBase(
VideoEncoderRateObserver* encoder_rate_observer)
: number_of_cores_(0),
max_payload_size_(kDefaultPayloadSize),
periodic_key_frames_(false),
@ -104,11 +105,13 @@ VCMCodecDataBase::VCMCodecDataBase()
external_payload_type_(0),
external_encoder_(NULL),
internal_source_(false),
encoder_rate_observer_(encoder_rate_observer),
ptr_encoder_(NULL),
ptr_decoder_(NULL),
current_dec_is_external_(false),
dec_map_(),
dec_external_map_() {}
dec_external_map_() {
}
VCMCodecDataBase::~VCMCodecDataBase() {
ResetSender();
@ -295,7 +298,8 @@ bool VCMCodecDataBase::SetSendCodec(
DeleteEncoder();
if (send_codec->plType == external_payload_type_) {
// External encoder.
ptr_encoder_ = new VCMGenericEncoder(*external_encoder_, internal_source_);
ptr_encoder_ = new VCMGenericEncoder(
external_encoder_, encoder_rate_observer_, internal_source_);
current_enc_is_external_ = true;
} else {
ptr_encoder_ = CreateEncoder(send_codec->codecType);
@ -679,15 +683,18 @@ VCMGenericEncoder* VCMCodecDataBase::CreateEncoder(
switch (type) {
#ifdef VIDEOCODEC_VP8
case kVideoCodecVP8:
return new VCMGenericEncoder(*(VP8Encoder::Create()));
return new VCMGenericEncoder(VP8Encoder::Create(), encoder_rate_observer_,
false);
#endif
#ifdef VIDEOCODEC_VP9
case kVideoCodecVP9:
return new VCMGenericEncoder(*(VP9Encoder::Create()));
return new VCMGenericEncoder(VP9Encoder::Create(), encoder_rate_observer_,
false);
#endif
#ifdef VIDEOCODEC_I420
case kVideoCodecI420:
return new VCMGenericEncoder(*(new I420Encoder));
return new VCMGenericEncoder(new I420Encoder(), encoder_rate_observer_,
false);
#endif
default:
LOG(LS_WARNING) << "No internal encoder of this type exists.";
@ -698,9 +705,8 @@ VCMGenericEncoder* VCMCodecDataBase::CreateEncoder(
void VCMCodecDataBase::DeleteEncoder() {
if (ptr_encoder_) {
ptr_encoder_->Release();
if (!current_enc_is_external_) {
delete &ptr_encoder_->_encoder;
}
if (!current_enc_is_external_)
delete ptr_encoder_->encoder_;
delete ptr_encoder_;
ptr_encoder_ = NULL;
}

View File

@ -46,7 +46,7 @@ struct VCMExtDecoderMapItem {
class VCMCodecDataBase {
public:
VCMCodecDataBase();
explicit VCMCodecDataBase(VideoEncoderRateObserver* encoder_rate_observer);
~VCMCodecDataBase();
// Sender Side
@ -180,6 +180,7 @@ class VCMCodecDataBase {
uint8_t external_payload_type_;
VideoEncoder* external_encoder_;
bool internal_source_;
VideoEncoderRateObserver* const encoder_rate_observer_;
VCMGenericEncoder* ptr_encoder_;
VCMGenericDecoder* ptr_decoder_;
bool current_dec_is_external_;

View File

@ -55,18 +55,18 @@ void CopyCodecSpecific(const CodecSpecificInfo* info, RTPVideoHeader** rtp) {
//#define DEBUG_ENCODER_BIT_STREAM
VCMGenericEncoder::VCMGenericEncoder(VideoEncoder& encoder, bool internalSource /*= false*/)
:
_encoder(encoder),
_codecType(kVideoCodecUnknown),
_VCMencodedFrameCallback(NULL),
_bitRate(0),
_frameRate(0),
_internalSource(internalSource)
{
VCMGenericEncoder::VCMGenericEncoder(VideoEncoder* encoder,
VideoEncoderRateObserver* rate_observer,
bool internalSource)
: encoder_(encoder),
rate_observer_(rate_observer),
_codecType(kVideoCodecUnknown),
_VCMencodedFrameCallback(NULL),
_bitRate(0),
_frameRate(0),
_internalSource(internalSource) {
}
VCMGenericEncoder::~VCMGenericEncoder()
{
}
@ -76,7 +76,7 @@ int32_t VCMGenericEncoder::Release()
_bitRate = 0;
_frameRate = 0;
_VCMencodedFrameCallback = NULL;
return _encoder.Release();
return encoder_->Release();
}
int32_t
@ -87,7 +87,7 @@ VCMGenericEncoder::InitEncode(const VideoCodec* settings,
_bitRate = settings->startBitrate * 1000;
_frameRate = settings->maxFramerate;
_codecType = settings->codecType;
if (_encoder.InitEncode(settings, numberOfCores, maxPayloadSize) != 0) {
if (encoder_->InitEncode(settings, numberOfCores, maxPayloadSize) != 0) {
LOG(LS_ERROR) << "Failed to initialize the encoder associated with "
"payload name: " << settings->plName;
return -1;
@ -102,33 +102,35 @@ VCMGenericEncoder::Encode(const I420VideoFrame& inputFrame,
std::vector<VideoFrameType> video_frame_types(frameTypes.size(),
kDeltaFrame);
VCMEncodedFrame::ConvertFrameTypes(frameTypes, &video_frame_types);
return _encoder.Encode(inputFrame, codecSpecificInfo, &video_frame_types);
return encoder_->Encode(inputFrame, codecSpecificInfo, &video_frame_types);
}
int32_t
VCMGenericEncoder::SetChannelParameters(int32_t packetLoss, int64_t rtt)
{
return _encoder.SetChannelParameters(packetLoss, rtt);
return encoder_->SetChannelParameters(packetLoss, rtt);
}
int32_t
VCMGenericEncoder::SetRates(uint32_t newBitRate, uint32_t frameRate)
{
uint32_t target_bitrate_kbps = (newBitRate + 500) / 1000;
int32_t ret = _encoder.SetRates(target_bitrate_kbps, frameRate);
int32_t ret = encoder_->SetRates(target_bitrate_kbps, frameRate);
if (ret < 0)
{
return ret;
}
_bitRate = newBitRate;
_frameRate = frameRate;
if (rate_observer_ != nullptr)
rate_observer_->OnSetRates(newBitRate, frameRate);
return VCM_OK;
}
int32_t
VCMGenericEncoder::CodecConfigParameters(uint8_t* buffer, int32_t size)
{
int32_t ret = _encoder.CodecConfigParameters(buffer, size);
int32_t ret = encoder_->CodecConfigParameters(buffer, size);
if (ret < 0)
{
return ret;
@ -149,7 +151,7 @@ uint32_t VCMGenericEncoder::FrameRate() const
int32_t
VCMGenericEncoder::SetPeriodicKeyFrames(bool enable)
{
return _encoder.SetPeriodicKeyFrames(enable);
return encoder_->SetPeriodicKeyFrames(enable);
}
int32_t VCMGenericEncoder::RequestFrame(
@ -158,7 +160,7 @@ int32_t VCMGenericEncoder::RequestFrame(
std::vector<VideoFrameType> video_frame_types(frame_types.size(),
kDeltaFrame);
VCMEncodedFrame::ConvertFrameTypes(frame_types, &video_frame_types);
return _encoder.Encode(image, NULL, &video_frame_types);
return encoder_->Encode(image, NULL, &video_frame_types);
}
int32_t
@ -166,7 +168,7 @@ VCMGenericEncoder::RegisterEncodeCallback(VCMEncodedFrameCallback* VCMencodedFra
{
_VCMencodedFrameCallback = VCMencodedFrameCallback;
_VCMencodedFrameCallback->SetInternalSource(_internalSource);
return _encoder.RegisterEncodeCompleteCallback(_VCMencodedFrameCallback);
return encoder_->RegisterEncodeCompleteCallback(_VCMencodedFrameCallback);
}
bool

View File

@ -12,6 +12,7 @@
#define WEBRTC_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
#include "webrtc/modules/video_coding/codecs/interface/video_codec_interface.h"
#include "webrtc/modules/video_coding/main/interface/video_coding_defines.h"
#include <stdio.h>
@ -73,7 +74,9 @@ class VCMGenericEncoder
{
friend class VCMCodecDataBase;
public:
VCMGenericEncoder(VideoEncoder& encoder, bool internalSource = false);
VCMGenericEncoder(VideoEncoder* encoder,
VideoEncoderRateObserver* rate_observer,
bool internalSource);
~VCMGenericEncoder();
/**
* Free encoder memory
@ -127,7 +130,8 @@ public:
bool InternalSource() const;
private:
VideoEncoder& _encoder;
VideoEncoder* const encoder_;
VideoEncoderRateObserver* const rate_observer_;
VideoCodecType _codecType;
VCMEncodedFrameCallback* _VCMencodedFrameCallback;
uint32_t _bitRate;

View File

@ -73,9 +73,12 @@ class VideoCodingModuleImpl : public VideoCodingModule {
public:
VideoCodingModuleImpl(Clock* clock,
EventFactory* event_factory,
bool owns_event_factory)
bool owns_event_factory,
VideoEncoderRateObserver* encoder_rate_observer)
: VideoCodingModule(),
sender_(new vcm::VideoSender(clock, &post_encode_callback_)),
sender_(new vcm::VideoSender(clock,
&post_encode_callback_,
encoder_rate_observer)),
receiver_(new vcm::VideoReceiver(clock, event_factory)),
own_event_factory_(owns_event_factory ? event_factory : NULL) {}
@ -383,16 +386,19 @@ int32_t VideoCodingModule::Codec(VideoCodecType codecType, VideoCodec* codec) {
return VCMCodecDataBase::Codec(codecType, codec) ? 0 : -1;
}
VideoCodingModule* VideoCodingModule::Create() {
return new VideoCodingModuleImpl(
Clock::GetRealTimeClock(), new EventFactoryImpl, true);
VideoCodingModule* VideoCodingModule::Create(
VideoEncoderRateObserver* encoder_rate_observer) {
return new VideoCodingModuleImpl(Clock::GetRealTimeClock(),
new EventFactoryImpl, true,
encoder_rate_observer);
}
VideoCodingModule* VideoCodingModule::Create(Clock* clock,
EventFactory* event_factory) {
VideoCodingModule* VideoCodingModule::Create(
Clock* clock,
EventFactory* event_factory) {
assert(clock);
assert(event_factory);
return new VideoCodingModuleImpl(clock, event_factory, false);
return new VideoCodingModuleImpl(clock, event_factory, false, nullptr);
}
void VideoCodingModule::Destroy(VideoCodingModule* module) {

View File

@ -56,7 +56,9 @@ class VideoSender {
public:
typedef VideoCodingModule::SenderNackMode SenderNackMode;
VideoSender(Clock* clock, EncodedImageCallback* post_encode_callback);
VideoSender(Clock* clock,
EncodedImageCallback* post_encode_callback,
VideoEncoderRateObserver* encoder_rate_observer);
~VideoSender();

View File

@ -46,7 +46,7 @@ VideoReceiver::VideoReceiver(Clock* clock, EventFactory* event_factory)
_scheduleKeyRequest(false),
max_nack_list_size_(0),
pre_decode_image_callback_(NULL),
_codecDataBase(),
_codecDataBase(NULL),
_receiveStatsTimer(1000, clock_),
_retransmissionTimer(10, clock_),
_keyRequestTimer(500, clock_) {

View File

@ -60,7 +60,8 @@ class DebugRecorder {
};
VideoSender::VideoSender(Clock* clock,
EncodedImageCallback* post_encode_callback)
EncodedImageCallback* post_encode_callback,
VideoEncoderRateObserver* encoder_rate_observer)
: clock_(clock),
recorder_(new DebugRecorder()),
process_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
@ -70,7 +71,7 @@ VideoSender::VideoSender(Clock* clock,
_nextFrameTypes(1, kVideoFrameDelta),
_mediaOpt(clock_),
_sendStatsCallback(NULL),
_codecDataBase(),
_codecDataBase(encoder_rate_observer),
frame_dropper_enabled_(true),
_sendStatsTimer(1000, clock_),
current_codec_(),

View File

@ -172,7 +172,7 @@ class TestVideoSender : public ::testing::Test {
TestVideoSender() : clock_(1000), packetization_callback_(&clock_) {}
virtual void SetUp() OVERRIDE {
sender_.reset(new VideoSender(&clock_, &post_encode_callback_));
sender_.reset(new VideoSender(&clock_, &post_encode_callback_, nullptr));
EXPECT_EQ(0, sender_->InitializeSender());
EXPECT_EQ(0, sender_->RegisterTransportCallback(&packetization_callback_));
}