| Index: webrtc/call/call.cc
|
| diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc
|
| index 41f53feee7c57ed5e42753ad9e2a78075eb8a22c..cbd1601d0152a51be682fb5b982b295c409e552e 100644
|
| --- a/webrtc/call/call.cc
|
| +++ b/webrtc/call/call.cc
|
| @@ -236,10 +236,10 @@ class Call : public webrtc::Call,
|
| MediaType media_type)
|
| SHARED_LOCKS_REQUIRED(receive_crit_);
|
|
|
| - rtc::Optional<RtpPacketReceived> ParseRtpPacket(const uint8_t* packet,
|
| - size_t length,
|
| - const PacketTime* packet_time)
|
| - SHARED_LOCKS_REQUIRED(receive_crit_);
|
| + rtc::Optional<RtpPacketReceived> ParseRtpPacket(
|
| + const uint8_t* packet,
|
| + size_t length,
|
| + const PacketTime* packet_time) const;
|
|
|
| void UpdateSendHistograms(int64_t first_sent_packet_ms)
|
| EXCLUSIVE_LOCKS_REQUIRED(&bitrate_crit_);
|
| @@ -485,7 +485,7 @@ Call::~Call() {
|
| rtc::Optional<RtpPacketReceived> Call::ParseRtpPacket(
|
| const uint8_t* packet,
|
| size_t length,
|
| - const PacketTime* packet_time) {
|
| + const PacketTime* packet_time) const {
|
| RtpPacketReceived parsed_packet;
|
| if (!parsed_packet.Parse(packet, length))
|
| return rtc::Optional<RtpPacketReceived>();
|
| @@ -1299,17 +1299,24 @@ PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type,
|
| const PacketTime& packet_time) {
|
| TRACE_EVENT0("webrtc", "Call::DeliverRtp");
|
|
|
| - RTC_DCHECK(media_type == MediaType::AUDIO || media_type == MediaType::VIDEO);
|
| -
|
| - ReadLockScoped read_lock(*receive_crit_);
|
| // TODO(nisse): We should parse the RTP header only here, and pass
|
| // on parsed_packet to the receive streams.
|
| rtc::Optional<RtpPacketReceived> parsed_packet =
|
| ParseRtpPacket(packet, length, &packet_time);
|
|
|
| + // We might get RTP keep-alive packets in accordance with RFC6263 section 4.6.
|
| + // These are empty (zero length payload) RTP packets with an unsignaled
|
| + // payload type.
|
| + const bool is_keep_alive_packet =
|
| + parsed_packet && parsed_packet->payload_size() == 0;
|
| +
|
| + RTC_DCHECK(media_type == MediaType::AUDIO || media_type == MediaType::VIDEO ||
|
| + is_keep_alive_packet);
|
| +
|
| if (!parsed_packet)
|
| return DELIVERY_PACKET_ERROR;
|
|
|
| + ReadLockScoped read_lock(*receive_crit_);
|
| auto it = receive_rtp_config_.find(parsed_packet->Ssrc());
|
| if (it == receive_rtp_config_.end()) {
|
| LOG(LS_ERROR) << "receive_rtp_config_ lookup failed for ssrc "
|
|
|