Add path for recovered packets from internal::Call to RtpStreamReceiver.

When the FlexfecReceiver recovers media packets, it inserts these into
internal::Call, which then distributes them to the appropriate
VideoReceiveStream/RtpStreamReceiver.

BUG=webrtc:5654

Review-Url: https://codereview.webrtc.org/2390823009
Cr-Commit-Position: refs/heads/master@{#14642}
This commit is contained in:
brandtr 2016-10-16 14:10:51 -07:00 committed by Commit bot
parent e5ddf52b97
commit 9c4b4b47f4
4 changed files with 27 additions and 1 deletions

View File

@ -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<uint32_t>::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

View File

@ -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;

View File

@ -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;

View File

@ -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;