1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// found in the LICENSE file. 4424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 5424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// A very simple packet builder class for building RTCP packets. 6424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Used for testing only. 7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#ifndef MEDIA_CAST_RTCP_TEST_RTCP_PACKET_BUILDER_H_ 8424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#define MEDIA_CAST_RTCP_TEST_RTCP_PACKET_BUILDER_H_ 9424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/big_endian.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/cast_config.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/cast/net/cast_transport_defines.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/cast/net/rtcp/rtcp_defines.h" 14424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace media { 16424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)namespace cast { 17424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// These values are arbitrary only for the purpose of testing. 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Sender report. 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const uint32 kNtpHigh = 0x01020304; 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const uint32 kNtpLow = 0x05060708; 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const uint32 kRtpTimestamp = 0x10203040; 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const uint32 kSendPacketCount = 987; 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const uint32 kSendOctetCount = 87654; 27424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Report block. 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kLoss = 0x01000123; 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kExtendedMax = 0x15678; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const int kTestJitter = 0x10203; 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const uint32 kLastSr = 0x34561234; 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)static const uint32 kDelayLastSr = 1000; 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 35424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// DLRR block. 36424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kLastRr = 0x34561234; 37424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kDelayLastRr = 1000; 38424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 39424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// NACK. 40424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kMissingPacket = 34567; 41424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 42424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// CAST. 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const uint32 kAckFrameId = 17; 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const uint32 kLostFrameId = 18; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const uint32 kFrameIdWithLostPackets = 19; 46424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kLostPacketId1 = 3; 47424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kLostPacketId2 = 5; 48424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static const int kLostPacketId3 = 12; 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class TestRtcpPacketBuilder { 52424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public: 53424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) TestRtcpPacketBuilder(); 54424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddSr(uint32 sender_ssrc, int number_of_report_blocks); 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddSrWithNtp(uint32 sender_ssrc, 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 ntp_high, 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint32 ntp_low, 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) uint32 rtp_timestamp); 60424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddRr(uint32 sender_ssrc, int number_of_report_blocks); 61424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddRb(uint32 rtp_ssrc); 62424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 63424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddXrHeader(uint32 sender_ssrc); 64424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddXrDlrrBlock(uint32 sender_ssrc); 65424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddXrExtendedDlrrBlock(uint32 sender_ssrc); 66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddXrRrtrBlock(); 67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddXrUnknownBlock(); 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) void AddUnknownBlock(); 69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 70424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddNack(uint32 sender_ssrc, uint32 media_ssrc); 71424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddSendReportRequest(uint32 sender_ssrc, uint32 media_ssrc); 72424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void AddCast(uint32 sender_ssrc, 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32 media_ssrc, 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta target_delay); 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void AddReceiverLog(uint32 sender_ssrc); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddReceiverFrameLog(uint32 rtp_timestamp, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int num_events, 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 event_timesamp_base); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AddReceiverEventLog(uint16 event_data, 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CastLoggingEvent event, 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint16 event_timesamp_delta); 83424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<Packet> GetPacket(); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* Data(); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int Length() { return kMaxIpPacketSize - big_endian_writer_.remaining(); } 8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::BigEndianReader* Reader(); 88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private: 90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void AddRtcpHeader(int payload, int format_or_count); 91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void PatchLengthField(); 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Where the length field of the current packet is. 94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Note: 0 is not a legal value, it is used for "uninitialized". 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint8 buffer_[kMaxIpPacketSize]; 96424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) char* ptr_of_length_; 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::BigEndianWriter big_endian_writer_; 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::BigEndianReader big_endian_reader_; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestRtcpPacketBuilder); 101424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}; 102424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 103424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace cast 104424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} // namespace media 105424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // MEDIA_CAST_RTCP_TEST_RTCP_PACKET_BUILDER_H_ 107