Revert "Remove default encoder/decoders."

This reverts commit 78ae00eea29850bd3bd608287d8b057c88e91b42 due to perf
regressions. Reverting during investigation to figure out root causes.

BUG=chromium:491112
R=henrik.lundin@webrtc.org
TBR=mflodman@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#9283}
This commit is contained in:
Peter Boström 2015-05-26 11:44:05 +02:00
parent e14e5f4468
commit 5a3ebd761c
10 changed files with 106 additions and 18 deletions

View File

@ -169,7 +169,8 @@ Call::Call(const Call::Config& config)
// TODO(pbos): Remove base channel when CreateReceiveChannel no longer
// requires one.
CHECK(channel_group_->CreateSendChannel(base_channel_id_, 0, num_cpu_cores_));
CHECK(channel_group_->CreateSendChannel(base_channel_id_, 0, num_cpu_cores_,
true));
if (config.overuse_callback) {
overuse_observer_proxy_.reset(

View File

@ -138,7 +138,7 @@ VideoReceiveStream::VideoReceiveStream(int num_cpu_cores,
channel_id_(channel_id),
voe_sync_interface_(nullptr) {
CHECK(channel_group_->CreateReceiveChannel(channel_id_, 0, base_channel_id,
num_cpu_cores));
num_cpu_cores, true));
vie_channel_ = channel_group_->GetChannel(channel_id_);

View File

@ -119,7 +119,7 @@ VideoSendStream::VideoSendStream(
channel_id_(channel_id),
use_config_bitrate_(true),
stats_proxy_(Clock::GetRealTimeClock(), config) {
CHECK(channel_group->CreateSendChannel(channel_id_, 0, num_cpu_cores));
CHECK(channel_group->CreateSendChannel(channel_id_, 0, num_cpu_cores, true));
vie_channel_ = channel_group_->GetChannel(channel_id_);
vie_encoder_ = channel_group_->GetEncoder(channel_id_);

View File

@ -31,7 +31,7 @@ namespace webrtc {
class MockVieEncoder : public ViEEncoder {
public:
explicit MockVieEncoder(ProcessThread* process_thread, PacedSender* pacer)
: ViEEncoder(1, 1, config_, *process_thread, pacer, NULL, NULL) {}
: ViEEncoder(1, 1, config_, *process_thread, pacer, NULL, NULL, false) {}
~MockVieEncoder() {}
MOCK_METHOD1(OnReceivedIntraFrameRequest,

View File

@ -90,7 +90,8 @@ ViEChannel::ViEChannel(int32_t channel_id,
RtcpRttStats* rtt_stats,
PacedSender* paced_sender,
PacketRouter* packet_router,
bool sender)
bool sender,
bool disable_default_encoder)
: channel_id_(channel_id),
engine_id_(engine_id),
number_of_cores_(number_of_cores),
@ -123,6 +124,7 @@ ViEChannel::ViEChannel(int32_t channel_id,
wait_for_key_frame_(false),
mtu_(0),
sender_(sender),
disable_default_encoder_(disable_default_encoder),
nack_history_size_sender_(kSendSidePacketHistorySize),
max_nack_reordering_threshold_(kMaxPacketAgeToNack),
pre_render_callback_(NULL),
@ -167,6 +169,24 @@ int32_t ViEChannel::Init() {
module_process_thread_.RegisterModule(vcm_);
module_process_thread_.RegisterModule(&vie_sync_);
#ifdef VIDEOCODEC_VP8
if (!disable_default_encoder_) {
VideoCodec video_codec;
if (vcm_->Codec(kVideoCodecVP8, &video_codec) == VCM_OK) {
rtp_rtcp_->RegisterSendPayload(video_codec);
// TODO(holmer): Can we call SetReceiveCodec() here instead?
if (!vie_receiver_.RegisterPayload(video_codec)) {
return -1;
}
vcm_->RegisterReceiveCodec(&video_codec, number_of_cores_);
vcm_->RegisterSendCodec(&video_codec, number_of_cores_,
rtp_rtcp_->MaxDataPayloadLength());
} else {
assert(false);
}
}
#endif
return 0;
}

View File

@ -112,7 +112,8 @@ class ViEChannel : public VCMFrameTypeCallback,
RtcpRttStats* rtt_stats,
PacedSender* paced_sender,
PacketRouter* packet_router,
bool sender);
bool sender,
bool disable_default_encoder);
~ViEChannel();
int32_t Init();
@ -521,6 +522,8 @@ class ViEChannel : public VCMFrameTypeCallback,
// User set MTU, -1 if not set.
uint16_t mtu_;
const bool sender_;
// Used to skip default encoder in the new API.
const bool disable_default_encoder_;
int nack_history_size_sender_;
int max_nack_reordering_threshold_;

View File

@ -200,16 +200,17 @@ ChannelGroup::~ChannelGroup() {
bool ChannelGroup::CreateSendChannel(int channel_id,
int engine_id,
int number_of_cores) {
int number_of_cores,
bool disable_default_encoder) {
rtc::scoped_ptr<ViEEncoder> vie_encoder(new ViEEncoder(
channel_id, number_of_cores, *config_, *process_thread_, pacer_.get(),
bitrate_allocator_.get(), bitrate_controller_.get()));
bitrate_allocator_.get(), bitrate_controller_.get(), false));
if (!vie_encoder->Init()) {
return false;
}
ViEEncoder* encoder = vie_encoder.get();
if (!CreateChannel(channel_id, engine_id, number_of_cores,
vie_encoder.release(), true)) {
vie_encoder.release(), true, disable_default_encoder)) {
return false;
}
ViEChannel* channel = channel_map_[channel_id];
@ -231,16 +232,19 @@ bool ChannelGroup::CreateSendChannel(int channel_id,
bool ChannelGroup::CreateReceiveChannel(int channel_id,
int engine_id,
int base_channel_id,
int number_of_cores) {
int number_of_cores,
bool disable_default_encoder) {
ViEEncoder* encoder = GetEncoder(base_channel_id);
return CreateChannel(channel_id, engine_id, number_of_cores, encoder, false);
return CreateChannel(channel_id, engine_id, number_of_cores, encoder, false,
disable_default_encoder);
}
bool ChannelGroup::CreateChannel(int channel_id,
int engine_id,
int number_of_cores,
ViEEncoder* vie_encoder,
bool sender) {
bool sender,
bool disable_default_encoder) {
DCHECK(vie_encoder);
rtc::scoped_ptr<ViEChannel> channel(new ViEChannel(
@ -248,10 +252,19 @@ bool ChannelGroup::CreateChannel(int channel_id,
encoder_state_feedback_->GetRtcpIntraFrameObserver(),
bitrate_controller_->CreateRtcpBandwidthObserver(),
remote_bitrate_estimator_.get(), call_stats_->rtcp_rtt_stats(),
pacer_.get(), packet_router_.get(), sender));
pacer_.get(), packet_router_.get(), sender, disable_default_encoder));
if (channel->Init() != 0) {
return false;
}
if (!disable_default_encoder) {
VideoCodec encoder;
if (vie_encoder->GetEncoder(&encoder) != 0) {
return false;
}
if (sender && channel->SetSendCodec(encoder) != 0) {
return false;
}
}
// Register the channel to receive stats updates.
call_stats_->RegisterStatsObserver(channel->GetStatsObserver());

View File

@ -44,11 +44,13 @@ class ChannelGroup : public BitrateObserver {
~ChannelGroup();
bool CreateSendChannel(int channel_id,
int engine_id,
int number_of_cores);
int number_of_cores,
bool disable_default_encoder);
bool CreateReceiveChannel(int channel_id,
int engine_id,
int base_channel_id,
int number_of_cores);
int number_of_cores,
bool disable_default_encoder);
void DeleteChannel(int channel_id);
void AddChannel(int channel_id);
void RemoveChannel(int channel_id);
@ -84,7 +86,8 @@ class ChannelGroup : public BitrateObserver {
int engine_id,
int number_of_cores,
ViEEncoder* vie_encoder,
bool sender);
bool sender,
bool disable_default_encoder);
ViEChannel* PopChannel(int channel_id);
ViEEncoder* PopEncoder(int channel_id);

View File

@ -104,9 +104,11 @@ ViEEncoder::ViEEncoder(int32_t channel_id,
ProcessThread& module_process_thread,
PacedSender* pacer,
BitrateAllocator* bitrate_allocator,
BitrateController* bitrate_controller)
BitrateController* bitrate_controller,
bool disable_default_encoder)
: channel_id_(channel_id),
number_of_cores_(number_of_cores),
disable_default_encoder_(disable_default_encoder),
vpm_(VideoProcessingModule::Create(ViEModuleId(-1, channel_id))),
qm_callback_(new QMVideoSettingsCallback(vpm_.get())),
vcm_(VideoCodingModule::Create(Clock::GetRealTimeClock(),
@ -147,6 +149,26 @@ bool ViEEncoder::Init() {
// Enable/disable content analysis: off by default for now.
vpm_->EnableContentAnalysis(false);
if (!disable_default_encoder_) {
#ifdef VIDEOCODEC_VP8
VideoCodecType codec_type = webrtc::kVideoCodecVP8;
#else
VideoCodecType codec_type = webrtc::kVideoCodecI420;
#endif
VideoCodec video_codec;
if (vcm_->Codec(codec_type, &video_codec) != VCM_OK) {
return false;
}
{
CriticalSectionScoped cs(data_cs_.get());
send_padding_ = video_codec.numberOfSimulcastStreams > 1;
}
if (vcm_->RegisterSendCodec(&video_codec, number_of_cores_,
PayloadRouter::DefaultMaxPayloadLength()) !=
0) {
return false;
}
}
if (vcm_->RegisterTransportCallback(this) != 0) {
return false;
}
@ -260,6 +282,30 @@ int32_t ViEEncoder::DeRegisterExternalEncoder(uint8_t pl_type) {
return -1;
}
if (disable_default_encoder_)
return 0;
// If the external encoder is the current send codec, use vcm internal
// encoder.
if (current_send_codec.plType == pl_type) {
{
CriticalSectionScoped cs(data_cs_.get());
send_padding_ = current_send_codec.numberOfSimulcastStreams > 1;
}
// TODO(mflodman): Unfortunately the VideoCodec that VCM has cached a
// raw pointer to an |extra_options| that's long gone. Clearing it here is
// a hack to prevent the following code from crashing. This should be fixed
// for realz. https://code.google.com/p/chromium/issues/detail?id=348222
current_send_codec.extra_options = NULL;
size_t max_data_payload_length = send_payload_router_->MaxPayloadLength();
if (vcm_->RegisterSendCodec(&current_send_codec, number_of_cores_,
max_data_payload_length) != VCM_OK) {
LOG(LS_INFO) << "De-registered the currently used external encoder ("
<< static_cast<int>(pl_type) << ") and therefore tried to "
<< "register the corresponding internal encoder, but none "
<< "was supported.";
}
}
return 0;
}

View File

@ -78,7 +78,8 @@ class ViEEncoder
ProcessThread& module_process_thread,
PacedSender* pacer,
BitrateAllocator* bitrate_allocator,
BitrateController* bitrate_controller);
BitrateController* bitrate_controller,
bool disable_default_encoder);
~ViEEncoder();
bool Init();
@ -194,6 +195,7 @@ class ViEEncoder
const int channel_id_;
const uint32_t number_of_cores_;
const bool disable_default_encoder_;
const rtc::scoped_ptr<VideoProcessingModule> vpm_;
const rtc::scoped_ptr<QMVideoSettingsCallback> qm_callback_;