From 386449971a8f471e87f3844ebee1b1bc74144998 Mon Sep 17 00:00:00 2001 From: nisse Date: Wed, 30 Aug 2017 04:16:40 -0700 Subject: [PATCH] Fix setting of recovered flag in RtxReceiveStream. BUG=webrtc:7135 Review-Url: https://codereview.webrtc.org/3005793002 Cr-Commit-Position: refs/heads/master@{#19599} --- webrtc/call/rtx_receive_stream.cc | 25 +++++++++++++++------- webrtc/call/rtx_receive_stream.h | 8 ++++--- webrtc/call/rtx_receive_stream_unittest.cc | 23 +++++++++++++++++--- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/webrtc/call/rtx_receive_stream.cc b/webrtc/call/rtx_receive_stream.cc index f08e3c3960..16463525c7 100644 --- a/webrtc/call/rtx_receive_stream.cc +++ b/webrtc/call/rtx_receive_stream.cc @@ -12,16 +12,21 @@ #include "webrtc/call/rtx_receive_stream.h" #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" +#include "webrtc/rtc_base/logging.h" namespace webrtc { -RtxReceiveStream::RtxReceiveStream( - RtpPacketSinkInterface* media_sink, - std::map rtx_payload_type_map, - uint32_t media_ssrc) +RtxReceiveStream::RtxReceiveStream(RtpPacketSinkInterface* media_sink, + std::map associated_payload_types, + uint32_t media_ssrc) : media_sink_(media_sink), - rtx_payload_type_map_(std::move(rtx_payload_type_map)), - media_ssrc_(media_ssrc) {} + associated_payload_types_(std::move(associated_payload_types)), + media_ssrc_(media_ssrc) { + if (associated_payload_types_.empty()) { + LOG(LS_WARNING) + << "RtxReceiveStream created with empty payload type mapping."; + } +} RtxReceiveStream::~RtxReceiveStream() = default; @@ -32,8 +37,11 @@ void RtxReceiveStream::OnRtpPacket(const RtpPacketReceived& rtx_packet) { return; } - auto it = rtx_payload_type_map_.find(rtx_packet.PayloadType()); - if (it == rtx_payload_type_map_.end()) { + auto it = associated_payload_types_.find(rtx_packet.PayloadType()); + if (it == associated_payload_types_.end()) { + LOG(LS_VERBOSE) << "Unknown payload type " + << static_cast(rtx_packet.PayloadType()) + << " on rtx ssrc " << rtx_packet.Ssrc(); return; } RtpPacketReceived media_packet; @@ -42,6 +50,7 @@ void RtxReceiveStream::OnRtpPacket(const RtpPacketReceived& rtx_packet) { media_packet.SetSsrc(media_ssrc_); media_packet.SetSequenceNumber((payload[0] << 8) + payload[1]); media_packet.SetPayloadType(it->second); + media_packet.set_recovered(true); // Skip the RTX header. rtc::ArrayView rtx_payload = diff --git a/webrtc/call/rtx_receive_stream.h b/webrtc/call/rtx_receive_stream.h index 2830dd31f5..418775c778 100644 --- a/webrtc/call/rtx_receive_stream.h +++ b/webrtc/call/rtx_receive_stream.h @@ -17,10 +17,12 @@ namespace webrtc { +// This class is responsible for RTX decapsulation. The resulting media packets +// are passed on to a sink representing the associated media stream. class RtxReceiveStream : public RtpPacketSinkInterface { public: RtxReceiveStream(RtpPacketSinkInterface* media_sink, - std::map rtx_payload_type_map, + std::map associated_payload_types, uint32_t media_ssrc); ~RtxReceiveStream() override; // RtpPacketSinkInterface. @@ -28,8 +30,8 @@ class RtxReceiveStream : public RtpPacketSinkInterface { private: RtpPacketSinkInterface* const media_sink_; - // Mapping rtx_payload_type_map_[rtx] = associated. - const std::map rtx_payload_type_map_; + // Map from rtx payload type -> media payload type. + const std::map associated_payload_types_; // TODO(nisse): Ultimately, the media receive stream shouldn't care about the // ssrc, and we should delete this. const uint32_t media_ssrc_; diff --git a/webrtc/call/rtx_receive_stream_unittest.cc b/webrtc/call/rtx_receive_stream_unittest.cc index e9c8210521..2b2625d736 100644 --- a/webrtc/call/rtx_receive_stream_unittest.cc +++ b/webrtc/call/rtx_receive_stream_unittest.cc @@ -25,6 +25,7 @@ using ::testing::StrictMock; constexpr int kMediaPayloadType = 100; constexpr int kRtxPayloadType = 98; +constexpr int kUnknownPayloadType = 90; constexpr uint32_t kMediaSSRC = 0x3333333; constexpr uint16_t kMediaSeqno = 0x5657; @@ -55,8 +56,7 @@ constexpr uint8_t kRtxPacketWithCVO[] = { }; std::map PayloadTypeMapping() { - std::map m; - m[kRtxPayloadType] = kMediaPayloadType; + const std::map m = {{kRtxPayloadType, kMediaPayloadType}}; return m; } @@ -84,9 +84,26 @@ TEST(RtxReceiveStreamTest, RestoresPacketPayload) { rtx_sink.OnRtpPacket(rtx_packet); } +TEST(RtxReceiveStreamTest, SetsRecoveredFlag) { + StrictMock media_sink; + RtxReceiveStream rtx_sink(&media_sink, PayloadTypeMapping(), kMediaSSRC); + RtpPacketReceived rtx_packet; + EXPECT_TRUE(rtx_packet.Parse(rtc::ArrayView(kRtxPacket))); + EXPECT_FALSE(rtx_packet.recovered()); + EXPECT_CALL(media_sink, OnRtpPacket(_)) + .WillOnce(testing::Invoke([](const RtpPacketReceived& packet) { + EXPECT_TRUE(packet.recovered()); + })); + + rtx_sink.OnRtpPacket(rtx_packet); +} + TEST(RtxReceiveStreamTest, IgnoresUnknownPayloadType) { StrictMock media_sink; - RtxReceiveStream rtx_sink(&media_sink, std::map(), kMediaSSRC); + const std::map payload_type_mapping = { + {kUnknownPayloadType, kMediaPayloadType}}; + + RtxReceiveStream rtx_sink(&media_sink, payload_type_mapping, kMediaSSRC); RtpPacketReceived rtx_packet; EXPECT_TRUE(rtx_packet.Parse(rtc::ArrayView(kRtxPacket))); rtx_sink.OnRtpPacket(rtx_packet);