Fix for making sure that the packet in order checks are done prior to updating the last received packet state.

Without this fix all packets are considered out-of-order by the rtp receiver, causing the last received state
in the rtp receiver to never get valid.

Also makes sure that only valid timestamps and receive times are used for audio/video sync.

BUG=2608
R=mflodman@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5102 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
stefan@webrtc.org
2013-11-08 15:18:52 +00:00
parent bff9620116
commit 48df38114d
9 changed files with 54 additions and 31 deletions

View File

@ -80,7 +80,7 @@ RtpReceiverImpl::RtpReceiverImpl(int32_t id,
num_csrcs_(0),
current_remote_csrc_(),
last_received_timestamp_(0),
last_received_frame_time_ms_(0),
last_received_frame_time_ms_(-1),
last_received_sequence_number_(0),
nack_method_(kNackOff) {
assert(incoming_audio_messages_callback);
@ -228,18 +228,20 @@ bool RtpReceiverImpl::IncomingRtpPacket(
uint16_t payload_data_length = payload_length - rtp_header.paddingLength;
bool is_first_packet_in_frame = false;
bool is_first_packet = false;
{
CriticalSectionScoped lock(critical_section_rtp_receiver_.get());
is_first_packet_in_frame =
if (HaveReceivedFrame()) {
is_first_packet_in_frame =
last_received_sequence_number_ + 1 == rtp_header.sequenceNumber &&
Timestamp() != rtp_header.timestamp;
is_first_packet = is_first_packet_in_frame || last_receive_time_ == 0;
last_received_timestamp_ != rtp_header.timestamp;
} else {
is_first_packet_in_frame = true;
}
}
int32_t ret_val = rtp_media_receiver_->ParseRtpPacket(
&webrtc_rtp_header, payload_specific, is_red, payload, payload_length,
clock_->TimeInMilliseconds(), is_first_packet);
clock_->TimeInMilliseconds(), is_first_packet_in_frame);
if (ret_val < 0) {
return false;
@ -266,14 +268,24 @@ TelephoneEventHandler* RtpReceiverImpl::GetTelephoneEventHandler() {
return rtp_media_receiver_->GetTelephoneEventHandler();
}
uint32_t RtpReceiverImpl::Timestamp() const {
bool RtpReceiverImpl::Timestamp(uint32_t* timestamp) const {
CriticalSectionScoped lock(critical_section_rtp_receiver_.get());
return last_received_timestamp_;
if (!HaveReceivedFrame())
return false;
*timestamp = last_received_timestamp_;
return true;
}
int32_t RtpReceiverImpl::LastReceivedTimeMs() const {
bool RtpReceiverImpl::LastReceivedTimeMs(int64_t* receive_time_ms) const {
CriticalSectionScoped lock(critical_section_rtp_receiver_.get());
return last_received_frame_time_ms_;
if (!HaveReceivedFrame())
return false;
*receive_time_ms = last_received_frame_time_ms_;
return true;
}
bool RtpReceiverImpl::HaveReceivedFrame() const {
return last_received_frame_time_ms_ >= 0;
}
// Implementation note: must not hold critsect when called.
@ -298,7 +310,7 @@ void RtpReceiverImpl::CheckSSRCChanged(const RTPHeader& rtp_header) {
last_received_timestamp_ = 0;
last_received_sequence_number_ = 0;
last_received_frame_time_ms_ = 0;
last_received_frame_time_ms_ = -1;
// Do we have a SSRC? Then the stream is restarted.
if (ssrc_ != 0) {