blob: 5258c0be264186e078a2589e91cc6cb8d209e1bd [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MEDIA_BASE_RTPUTILS_H_
12#define MEDIA_BASE_RTPUTILS_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "rtc_base/byteorder.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015
Sergey Ulanovdc305db2016-01-14 17:14:54 -080016namespace rtc {
17struct PacketTimeUpdateParams;
18} // namespace rtc
19
henrike@webrtc.org28e20752013-07-10 00:45:36 +000020namespace cricket {
21
22const size_t kMinRtpPacketLen = 12;
23const size_t kMaxRtpPacketLen = 2048;
24const size_t kMinRtcpPacketLen = 4;
25
26struct RtpHeader {
27 int payload_type;
28 int seq_num;
Peter Boström0c4e06b2015-10-07 12:23:21 +020029 uint32_t timestamp;
30 uint32_t ssrc;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000031};
32
33enum RtcpTypes {
34 kRtcpTypeSR = 200, // Sender report payload type.
35 kRtcpTypeRR = 201, // Receiver report payload type.
36 kRtcpTypeSDES = 202, // SDES payload type.
37 kRtcpTypeBye = 203, // BYE payload type.
38 kRtcpTypeApp = 204, // APP payload type.
39 kRtcpTypeRTPFB = 205, // Transport layer Feedback message payload type.
40 kRtcpTypePSFB = 206, // Payload-specific Feedback message payload type.
41};
42
henrike@webrtc.org28e20752013-07-10 00:45:36 +000043bool GetRtpPayloadType(const void* data, size_t len, int* value);
44bool GetRtpSeqNum(const void* data, size_t len, int* value);
Peter Boström0c4e06b2015-10-07 12:23:21 +020045bool GetRtpTimestamp(const void* data, size_t len, uint32_t* value);
46bool GetRtpSsrc(const void* data, size_t len, uint32_t* value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047bool GetRtpHeaderLen(const void* data, size_t len, size_t* value);
48bool GetRtcpType(const void* data, size_t len, int* value);
Peter Boström0c4e06b2015-10-07 12:23:21 +020049bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050bool GetRtpHeader(const void* data, size_t len, RtpHeader* header);
51
Peter Boström0c4e06b2015-10-07 12:23:21 +020052bool SetRtpSsrc(void* data, size_t len, uint32_t value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000053// Assumes version 2, no padding, no extensions, no csrcs.
54bool SetRtpHeader(void* data, size_t len, const RtpHeader& header);
55
buildbot@webrtc.org1ef789d2014-06-19 23:54:12 +000056bool IsRtpPacket(const void* data, size_t len);
pkasting@chromium.orge9facf82015-02-17 20:36:28 +000057
Zhi Huang365381f2018-04-13 16:44:34 -070058bool IsRtcpPacket(const char* data, size_t len);
pkasting@chromium.orge9facf82015-02-17 20:36:28 +000059// True if |payload type| is 0-127.
60bool IsValidRtpPayloadType(int payload_type);
61
zstein3dcf0e92017-06-01 13:22:42 -070062// True if |size| is appropriate for the indicated packet type.
63bool IsValidRtpRtcpPacketSize(bool rtcp, size_t size);
64
65// TODO(zstein): Consider using an enum instead of a bool to differentiate
66// between RTP and RTCP.
67// Returns "RTCP" or "RTP" according to |rtcp|.
68const char* RtpRtcpStringLiteral(bool rtcp);
69
Sergey Ulanovdc305db2016-01-14 17:14:54 -080070// Verifies that a packet has a valid RTP header.
71bool ValidateRtpHeader(const uint8_t* rtp,
72 size_t length,
73 size_t* header_length);
74
75// Helper method which updates the absolute send time extension if present.
76bool UpdateRtpAbsSendTimeExtension(uint8_t* rtp,
77 size_t length,
78 int extension_id,
79 uint64_t time_us);
80
81// Applies specified |options| to the packet. It updates the absolute send time
82// extension header if it is present present then updates HMAC.
83bool ApplyPacketOptions(uint8_t* data,
84 size_t length,
85 const rtc::PacketTimeUpdateParams& packet_time_params,
86 uint64_t time_us);
87
88
henrike@webrtc.org28e20752013-07-10 00:45:36 +000089} // namespace cricket
90
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020091#endif // MEDIA_BASE_RTPUTILS_H_