Drop early packets when not sending in TransportAdapter.

Particularly, suppress periodic RTCP packets before
VideoSendStream.StartSending() or VideoReceiveStream.StartReceiving() have been called, respectively.

RTCP packets are sent periodically, by the Process thread, for every ViE channel even those not sending.

BUG=
R=pbos@webrtc.org, stefan@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5438 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
sprang@webrtc.org 2014-01-27 13:03:02 +00:00
parent 2397a17c6b
commit d9b9560ee5
7 changed files with 38 additions and 5 deletions

View File

@ -230,6 +230,7 @@ TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSync) {
audio_observer.SetReceivers(&voe_packet_receiver, &voe_packet_receiver); audio_observer.SetReceivers(&voe_packet_receiver, &voe_packet_receiver);
internal::TransportAdapter transport_adapter(audio_observer.SendTransport()); internal::TransportAdapter transport_adapter(audio_observer.SendTransport());
transport_adapter.Enable();
EXPECT_EQ(0, EXPECT_EQ(0,
voe_network->RegisterExternalTransport(channel, transport_adapter)); voe_network->RegisterExternalTransport(channel, transport_adapter));

View File

@ -71,6 +71,7 @@ class StreamObserver : public newapi::Transport, public RemoteBitrateObserver {
// be able to produce an RTCP with REMB. // be able to produce an RTCP with REMB.
RtpRtcp::Configuration config; RtpRtcp::Configuration config;
config.receive_statistics = receive_stats_.get(); config.receive_statistics = receive_stats_.get();
feedback_transport_.Enable();
config.outgoing_transport = &feedback_transport_; config.outgoing_transport = &feedback_transport_;
rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config)); rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config));
rtp_rtcp_->SetREMBStatus(true); rtp_rtcp_->SetREMBStatus(true);

View File

@ -14,11 +14,14 @@ namespace webrtc {
namespace internal { namespace internal {
TransportAdapter::TransportAdapter(newapi::Transport* transport) TransportAdapter::TransportAdapter(newapi::Transport* transport)
: transport_(transport) {} : transport_(transport), enabled_(0) {}
int TransportAdapter::SendPacket(int /*channel*/, int TransportAdapter::SendPacket(int /*channel*/,
const void* packet, const void* packet,
int length) { int length) {
if (enabled_.Value() == 0)
return false;
bool success = transport_->SendRtp(static_cast<const uint8_t*>(packet), bool success = transport_->SendRtp(static_cast<const uint8_t*>(packet),
static_cast<size_t>(length)); static_cast<size_t>(length));
return success ? length : -1; return success ? length : -1;
@ -27,10 +30,21 @@ int TransportAdapter::SendPacket(int /*channel*/,
int TransportAdapter::SendRTCPPacket(int /*channel*/, int TransportAdapter::SendRTCPPacket(int /*channel*/,
const void* packet, const void* packet,
int length) { int length) {
if (enabled_.Value() == 0)
return false;
bool success = transport_->SendRtcp(static_cast<const uint8_t*>(packet), bool success = transport_->SendRtcp(static_cast<const uint8_t*>(packet),
static_cast<size_t>(length)); static_cast<size_t>(length));
return success ? length : -1; return success ? length : -1;
} }
void TransportAdapter::Enable() {
// If this exchange fails it means enabled_ was already true, no need to
// check result and iterate.
enabled_.CompareExchange(1, 0);
}
void TransportAdapter::Disable() { enabled_.CompareExchange(0, 1); }
} // namespace internal } // namespace internal
} // namespace webrtc } // namespace webrtc

View File

@ -11,6 +11,7 @@
#define WEBRTC_VIDEO_ENGINE_INTERNAL_TRANSPORT_ADAPTER_H_ #define WEBRTC_VIDEO_ENGINE_INTERNAL_TRANSPORT_ADAPTER_H_
#include "webrtc/common_types.h" #include "webrtc/common_types.h"
#include "webrtc/system_wrappers/interface/atomic32.h"
#include "webrtc/transport.h" #include "webrtc/transport.h"
namespace webrtc { namespace webrtc {
@ -25,8 +26,12 @@ class TransportAdapter : public webrtc::Transport {
virtual int SendRTCPPacket(int /*channel*/, const void* packet, int length) virtual int SendRTCPPacket(int /*channel*/, const void* packet, int length)
OVERRIDE; OVERRIDE;
void Enable();
void Disable();
private: private:
newapi::Transport *transport_; newapi::Transport *transport_;
Atomic32 enabled_;
}; };
} // namespace internal } // namespace internal
} // namespace webrtc } // namespace webrtc

View File

@ -168,6 +168,7 @@ VideoReceiveStream::~VideoReceiveStream() {
} }
void VideoReceiveStream::StartReceiving() { void VideoReceiveStream::StartReceiving() {
transport_adapter_.Enable();
if (render_->StartRender(channel_) != 0) if (render_->StartRender(channel_) != 0)
abort(); abort();
if (video_engine_base_->StartReceive(channel_) != 0) if (video_engine_base_->StartReceive(channel_) != 0)
@ -179,6 +180,7 @@ void VideoReceiveStream::StopReceiving() {
abort(); abort();
if (video_engine_base_->StopReceive(channel_) != 0) if (video_engine_base_->StopReceive(channel_) != 0)
abort(); abort();
transport_adapter_.Disable();
} }
void VideoReceiveStream::GetCurrentReceiveCodec(VideoCodec* receive_codec) { void VideoReceiveStream::GetCurrentReceiveCodec(VideoCodec* receive_codec) {

View File

@ -259,6 +259,7 @@ void VideoSendStream::SwapFrame(I420VideoFrame* frame) {
VideoSendStreamInput* VideoSendStream::Input() { return this; } VideoSendStreamInput* VideoSendStream::Input() { return this; }
void VideoSendStream::StartSending() { void VideoSendStream::StartSending() {
transport_adapter_.Enable();
video_engine_base_->StartSend(channel_); video_engine_base_->StartSend(channel_);
video_engine_base_->StartReceive(channel_); video_engine_base_->StartReceive(channel_);
} }
@ -266,6 +267,7 @@ void VideoSendStream::StartSending() {
void VideoSendStream::StopSending() { void VideoSendStream::StopSending() {
video_engine_base_->StopSend(channel_); video_engine_base_->StopSend(channel_);
video_engine_base_->StopReceive(channel_); video_engine_base_->StopReceive(channel_);
transport_adapter_.Disable();
} }
bool VideoSendStream::SetCodec(const VideoCodec& codec) { bool VideoSendStream::SetCodec(const VideoCodec& codec) {

View File

@ -433,7 +433,9 @@ TEST_F(VideoSendStreamTest, SupportsFec) {
transport_adapter_(SendTransport()), transport_adapter_(SendTransport()),
send_count_(0), send_count_(0),
received_media_(false), received_media_(false),
received_fec_(false) {} received_fec_(false) {
transport_adapter_.Enable();
}
virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
RTPHeader header; RTPHeader header;
@ -504,7 +506,9 @@ void VideoSendStreamTest::TestNackRetransmission(
send_count_(0), send_count_(0),
retransmit_ssrc_(retransmit_ssrc), retransmit_ssrc_(retransmit_ssrc),
retransmit_payload_type_(retransmit_payload_type), retransmit_payload_type_(retransmit_payload_type),
nacked_sequence_number_(-1) {} nacked_sequence_number_(-1) {
transport_adapter_.Enable();
}
virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE { virtual Action OnSendRtp(const uint8_t* packet, size_t length) OVERRIDE {
RTPHeader header; RTPHeader header;
@ -764,7 +768,9 @@ TEST_F(VideoSendStreamTest, SuspendBelowMinBitrate) {
suspended_frame_count_(0), suspended_frame_count_(0),
low_remb_bps_(0), low_remb_bps_(0),
high_remb_bps_(0), high_remb_bps_(0),
crit_sect_(CriticalSectionWrapper::CreateCriticalSection()) {} crit_sect_(CriticalSectionWrapper::CreateCriticalSection()) {
transport_adapter_.Enable();
}
void SetReceiver(PacketReceiver* receiver) { void SetReceiver(PacketReceiver* receiver) {
transport_.SetReceiver(receiver); transport_.SetReceiver(receiver);
@ -890,7 +896,9 @@ TEST_F(VideoSendStreamTest, NoPaddingWhenVideoIsMuted) {
last_packet_time_ms_(-1), last_packet_time_ms_(-1),
transport_adapter_(ReceiveTransport()), transport_adapter_(ReceiveTransport()),
capturer_(NULL), capturer_(NULL),
crit_sect_(CriticalSectionWrapper::CreateCriticalSection()) {} crit_sect_(CriticalSectionWrapper::CreateCriticalSection()) {
transport_adapter_.Enable();
}
void SetCapturer(test::FrameGeneratorCapturer* capturer) { void SetCapturer(test::FrameGeneratorCapturer* capturer) {
capturer_ = capturer; capturer_ = capturer;