Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / media / cast / net / rtcp / rtcp_builder.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_
6 #define MEDIA_CAST_NET_RTCP_RTCP_BUILDER_H_
7
8 #include <deque>
9 #include <list>
10 #include <string>
11
12 #include "base/big_endian.h"
13 #include "media/cast/cast_config.h"
14 #include "media/cast/cast_defines.h"
15 #include "media/cast/net/cast_transport_defines.h"
16 #include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h"
17 #include "media/cast/net/rtcp/rtcp_defines.h"
18
19 namespace media {
20 namespace cast {
21
22 // We limit the size of receiver logs to avoid queuing up packets.
23 const size_t kMaxReceiverLogBytes = 200;
24
25 // The determines how long to hold receiver log events, based on how
26 // many "receiver log message reports" ago the events were sent.
27 const size_t kReceiveLogMessageHistorySize = 20;
28
29 // This determines when to send events the second time.
30 const size_t kFirstRedundancyOffset = 10;
31 COMPILE_ASSERT(kFirstRedundancyOffset > 0 &&
32                    kFirstRedundancyOffset <= kReceiveLogMessageHistorySize,
33                redundancy_offset_out_of_range);
34
35 // When to send events the third time.
36 const size_t kSecondRedundancyOffset = 20;
37 COMPILE_ASSERT(kSecondRedundancyOffset >
38                    kFirstRedundancyOffset && kSecondRedundancyOffset <=
39                    kReceiveLogMessageHistorySize,
40                redundancy_offset_out_of_range);
41
42
43 class RtcpBuilder {
44  public:
45   explicit RtcpBuilder(uint32 sending_ssrc);
46   ~RtcpBuilder();
47
48   PacketRef BuildRtcpFromReceiver(
49       const RtcpReportBlock* report_block,
50       const RtcpReceiverReferenceTimeReport* rrtr,
51       const RtcpCastMessage* cast_message,
52       const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events,
53       base::TimeDelta target_delay);
54
55   PacketRef BuildRtcpFromSender(const RtcpSenderInfo& sender_info);
56
57  private:
58   void AddRtcpHeader(RtcpPacketFields payload, int format_or_count);
59   void PatchLengthField();
60   void AddRR(const RtcpReportBlock* report_block);
61   void AddReportBlocks(const RtcpReportBlock& report_block);
62   void AddRrtr(const RtcpReceiverReferenceTimeReport* rrtr);
63   void AddCast(const RtcpCastMessage* cast_message,
64                base::TimeDelta target_delay);
65   void AddSR(const RtcpSenderInfo& sender_info);
66   void AddDlrrRb(const RtcpDlrrReportBlock& dlrr);
67   void AddReceiverLog(
68       const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events);
69
70   bool GetRtcpReceiverLogMessage(
71       const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events,
72       RtcpReceiverLogMessage* receiver_log_message,
73       size_t* total_number_of_messages_to_send);
74
75   void Start();
76   PacketRef Finish();
77
78   base::BigEndianWriter writer_;
79   const uint32 ssrc_;
80   char* ptr_of_length_;
81   PacketRef packet_;
82   std::deque<RtcpReceiverLogMessage> rtcp_events_history_;
83
84   DISALLOW_COPY_AND_ASSIGN(RtcpBuilder);
85 };
86
87 }  // namespace cast
88 }  // namespace media
89
90 #endif  // MEDIA_CAST_NET_RTCP_RTCP_SENDER_H_