diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc index 9515ac10f1..489983e7ed 100644 --- a/webrtc/call/call.cc +++ b/webrtc/call/call.cc @@ -18,6 +18,7 @@ #include "webrtc/audio/audio_send_stream.h" #include "webrtc/audio/audio_state.h" #include "webrtc/audio/scoped_voe_interface.h" +#include "webrtc/base/basictypes.h" #include "webrtc/base/checks.h" #include "webrtc/base/constructormagic.h" #include "webrtc/base/logging.h" @@ -32,6 +33,7 @@ #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" #include "webrtc/modules/congestion_controller/include/congestion_controller.h" #include "webrtc/modules/pacing/paced_sender.h" +#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" #include "webrtc/modules/rtp_rtcp/source/byte_io.h" #include "webrtc/modules/utility/include/process_thread.h" @@ -57,6 +59,7 @@ namespace internal { class Call : public webrtc::Call, public PacketReceiver, + public RecoveredPacketReceiver, public CongestionController::Observer, public BitrateAllocator::LimitObserver { public: @@ -91,6 +94,9 @@ class Call : public webrtc::Call, size_t length, const PacketTime& packet_time) override; + // Implements RecoveredPacketReceiver. + bool OnRecoveredPacket(const uint8_t* packet, size_t length) override; + void SetBitrateConfig( const webrtc::Call::Config::BitrateConfig& bitrate_config) override; @@ -940,5 +946,16 @@ PacketReceiver::DeliveryStatus Call::DeliverPacket( return DeliverRtp(media_type, packet, length, packet_time); } +// TODO(brandtr): Update this member function when we support protecting +// audio packets with FlexFEC. +bool Call::OnRecoveredPacket(const uint8_t* packet, size_t length) { + uint32_t ssrc = ByteReader::ReadBigEndian(&packet[8]); + ReadLockScoped read_lock(*receive_crit_); + auto it = video_receive_ssrcs_.find(ssrc); + if (it == video_receive_ssrcs_.end()) + return false; + return it->second->OnRecoveredPacket(packet, length); +} + } // namespace internal } // namespace webrtc diff --git a/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h b/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h index f3894f5d77..8f672fcc2d 100644 --- a/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h +++ b/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h @@ -18,7 +18,8 @@ namespace webrtc { -// Callback interface for packets recovered by FlexFEC. +// Callback interface for packets recovered by FlexFEC. The implementation +// should be able to demultiplex the recovered RTP packets based on SSRC. class RecoveredPacketReceiver { public: virtual bool OnRecoveredPacket(const uint8_t* packet, size_t length) = 0; diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc index f260b5ed4f..e25546a193 100644 --- a/webrtc/video/video_receive_stream.cc +++ b/webrtc/video/video_receive_stream.cc @@ -259,6 +259,11 @@ bool VideoReceiveStream::DeliverRtp(const uint8_t* packet, return rtp_stream_receiver_.DeliverRtp(packet, length, packet_time); } +bool VideoReceiveStream::OnRecoveredPacket(const uint8_t* packet, + size_t length) { + return rtp_stream_receiver_.OnRecoveredPacket(packet, length); +} + void VideoReceiveStream::Start() { if (decode_thread_.IsRunning()) return; diff --git a/webrtc/video/video_receive_stream.h b/webrtc/video/video_receive_stream.h index 3bb8aea40d..c6d21d29c5 100644 --- a/webrtc/video/video_receive_stream.h +++ b/webrtc/video/video_receive_stream.h @@ -18,6 +18,7 @@ #include "webrtc/call/transport_adapter.h" #include "webrtc/common_video/include/incoming_video_stream.h" #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" +#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" #include "webrtc/modules/video_coding/video_coding_impl.h" #include "webrtc/system_wrappers/include/clock.h" #include "webrtc/video/receive_statistics_proxy.h" @@ -59,6 +60,8 @@ class VideoReceiveStream : public webrtc::VideoReceiveStream, size_t length, const PacketTime& packet_time); + bool OnRecoveredPacket(const uint8_t* packet, size_t length); + // webrtc::VideoReceiveStream implementation. void Start() override; void Stop() override;