Remove getting max payload length from default module.
Moving functionality to get max payload length from default RTP module to the payload router. I'll make a follow up CL changing asserts to DCHECK in rtp_rtcp_impl.cc. BUG=769 TEST=New unittest and existing sender mtu test R=stefan@webrtc.org Review URL: https://webrtc-codereview.appspot.com/36119004 Cr-Commit-Position: refs/heads/master@{#8345} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8345 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
@@ -555,31 +555,8 @@ uint16_t ModuleRtpRtcpImpl::MaxPayloadLength() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint16_t ModuleRtpRtcpImpl::MaxDataPayloadLength() const {
|
uint16_t ModuleRtpRtcpImpl::MaxDataPayloadLength() const {
|
||||||
// Assuming IP/UDP.
|
assert(!IsDefaultModule());
|
||||||
uint16_t min_data_payload_length = IP_PACKET_SIZE - 28;
|
return rtp_sender_.MaxDataPayloadLength();
|
||||||
|
|
||||||
if (IsDefaultModule()) {
|
|
||||||
// For default we need to update all child modules too.
|
|
||||||
CriticalSectionScoped lock(critical_section_module_ptrs_.get());
|
|
||||||
std::vector<ModuleRtpRtcpImpl*>::const_iterator it = child_modules_.begin();
|
|
||||||
while (it != child_modules_.end()) {
|
|
||||||
RtpRtcp* module = *it;
|
|
||||||
if (module) {
|
|
||||||
uint16_t data_payload_length =
|
|
||||||
module->MaxDataPayloadLength();
|
|
||||||
if (data_payload_length < min_data_payload_length) {
|
|
||||||
min_data_payload_length = data_payload_length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t data_payload_length = rtp_sender_.MaxDataPayloadLength();
|
|
||||||
if (data_payload_length < min_data_payload_length) {
|
|
||||||
min_data_payload_length = data_payload_length;
|
|
||||||
}
|
|
||||||
return min_data_payload_length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ModuleRtpRtcpImpl::SetTransportOverhead(
|
int32_t ModuleRtpRtcpImpl::SetTransportOverhead(
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
#include "webrtc/base/checks.h"
|
#include "webrtc/base/checks.h"
|
||||||
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
|
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
|
||||||
|
#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
|
||||||
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
|
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
@@ -22,6 +23,11 @@ PayloadRouter::PayloadRouter()
|
|||||||
|
|
||||||
PayloadRouter::~PayloadRouter() {}
|
PayloadRouter::~PayloadRouter() {}
|
||||||
|
|
||||||
|
size_t PayloadRouter::DefaultMaxPayloadLength() {
|
||||||
|
const size_t kIpUdpSrtpLength = 44;
|
||||||
|
return IP_PACKET_SIZE - kIpUdpSrtpLength;
|
||||||
|
}
|
||||||
|
|
||||||
void PayloadRouter::SetSendingRtpModules(
|
void PayloadRouter::SetSendingRtpModules(
|
||||||
const std::list<RtpRtcp*>& rtp_modules) {
|
const std::list<RtpRtcp*>& rtp_modules) {
|
||||||
CriticalSectionScoped cs(crit_.get());
|
CriticalSectionScoped cs(crit_.get());
|
||||||
@@ -47,7 +53,7 @@ bool PayloadRouter::RoutePayload(FrameType frame_type,
|
|||||||
uint32_t time_stamp,
|
uint32_t time_stamp,
|
||||||
int64_t capture_time_ms,
|
int64_t capture_time_ms,
|
||||||
const uint8_t* payload_data,
|
const uint8_t* payload_data,
|
||||||
size_t payload_size,
|
size_t payload_length,
|
||||||
const RTPFragmentationHeader* fragmentation,
|
const RTPFragmentationHeader* fragmentation,
|
||||||
const RTPVideoHeader* rtp_video_hdr) {
|
const RTPVideoHeader* rtp_video_hdr) {
|
||||||
CriticalSectionScoped cs(crit_.get());
|
CriticalSectionScoped cs(crit_.get());
|
||||||
@@ -62,7 +68,18 @@ bool PayloadRouter::RoutePayload(FrameType frame_type,
|
|||||||
stream_idx = rtp_video_hdr->simulcastIdx;
|
stream_idx = rtp_video_hdr->simulcastIdx;
|
||||||
return rtp_modules_[stream_idx]->SendOutgoingData(
|
return rtp_modules_[stream_idx]->SendOutgoingData(
|
||||||
frame_type, payload_type, time_stamp, capture_time_ms, payload_data,
|
frame_type, payload_type, time_stamp, capture_time_ms, payload_data,
|
||||||
payload_size, fragmentation, rtp_video_hdr) == 0 ? true : false;
|
payload_length, fragmentation, rtp_video_hdr) == 0 ? true : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t PayloadRouter::MaxPayloadLength() const {
|
||||||
|
size_t min_payload_length = DefaultMaxPayloadLength();
|
||||||
|
CriticalSectionScoped cs(crit_.get());
|
||||||
|
for (auto* rtp_module : rtp_modules_) {
|
||||||
|
size_t module_payload_length = rtp_module->MaxDataPayloadLength();
|
||||||
|
if (module_payload_length < min_payload_length)
|
||||||
|
min_payload_length = module_payload_length;
|
||||||
|
}
|
||||||
|
return min_payload_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ class PayloadRouter {
|
|||||||
PayloadRouter();
|
PayloadRouter();
|
||||||
~PayloadRouter();
|
~PayloadRouter();
|
||||||
|
|
||||||
|
static size_t DefaultMaxPayloadLength();
|
||||||
|
|
||||||
// Rtp modules are assumed to be sorted in simulcast index order.
|
// Rtp modules are assumed to be sorted in simulcast index order.
|
||||||
void SetSendingRtpModules(const std::list<RtpRtcp*>& rtp_modules);
|
void SetSendingRtpModules(const std::list<RtpRtcp*>& rtp_modules);
|
||||||
|
|
||||||
@@ -52,6 +54,10 @@ class PayloadRouter {
|
|||||||
const RTPFragmentationHeader* fragmentation,
|
const RTPFragmentationHeader* fragmentation,
|
||||||
const RTPVideoHeader* rtp_video_hdr);
|
const RTPVideoHeader* rtp_video_hdr);
|
||||||
|
|
||||||
|
// Returns the maximum allowed data payload length, given the configured MTU
|
||||||
|
// and RTP headers.
|
||||||
|
size_t MaxPayloadLength() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
scoped_ptr<CriticalSectionWrapper> crit_;
|
scoped_ptr<CriticalSectionWrapper> crit_;
|
||||||
|
|
||||||
|
|||||||
@@ -127,5 +127,38 @@ TEST_F(PayloadRouterTest, SendSimulcast) {
|
|||||||
&payload_2, 1, NULL, &rtp_hdr_2));
|
&payload_2, 1, NULL, &rtp_hdr_2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(PayloadRouterTest, MaxPayloadLength) {
|
||||||
|
// Without any limitations from the modules, verify we get the max payload
|
||||||
|
// length for IP/UDP/SRTP with a MTU of 150 bytes.
|
||||||
|
const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4;
|
||||||
|
EXPECT_EQ(kDefaultMaxLength, payload_router_->DefaultMaxPayloadLength());
|
||||||
|
EXPECT_EQ(kDefaultMaxLength, payload_router_->MaxPayloadLength());
|
||||||
|
|
||||||
|
MockRtpRtcp rtp_1;
|
||||||
|
MockRtpRtcp rtp_2;
|
||||||
|
std::list<RtpRtcp*> modules;
|
||||||
|
modules.push_back(&rtp_1);
|
||||||
|
modules.push_back(&rtp_2);
|
||||||
|
payload_router_->SetSendingRtpModules(modules);
|
||||||
|
|
||||||
|
// Modules return a higher length than the default value.
|
||||||
|
EXPECT_CALL(rtp_1, MaxDataPayloadLength())
|
||||||
|
.Times(1)
|
||||||
|
.WillOnce(Return(kDefaultMaxLength + 10));
|
||||||
|
EXPECT_CALL(rtp_2, MaxDataPayloadLength())
|
||||||
|
.Times(1)
|
||||||
|
.WillOnce(Return(kDefaultMaxLength + 10));
|
||||||
|
EXPECT_EQ(kDefaultMaxLength, payload_router_->MaxPayloadLength());
|
||||||
|
|
||||||
|
// The modules return a value lower than default.
|
||||||
|
const size_t kTestMinPayloadLength = 1001;
|
||||||
|
EXPECT_CALL(rtp_1, MaxDataPayloadLength())
|
||||||
|
.Times(1)
|
||||||
|
.WillOnce(Return(kTestMinPayloadLength + 10));
|
||||||
|
EXPECT_CALL(rtp_2, MaxDataPayloadLength())
|
||||||
|
.Times(1)
|
||||||
|
.WillOnce(Return(kTestMinPayloadLength));
|
||||||
|
EXPECT_EQ(kTestMinPayloadLength, payload_router_->MaxPayloadLength());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ bool ViEEncoder::Init() {
|
|||||||
send_padding_ = video_codec.numberOfSimulcastStreams > 1;
|
send_padding_ = video_codec.numberOfSimulcastStreams > 1;
|
||||||
}
|
}
|
||||||
if (vcm_.RegisterSendCodec(&video_codec, number_of_cores_,
|
if (vcm_.RegisterSendCodec(&video_codec, number_of_cores_,
|
||||||
default_rtp_rtcp_->MaxDataPayloadLength()) != 0) {
|
PayloadRouter::DefaultMaxPayloadLength()) != 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (default_rtp_rtcp_->RegisterSendPayload(video_codec) != 0) {
|
if (default_rtp_rtcp_->RegisterSendPayload(video_codec) != 0) {
|
||||||
@@ -324,6 +324,7 @@ int32_t ViEEncoder::RegisterExternalEncoder(webrtc::VideoEncoder* encoder,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32_t ViEEncoder::DeRegisterExternalEncoder(uint8_t pl_type) {
|
int32_t ViEEncoder::DeRegisterExternalEncoder(uint8_t pl_type) {
|
||||||
|
DCHECK(send_payload_router_ != NULL);
|
||||||
webrtc::VideoCodec current_send_codec;
|
webrtc::VideoCodec current_send_codec;
|
||||||
if (vcm_.SendCodec(¤t_send_codec) == VCM_OK) {
|
if (vcm_.SendCodec(¤t_send_codec) == VCM_OK) {
|
||||||
uint32_t current_bitrate_bps = 0;
|
uint32_t current_bitrate_bps = 0;
|
||||||
@@ -340,8 +341,6 @@ int32_t ViEEncoder::DeRegisterExternalEncoder(uint8_t pl_type) {
|
|||||||
// If the external encoder is the current send codec, use vcm internal
|
// If the external encoder is the current send codec, use vcm internal
|
||||||
// encoder.
|
// encoder.
|
||||||
if (current_send_codec.plType == pl_type) {
|
if (current_send_codec.plType == pl_type) {
|
||||||
uint16_t max_data_payload_length =
|
|
||||||
default_rtp_rtcp_->MaxDataPayloadLength();
|
|
||||||
{
|
{
|
||||||
CriticalSectionScoped cs(data_cs_.get());
|
CriticalSectionScoped cs(data_cs_.get());
|
||||||
send_padding_ = current_send_codec.numberOfSimulcastStreams > 1;
|
send_padding_ = current_send_codec.numberOfSimulcastStreams > 1;
|
||||||
@@ -351,6 +350,7 @@ int32_t ViEEncoder::DeRegisterExternalEncoder(uint8_t pl_type) {
|
|||||||
// a hack to prevent the following code from crashing. This should be fixed
|
// 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
|
// for realz. https://code.google.com/p/chromium/issues/detail?id=348222
|
||||||
current_send_codec.extra_options = NULL;
|
current_send_codec.extra_options = NULL;
|
||||||
|
size_t max_data_payload_length = send_payload_router_->MaxPayloadLength();
|
||||||
if (vcm_.RegisterSendCodec(¤t_send_codec, number_of_cores_,
|
if (vcm_.RegisterSendCodec(¤t_send_codec, number_of_cores_,
|
||||||
max_data_payload_length) != VCM_OK) {
|
max_data_payload_length) != VCM_OK) {
|
||||||
LOG(LS_INFO) << "De-registered the currently used external encoder ("
|
LOG(LS_INFO) << "De-registered the currently used external encoder ("
|
||||||
@@ -363,6 +363,7 @@ int32_t ViEEncoder::DeRegisterExternalEncoder(uint8_t pl_type) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32_t ViEEncoder::SetEncoder(const webrtc::VideoCodec& video_codec) {
|
int32_t ViEEncoder::SetEncoder(const webrtc::VideoCodec& video_codec) {
|
||||||
|
DCHECK(send_payload_router_ != NULL);
|
||||||
// Setting target width and height for VPM.
|
// Setting target width and height for VPM.
|
||||||
if (vpm_.SetTargetResolution(video_codec.width, video_codec.height,
|
if (vpm_.SetTargetResolution(video_codec.width, video_codec.height,
|
||||||
video_codec.maxFramerate) != VPM_OK) {
|
video_codec.maxFramerate) != VPM_OK) {
|
||||||
@@ -379,13 +380,11 @@ int32_t ViEEncoder::SetEncoder(const webrtc::VideoCodec& video_codec) {
|
|||||||
video_codec.numberOfSimulcastStreams);
|
video_codec.numberOfSimulcastStreams);
|
||||||
default_rtp_rtcp_->SetTargetSendBitrate(stream_bitrates);
|
default_rtp_rtcp_->SetTargetSendBitrate(stream_bitrates);
|
||||||
|
|
||||||
uint16_t max_data_payload_length =
|
|
||||||
default_rtp_rtcp_->MaxDataPayloadLength();
|
|
||||||
|
|
||||||
{
|
{
|
||||||
CriticalSectionScoped cs(data_cs_.get());
|
CriticalSectionScoped cs(data_cs_.get());
|
||||||
send_padding_ = video_codec.numberOfSimulcastStreams > 1;
|
send_padding_ = video_codec.numberOfSimulcastStreams > 1;
|
||||||
}
|
}
|
||||||
|
size_t max_data_payload_length = send_payload_router_->MaxPayloadLength();
|
||||||
if (vcm_.RegisterSendCodec(&video_codec, number_of_cores_,
|
if (vcm_.RegisterSendCodec(&video_codec, number_of_cores_,
|
||||||
max_data_payload_length) != VCM_OK) {
|
max_data_payload_length) != VCM_OK) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -660,6 +659,7 @@ int ViEEncoder::CodecTargetBitrate(uint32_t* bitrate) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int32_t ViEEncoder::UpdateProtectionMethod(bool enable_nack) {
|
int32_t ViEEncoder::UpdateProtectionMethod(bool enable_nack) {
|
||||||
|
DCHECK(send_payload_router_ != NULL);
|
||||||
bool fec_enabled = false;
|
bool fec_enabled = false;
|
||||||
uint8_t dummy_ptype_red = 0;
|
uint8_t dummy_ptype_red = 0;
|
||||||
uint8_t dummy_ptypeFEC = 0;
|
uint8_t dummy_ptypeFEC = 0;
|
||||||
@@ -693,7 +693,6 @@ int32_t ViEEncoder::UpdateProtectionMethod(bool enable_nack) {
|
|||||||
// The send codec must be registered to set correct MTU.
|
// The send codec must be registered to set correct MTU.
|
||||||
webrtc::VideoCodec codec;
|
webrtc::VideoCodec codec;
|
||||||
if (vcm_.SendCodec(&codec) == 0) {
|
if (vcm_.SendCodec(&codec) == 0) {
|
||||||
uint16_t max_pay_load = default_rtp_rtcp_->MaxDataPayloadLength();
|
|
||||||
uint32_t current_bitrate_bps = 0;
|
uint32_t current_bitrate_bps = 0;
|
||||||
if (vcm_.Bitrate(¤t_bitrate_bps) != 0) {
|
if (vcm_.Bitrate(¤t_bitrate_bps) != 0) {
|
||||||
LOG_F(LS_WARNING) <<
|
LOG_F(LS_WARNING) <<
|
||||||
@@ -701,7 +700,9 @@ int32_t ViEEncoder::UpdateProtectionMethod(bool enable_nack) {
|
|||||||
}
|
}
|
||||||
// Convert to start bitrate in kbps.
|
// Convert to start bitrate in kbps.
|
||||||
codec.startBitrate = (current_bitrate_bps + 500) / 1000;
|
codec.startBitrate = (current_bitrate_bps + 500) / 1000;
|
||||||
if (vcm_.RegisterSendCodec(&codec, number_of_cores_, max_pay_load) != 0) {
|
size_t max_payload_length = send_payload_router_->MaxPayloadLength();
|
||||||
|
if (vcm_.RegisterSendCodec(&codec, number_of_cores_,
|
||||||
|
max_payload_length) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user