diff --git a/webrtc/modules/modules.gyp b/webrtc/modules/modules.gyp index 9995447eef..fb761823ed 100644 --- a/webrtc/modules/modules.gyp +++ b/webrtc/modules/modules.gyp @@ -310,6 +310,7 @@ 'rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc', 'rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc', 'rtp_rtcp/source/rtcp_packet/extended_jitter_report_unittest.cc', + 'rtp_rtcp/source/rtcp_packet/fir_unittest.cc', 'rtp_rtcp/source/rtcp_packet/nack_unittest.cc', 'rtp_rtcp/source/rtcp_packet/pli_unittest.cc', 'rtp_rtcp/source/rtcp_packet/receiver_report_unittest.cc', diff --git a/webrtc/modules/rtp_rtcp/BUILD.gn b/webrtc/modules/rtp_rtcp/BUILD.gn index bea0abafc4..90989759f9 100644 --- a/webrtc/modules/rtp_rtcp/BUILD.gn +++ b/webrtc/modules/rtp_rtcp/BUILD.gn @@ -56,6 +56,8 @@ source_set("rtp_rtcp") { "source/rtcp_packet/dlrr.h", "source/rtcp_packet/extended_jitter_report.cc", "source/rtcp_packet/extended_jitter_report.h", + "source/rtcp_packet/fir.cc", + "source/rtcp_packet/fir.h", "source/rtcp_packet/nack.cc", "source/rtcp_packet/nack.h", "source/rtcp_packet/pli.cc", diff --git a/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi b/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi index ccd0fa0351..cda390c080 100644 --- a/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi +++ b/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi @@ -51,6 +51,8 @@ 'source/rtcp_packet/dlrr.h', 'source/rtcp_packet/extended_jitter_report.cc', 'source/rtcp_packet/extended_jitter_report.h', + 'source/rtcp_packet/fir.cc', + 'source/rtcp_packet/fir.h', 'source/rtcp_packet/nack.cc', 'source/rtcp_packet/nack.h', 'source/rtcp_packet/pli.cc', diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc index 533564d277..7b671c094a 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc @@ -29,8 +29,6 @@ using webrtc::RTCPUtility::PT_SR; using webrtc::RTCPUtility::PT_XR; using webrtc::RTCPUtility::RTCPPacketAPP; -using webrtc::RTCPUtility::RTCPPacketPSFBFIR; -using webrtc::RTCPUtility::RTCPPacketPSFBFIRItem; using webrtc::RTCPUtility::RTCPPacketPSFBRPSI; using webrtc::RTCPUtility::RTCPPacketReportBlockItem; using webrtc::RTCPUtility::RTCPPacketRTPFBNACK; @@ -42,9 +40,6 @@ using webrtc::RTCPUtility::RTCPPacketXR; namespace webrtc { namespace rtcp { namespace { -// Unused SSRC of media source, set to 0. -const uint32_t kUnusedMediaSourceSsrc0 = 0; - void AssignUWord8(uint8_t* buffer, size_t* offset, uint8_t value) { buffer[(*offset)++] = value; } @@ -52,10 +47,6 @@ void AssignUWord16(uint8_t* buffer, size_t* offset, uint16_t value) { ByteWriter::WriteBigEndian(buffer + *offset, value); *offset += 2; } -void AssignUWord24(uint8_t* buffer, size_t* offset, uint32_t value) { - ByteWriter::WriteBigEndian(buffer + *offset, value); - *offset += 3; -} void AssignUWord32(uint8_t* buffer, size_t* offset, uint32_t value) { ByteWriter::WriteBigEndian(buffer + *offset, value); *offset += 4; @@ -187,29 +178,6 @@ void CreateRpsi(const RTCPPacketPSFBRPSI& rpsi, *pos += padding_bytes; } -// Full intra request (FIR) (RFC 5104). -// -// FCI: -// -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | SSRC | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | Seq nr. | Reserved | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - -void CreateFir(const RTCPPacketPSFBFIR& fir, - const RTCPPacketPSFBFIRItem& fir_item, - uint8_t* buffer, - size_t* pos) { - AssignUWord32(buffer, pos, fir.SenderSSRC); - AssignUWord32(buffer, pos, kUnusedMediaSourceSsrc0); - AssignUWord32(buffer, pos, fir_item.SSRC); - AssignUWord8(buffer, pos, fir_item.CommandSequenceNumber); - AssignUWord24(buffer, pos, 0); -} - // From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR). // // Format for XR packets: @@ -437,20 +405,6 @@ void Rpsi::WithPictureId(uint64_t picture_id) { } } -bool Fir::Create(uint8_t* packet, - size_t* index, - size_t max_length, - RtcpPacket::PacketReadyCallback* callback) const { - while (*index + BlockLength() > max_length) { - if (!OnBufferFull(packet, index, callback)) - return false; - } - const uint8_t kFmt = 4; - CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index); - CreateFir(fir_, fir_item_, packet, index); - return true; -} - bool Xr::Create(uint8_t* packet, size_t* index, size_t max_length, diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet.h index 1d89d7cbb0..f1fc7175fa 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet.h +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet.h @@ -306,53 +306,6 @@ class Rpsi : public RtcpPacket { RTC_DISALLOW_COPY_AND_ASSIGN(Rpsi); }; -// Full intra request (FIR) (RFC 5104). -// -// FCI: -// -// 0 1 2 3 -// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | SSRC | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -// | Seq nr. | Reserved | -// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - -class Fir : public RtcpPacket { - public: - Fir() : RtcpPacket() { - memset(&fir_, 0, sizeof(fir_)); - memset(&fir_item_, 0, sizeof(fir_item_)); - } - - virtual ~Fir() {} - - void From(uint32_t ssrc) { - fir_.SenderSSRC = ssrc; - } - void To(uint32_t ssrc) { - fir_item_.SSRC = ssrc; - } - void WithCommandSeqNum(uint8_t seq_num) { - fir_item_.CommandSequenceNumber = seq_num; - } - - protected: - bool Create(uint8_t* packet, - size_t* index, - size_t max_length, - RtcpPacket::PacketReadyCallback* callback) const override; - - private: - size_t BlockLength() const { - const size_t kFciLength = 8; - return kCommonFbFmtLength + kFciLength; - } - - RTCPUtility::RTCPPacketPSFBFIR fir_; - RTCPUtility::RTCPPacketPSFBFIRItem fir_item_; -}; - // From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR). // // Format for XR packets: diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc index 83dc5f6ed3..b38b69c638 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc @@ -13,6 +13,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" #include "webrtc/test/rtcp_packet_parser.h" diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.cc new file mode 100644 index 0000000000..674bbb7f75 --- /dev/null +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.cc @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" + +#include "webrtc/base/checks.h" +#include "webrtc/base/logging.h" +#include "webrtc/modules/rtp_rtcp/source/byte_io.h" + +using webrtc::RTCPUtility::PT_PSFB; +using webrtc::RTCPUtility::RTCPPacketPSFBFIR; +using webrtc::RTCPUtility::RTCPPacketPSFBFIRItem; + +namespace webrtc { +namespace rtcp { +namespace { +const uint32_t kUnusedMediaSourceSsrc0 = 0; + +void AssignUWord8(uint8_t* buffer, size_t* offset, uint8_t value) { + buffer[(*offset)++] = value; +} + +void AssignUWord24(uint8_t* buffer, size_t* offset, uint32_t value) { + ByteWriter::WriteBigEndian(buffer + *offset, value); + *offset += 3; +} + +void AssignUWord32(uint8_t* buffer, size_t* offset, uint32_t value) { + ByteWriter::WriteBigEndian(buffer + *offset, value); + *offset += 4; +} + +// Full intra request (FIR) (RFC 5104). +// +// FCI: +// +// 0 1 2 3 +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | SSRC | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | Seq nr. | Reserved | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +void CreateFir(const RTCPPacketPSFBFIR& fir, + const RTCPPacketPSFBFIRItem& fir_item, + uint8_t* buffer, + size_t* pos) { + AssignUWord32(buffer, pos, fir.SenderSSRC); + AssignUWord32(buffer, pos, kUnusedMediaSourceSsrc0); + AssignUWord32(buffer, pos, fir_item.SSRC); + AssignUWord8(buffer, pos, fir_item.CommandSequenceNumber); + AssignUWord24(buffer, pos, 0); +} +} // namespace + +bool Fir::Create(uint8_t* packet, + size_t* index, + size_t max_length, + RtcpPacket::PacketReadyCallback* callback) const { + while (*index + BlockLength() > max_length) { + if (!OnBufferFull(packet, index, callback)) + return false; + } + const uint8_t kFmt = 4; + CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index); + CreateFir(fir_, fir_item_, packet, index); + return true; +} + +} // namespace rtcp +} // namespace webrtc diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h new file mode 100644 index 0000000000..c2b897e46e --- /dev/null +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + */ + +#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_FIR_H_ +#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_FIR_H_ + +#include "webrtc/base/basictypes.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h" + +namespace webrtc { +namespace rtcp { + +// Full intra request (FIR) (RFC 5104). +class Fir : public RtcpPacket { + public: + Fir() : RtcpPacket() { + memset(&fir_, 0, sizeof(fir_)); + memset(&fir_item_, 0, sizeof(fir_item_)); + } + + virtual ~Fir() {} + + void From(uint32_t ssrc) { + fir_.SenderSSRC = ssrc; + } + void To(uint32_t ssrc) { + fir_item_.SSRC = ssrc; + } + void WithCommandSeqNum(uint8_t seq_num) { + fir_item_.CommandSequenceNumber = seq_num; + } + + protected: + bool Create(uint8_t* packet, + size_t* index, + size_t max_length, + RtcpPacket::PacketReadyCallback* callback) const override; + + private: + size_t BlockLength() const { + const size_t kFciLength = 8; + return kCommonFbFmtLength + kFciLength; + } + + RTCPUtility::RTCPPacketPSFBFIR fir_; + RTCPUtility::RTCPPacketPSFBFIRItem fir_item_; +}; + +} // namespace rtcp +} // namespace webrtc +#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_FIR_H_ diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir_unittest.cc new file mode 100644 index 0000000000..b65a0c3f5a --- /dev/null +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/fir_unittest.cc @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" + +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "webrtc/test/rtcp_packet_parser.h" + +using webrtc::rtcp::Fir; +using webrtc::rtcp::RawPacket; +using webrtc::test::RtcpPacketParser; + +namespace webrtc { + +const uint32_t kSenderSsrc = 0x12345678; +const uint32_t kRemoteSsrc = 0x23456789; + +TEST(RtcpPacketFirTest, Fir) { + Fir fir; + fir.From(kSenderSsrc); + fir.To(kRemoteSsrc); + fir.WithCommandSeqNum(123); + + rtc::scoped_ptr packet(fir.Build()); + RtcpPacketParser parser; + parser.Parse(packet->Buffer(), packet->Length()); + EXPECT_EQ(1, parser.fir()->num_packets()); + EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc()); + EXPECT_EQ(1, parser.fir_item()->num_packets()); + EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc()); + EXPECT_EQ(123U, parser.fir_item()->SeqNum()); +} + +} // namespace webrtc diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc index c9610560d6..13deb9370f 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc @@ -24,7 +24,6 @@ using ::testing::ElementsAre; using webrtc::rtcp::App; using webrtc::rtcp::Bye; using webrtc::rtcp::Dlrr; -using webrtc::rtcp::Fir; using webrtc::rtcp::RawPacket; using webrtc::rtcp::ReceiverReport; using webrtc::rtcp::ReportBlock; @@ -287,22 +286,6 @@ TEST(RtcpPacketTest, RpsiWithMaxPictureId) { EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); } -TEST(RtcpPacketTest, Fir) { - Fir fir; - fir.From(kSenderSsrc); - fir.To(kRemoteSsrc); - fir.WithCommandSeqNum(123); - - rtc::scoped_ptr packet(fir.Build()); - RtcpPacketParser parser; - parser.Parse(packet->Buffer(), packet->Length()); - EXPECT_EQ(1, parser.fir()->num_packets()); - EXPECT_EQ(kSenderSsrc, parser.fir()->Ssrc()); - EXPECT_EQ(1, parser.fir_item()->num_packets()); - EXPECT_EQ(kRemoteSsrc, parser.fir_item()->Ssrc()); - EXPECT_EQ(123U, parser.fir_item()->SeqNum()); -} - TEST(RtcpPacketTest, BuildWithTooSmallBuffer) { ReportBlock rb; ReceiverReport rr; diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc index 6a6a1cfa2f..f3166141ec 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc @@ -23,6 +23,7 @@ #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc index 03164f0a15..69b0ae1a2f 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc @@ -25,6 +25,7 @@ #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"