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