blob: c5fe14fb3d381788937d15ab0027d1b256c856b5 [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"
Mirko Bonadei3d255302018-10-11 10:50:45 +020015#include "rtc_base/system/rtc_export.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000016
Sergey Ulanovdc305db2016-01-14 17:14:54 -080017namespace rtc {
18struct PacketTimeUpdateParams;
19} // namespace rtc
20
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021namespace cricket {
22
23const size_t kMinRtpPacketLen = 12;
24const size_t kMaxRtpPacketLen = 2048;
25const size_t kMinRtcpPacketLen = 4;
26
27struct RtpHeader {
28 int payload_type;
29 int seq_num;
Peter Boström0c4e06b2015-10-07 12:23:21 +020030 uint32_t timestamp;
31 uint32_t ssrc;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000032};
33
34enum RtcpTypes {
Yves Gerey665174f2018-06-19 15:03:05 +020035 kRtcpTypeSR = 200, // Sender report payload type.
36 kRtcpTypeRR = 201, // Receiver report payload type.
37 kRtcpTypeSDES = 202, // SDES payload type.
38 kRtcpTypeBye = 203, // BYE payload type.
39 kRtcpTypeApp = 204, // APP payload type.
40 kRtcpTypeRTPFB = 205, // Transport layer Feedback message payload type.
41 kRtcpTypePSFB = 206, // Payload-specific Feedback message payload type.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000042};
43
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044bool GetRtpPayloadType(const void* data, size_t len, int* value);
45bool GetRtpSeqNum(const void* data, size_t len, int* value);
Peter Boström0c4e06b2015-10-07 12:23:21 +020046bool GetRtpTimestamp(const void* data, size_t len, uint32_t* value);
47bool GetRtpSsrc(const void* data, size_t len, uint32_t* value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000048bool GetRtpHeaderLen(const void* data, size_t len, size_t* value);
49bool GetRtcpType(const void* data, size_t len, int* value);
Peter Boström0c4e06b2015-10-07 12:23:21 +020050bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000051bool GetRtpHeader(const void* data, size_t len, RtpHeader* header);
52
Peter Boström0c4e06b2015-10-07 12:23:21 +020053bool SetRtpSsrc(void* data, size_t len, uint32_t value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054// Assumes version 2, no padding, no extensions, no csrcs.
55bool SetRtpHeader(void* data, size_t len, const RtpHeader& header);
56
buildbot@webrtc.org1ef789d2014-06-19 23:54:12 +000057bool IsRtpPacket(const void* data, size_t len);
pkasting@chromium.orge9facf82015-02-17 20:36:28 +000058
Zhi Huang365381f2018-04-13 16:44:34 -070059bool IsRtcpPacket(const char* data, size_t len);
pkasting@chromium.orge9facf82015-02-17 20:36:28 +000060// True if |payload type| is 0-127.
61bool IsValidRtpPayloadType(int payload_type);
62
zstein3dcf0e92017-06-01 13:22:42 -070063// True if |size| is appropriate for the indicated packet type.
64bool IsValidRtpRtcpPacketSize(bool rtcp, size_t size);
65
66// TODO(zstein): Consider using an enum instead of a bool to differentiate
67// between RTP and RTCP.
68// Returns "RTCP" or "RTP" according to |rtcp|.
69const char* RtpRtcpStringLiteral(bool rtcp);
70
Sergey Ulanovdc305db2016-01-14 17:14:54 -080071// Verifies that a packet has a valid RTP header.
Mirko Bonadei3d255302018-10-11 10:50:45 +020072bool RTC_EXPORT ValidateRtpHeader(const uint8_t* rtp,
73 size_t length,
74 size_t* header_length);
Sergey Ulanovdc305db2016-01-14 17:14:54 -080075
76// Helper method which updates the absolute send time extension if present.
77bool UpdateRtpAbsSendTimeExtension(uint8_t* rtp,
78 size_t length,
79 int extension_id,
80 uint64_t time_us);
81
82// Applies specified |options| to the packet. It updates the absolute send time
83// extension header if it is present present then updates HMAC.
Mirko Bonadei3d255302018-10-11 10:50:45 +020084bool RTC_EXPORT
85ApplyPacketOptions(uint8_t* data,
86 size_t length,
87 const rtc::PacketTimeUpdateParams& packet_time_params,
88 uint64_t time_us);
Sergey Ulanovdc305db2016-01-14 17:14:54 -080089
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090} // namespace cricket
91
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020092#endif // MEDIA_BASE_RTPUTILS_H_