| Index: webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cd9a16b7dcc57451fee9a3eba6b23a7f6e0c2d95
|
| --- /dev/null
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.cc
|
| @@ -0,0 +1,62 @@
|
| +/*
|
| + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
|
| +
|
| +#include "webrtc/base/checks.h"
|
| +#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
|
| +
|
| +namespace webrtc {
|
| +namespace rtcp {
|
| +TmmbItem::TmmbItem(uint32_t ssrc, uint32_t bitrate_bps, uint16_t overhead)
|
| + : ssrc_(ssrc), bitrate_bps_(bitrate_bps), packet_overhead_(overhead) {
|
| + RTC_DCHECK_LE(overhead, 0x1ffu);
|
| +}
|
| +
|
| +// 0 1 2 3
|
| +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
| +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| +// 0 | SSRC |
|
| +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| +// 4 | MxTBR Exp | MxTBR Mantissa |Measured Overhead|
|
| +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
| +void TmmbItem::Parse(const uint8_t* buffer) {
|
| + ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[0]);
|
| + // Read 4 bytes into 1 block.
|
| + uint32_t compact = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]);
|
| + // Split 1 block into 3 components.
|
| + uint8_t exponent = compact >> 26; // 6 bits.
|
| + uint32_t mantissa = (compact >> 9) & 0x1ffff; // 17 bits.
|
| + uint16_t overhead = compact & 0x1ff; // 9 bits.
|
| + // Combine 3 components into 2 values.
|
| + bitrate_bps_ = (mantissa << exponent);
|
| + packet_overhead_ = overhead;
|
| +}
|
| +
|
| +void TmmbItem::Create(uint8_t* buffer) const {
|
| + const uint32_t kMaxMantissa = 0x1ffff; // 17 bits.
|
| + uint32_t mantissa = bitrate_bps_;
|
| + uint32_t exponent = 0;
|
| + while (mantissa > kMaxMantissa) {
|
| + mantissa >>= 1;
|
| + ++exponent;
|
| + }
|
| +
|
| + ByteWriter<uint32_t>::WriteBigEndian(&buffer[0], ssrc_);
|
| + uint32_t compact = (exponent << 26) | (mantissa << 9) | packet_overhead_;
|
| + ByteWriter<uint32_t>::WriteBigEndian(&buffer[4], compact);
|
| +}
|
| +
|
| +void TmmbItem::set_packet_overhead(uint16_t overhead) {
|
| + RTC_DCHECK_LE(overhead, 0x1ffu);
|
| + packet_overhead_ = overhead;
|
| +}
|
| +} // namespace rtcp
|
| +} // namespace webrtc
|
|
|