blob: a2d99e7143152593d28823c1b4d9589a21e6cb4c [file] [log] [blame]
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +00001/*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
12
Henrik Kjellanderdca1e092017-07-01 16:42:22 +020013#include "webrtc/base/checks.h"
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000014
15namespace webrtc {
16namespace rtcp {
danilchapc1f40b72016-10-17 01:44:44 -070017constexpr size_t RtcpPacket::kHeaderLength;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000018
danilchap69e59e62016-02-17 03:11:42 -080019rtc::Buffer RtcpPacket::Build() const {
danilchapc1f40b72016-10-17 01:44:44 -070020 rtc::Buffer packet(BlockLength());
21
asapersson@webrtc.org4b12d402014-06-16 14:09:28 +000022 size_t length = 0;
danilchapc1f40b72016-10-17 01:44:44 -070023 bool created = Create(packet.data(), &length, packet.capacity(), nullptr);
24 RTC_DCHECK(created) << "Invalid packet is not supported.";
25 RTC_DCHECK_EQ(length, packet.size())
26 << "BlockLength mispredicted size used by Create";
Erik Språngc1b9d4e2015-06-08 09:54:14 +020027
Erik Språngc1b9d4e2015-06-08 09:54:14 +020028 return packet;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000029}
30
Erik Språngc1b9d4e2015-06-08 09:54:14 +020031bool RtcpPacket::BuildExternalBuffer(uint8_t* buffer,
32 size_t max_length,
33 PacketReadyCallback* callback) const {
34 size_t index = 0;
danilchap7a4116a2016-03-14 08:19:28 -070035 if (!Create(buffer, &index, max_length, callback))
Erik Språngc1b9d4e2015-06-08 09:54:14 +020036 return false;
37 return OnBufferFull(buffer, &index, callback);
38}
39
Erik Språngc1b9d4e2015-06-08 09:54:14 +020040bool RtcpPacket::OnBufferFull(uint8_t* packet,
41 size_t* index,
danilchapc1f40b72016-10-17 01:44:44 -070042 PacketReadyCallback* callback) const {
Erik Språngc1b9d4e2015-06-08 09:54:14 +020043 if (*index == 0)
44 return false;
danilchapc1f40b72016-10-17 01:44:44 -070045 RTC_DCHECK(callback) << "Fragmentation not supported.";
Erik Språngc1b9d4e2015-06-08 09:54:14 +020046 callback->OnPacketReady(packet, *index);
47 *index = 0;
48 return true;
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000049}
50
Erik Språnga3b87692015-07-29 10:46:54 +020051size_t RtcpPacket::HeaderLength() const {
52 size_t length_in_bytes = BlockLength();
kwibergaf476c72016-11-28 15:21:39 -080053 RTC_DCHECK_GT(length_in_bytes, 0);
54 RTC_DCHECK_EQ(length_in_bytes % 4, 0) << "Padding not supported";
danilchapc1f40b72016-10-17 01:44:44 -070055 // Length in 32-bit words without common header.
56 return (length_in_bytes - kHeaderLength) / 4;
Erik Språnga3b87692015-07-29 10:46:54 +020057}
58
59// From RFC 3550, RTP: A Transport Protocol for Real-Time Applications.
60//
61// RTP header format.
62// 0 1 2 3
63// 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
64// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
65// |V=2|P| RC/FMT | PT | length |
66// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Erik Språnga3b87692015-07-29 10:46:54 +020067void RtcpPacket::CreateHeader(
68 uint8_t count_or_format, // Depends on packet type.
69 uint8_t packet_type,
70 size_t length,
71 uint8_t* buffer,
sprang73a93e82015-09-14 12:50:39 -070072 size_t* pos) {
danilchapc1f40b72016-10-17 01:44:44 -070073 RTC_DCHECK_LE(length, 0xffffU);
74 RTC_DCHECK_LE(count_or_format, 0x1f);
75 constexpr uint8_t kVersionBits = 2 << 6;
76 constexpr uint8_t kNoPaddingBit = 0 << 5;
77 buffer[*pos + 0] = kVersionBits | kNoPaddingBit | count_or_format;
78 buffer[*pos + 1] = packet_type;
79 buffer[*pos + 2] = (length >> 8) & 0xff;
80 buffer[*pos + 3] = length & 0xff;
81 *pos += kHeaderLength;
Erik Språnga3b87692015-07-29 10:46:54 +020082}
83
asapersson@webrtc.org0f2809a2014-02-21 08:14:45 +000084} // namespace rtcp
85} // namespace webrtc