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