1ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap/*
2ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *
4ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *  Use of this source code is governed by a BSD-style license
5ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *  that can be found in the LICENSE file in the root of the source
6ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *  tree. An additional intellectual property rights grant can be found
7ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *  in the file PATENTS.  All contributing project authors may
8ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *  be found in the AUTHORS file in the root of the source tree.
9ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap *
10ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap */
11ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
12ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBN_H_
13ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBN_H_
14ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
15ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap#include <vector>
16ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap#include "webrtc/base/basictypes.h"
17ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
18ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
19ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
20ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchapnamespace webrtc {
21ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchapnamespace rtcp {
22ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
23ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap// Temporary Maximum Media Stream Bit Rate Notification (TMMBN) (RFC 5104).
24ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchapclass Tmmbn : public RtcpPacket {
25ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap public:
26ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  Tmmbn() : RtcpPacket() {
27ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap    memset(&tmmbn_, 0, sizeof(tmmbn_));
28ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  }
29ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
30ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  virtual ~Tmmbn() {}
31ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
32ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  void From(uint32_t ssrc) {
33ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap    tmmbn_.SenderSSRC = ssrc;
34ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  }
35ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  // Max 50 TMMBR can be added per TMMBN.
36ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  bool WithTmmbr(uint32_t ssrc, uint32_t bitrate_kbps, uint16_t overhead);
37ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
38ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap protected:
39ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  bool Create(uint8_t* packet,
40ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap              size_t* index,
41ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap              size_t max_length,
42ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap              RtcpPacket::PacketReadyCallback* callback) const override;
43ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
44ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap private:
45ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  static const int kMaxNumberOfTmmbrs = 50;
46ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
47ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  size_t BlockLength() const {
48ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap    const size_t kFciLen = 8;
49ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap    return kCommonFbFmtLength + kFciLen * tmmbn_items_.size();
50ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  }
51ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
52ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  RTCPUtility::RTCPPacketRTPFBTMMBN tmmbn_;
53ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  std::vector<RTCPUtility::RTCPPacketRTPFBTMMBRItem> tmmbn_items_;
54ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
55ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap  RTC_DISALLOW_COPY_AND_ASSIGN(Tmmbn);
56ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap};
57ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap
58ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap}  // namespace rtcp
59ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap}  // namespace webrtc
60ef3d805f6e50bc488f8e4e9e353068b78c73d17fdanilchap#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBN_H_
61