1/* 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" 12 13#include "testing/gmock/include/gmock/gmock.h" 14#include "testing/gtest/include/gtest/gtest.h" 15 16using testing::ElementsAreArray; 17using testing::make_tuple; 18using webrtc::rtcp::RawPacket; 19using webrtc::rtcp::Sli; 20using webrtc::RTCPUtility::RtcpCommonHeader; 21using webrtc::RTCPUtility::RtcpParseCommonHeader; 22 23namespace webrtc { 24namespace { 25 26const uint32_t kSenderSsrc = 0x12345678; 27const uint32_t kRemoteSsrc = 0x23456789; 28 29const uint8_t kPictureId = 0x3f; 30const uint16_t kFirstMb = 0x1e61; 31const uint16_t kNumberOfMb = 0x1a0a; 32const uint32_t kSliItem = (static_cast<uint32_t>(kFirstMb) << 19) | 33 (static_cast<uint32_t>(kNumberOfMb) << 6) | 34 static_cast<uint32_t>(kPictureId); 35 36// Manually created Sli packet matching constants above. 37const uint8_t kPacket[] = {0x82, 206, 0x00, 0x03, 38 0x12, 0x34, 0x56, 0x78, 39 0x23, 0x45, 0x67, 0x89, 40 (kSliItem >> 24) & 0xff, 41 (kSliItem >> 16) & 0xff, 42 (kSliItem >> 8) & 0xff, 43 kSliItem & 0xff}; 44const size_t kPacketLength = sizeof(kPacket); 45 46bool ParseSli(const uint8_t* buffer, size_t length, Sli* sli) { 47 RtcpCommonHeader header; 48 EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header)); 49 EXPECT_EQ(length, header.BlockSize()); 50 return sli->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes); 51} 52 53TEST(RtcpPacketSliTest, Create) { 54 Sli sli; 55 sli.From(kSenderSsrc); 56 sli.To(kRemoteSsrc); 57 sli.WithPictureId(kPictureId, kFirstMb, kNumberOfMb); 58 59 rtc::scoped_ptr<RawPacket> packet(sli.Build()); 60 61 EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()), 62 ElementsAreArray(kPacket)); 63} 64 65TEST(RtcpPacketSliTest, Parse) { 66 Sli mutable_parsed; 67 EXPECT_TRUE(ParseSli(kPacket, kPacketLength, &mutable_parsed)); 68 const Sli& parsed = mutable_parsed; // Read values from constant object. 69 70 EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); 71 EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc()); 72 EXPECT_EQ(1u, parsed.macroblocks().size()); 73 EXPECT_EQ(kFirstMb, parsed.macroblocks()[0].first()); 74 EXPECT_EQ(kNumberOfMb, parsed.macroblocks()[0].number()); 75 EXPECT_EQ(kPictureId, parsed.macroblocks()[0].picture_id()); 76} 77 78TEST(RtcpPacketSliTest, ParseFailsOnTooSmallPacket) { 79 Sli sli; 80 sli.From(kSenderSsrc); 81 sli.To(kRemoteSsrc); 82 sli.WithPictureId(kPictureId, kFirstMb, kNumberOfMb); 83 84 rtc::scoped_ptr<RawPacket> packet(sli.Build()); 85 packet->MutableBuffer()[3]--; // Decrease size by 1 word (4 bytes). 86 87 EXPECT_FALSE(ParseSli(packet->Buffer(), packet->Length() - 4, &sli)); 88} 89 90} // namespace 91} // namespace webrtc 92