blob: 9ef9f9c7ba7d9c003bc86ff47a36b212be8c8738 [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
Steve Anton10542f22019-01-11 09:11:00 -080011#ifndef MEDIA_BASE_RTP_UTILS_H_
12#define MEDIA_BASE_RTP_UTILS_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
Amit Hilbuchedd20542019-03-18 12:33:43 -070014#include "absl/strings/string_view.h"
15#include "api/array_view.h"
Steve Anton10542f22019-01-11 09:11:00 -080016#include "rtc_base/byte_order.h"
Mirko Bonadei3d255302018-10-11 10:50:45 +020017#include "rtc_base/system/rtc_export.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000018
Sergey Ulanovdc305db2016-01-14 17:14:54 -080019namespace rtc {
20struct PacketTimeUpdateParams;
21} // namespace rtc
22
henrike@webrtc.org28e20752013-07-10 00:45:36 +000023namespace cricket {
24
25const size_t kMinRtpPacketLen = 12;
26const size_t kMaxRtpPacketLen = 2048;
27const size_t kMinRtcpPacketLen = 4;
28
29struct RtpHeader {
30 int payload_type;
31 int seq_num;
Peter Boström0c4e06b2015-10-07 12:23:21 +020032 uint32_t timestamp;
33 uint32_t ssrc;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000034};
35
36enum RtcpTypes {
Yves Gerey665174f2018-06-19 15:03:05 +020037 kRtcpTypeSR = 200, // Sender report payload type.
38 kRtcpTypeRR = 201, // Receiver report payload type.
39 kRtcpTypeSDES = 202, // SDES payload type.
40 kRtcpTypeBye = 203, // BYE payload type.
41 kRtcpTypeApp = 204, // APP payload type.
42 kRtcpTypeRTPFB = 205, // Transport layer Feedback message payload type.
43 kRtcpTypePSFB = 206, // Payload-specific Feedback message payload type.
henrike@webrtc.org28e20752013-07-10 00:45:36 +000044};
45
Amit Hilbuchedd20542019-03-18 12:33:43 -070046enum class RtpPacketType {
47 kRtp,
48 kRtcp,
49 kUnknown,
50};
51
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052bool GetRtpPayloadType(const void* data, size_t len, int* value);
53bool GetRtpSeqNum(const void* data, size_t len, int* value);
Peter Boström0c4e06b2015-10-07 12:23:21 +020054bool GetRtpTimestamp(const void* data, size_t len, uint32_t* value);
55bool GetRtpSsrc(const void* data, size_t len, uint32_t* value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000056bool GetRtpHeaderLen(const void* data, size_t len, size_t* value);
57bool GetRtcpType(const void* data, size_t len, int* value);
Peter Boström0c4e06b2015-10-07 12:23:21 +020058bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000059bool GetRtpHeader(const void* data, size_t len, RtpHeader* header);
60
Peter Boström0c4e06b2015-10-07 12:23:21 +020061bool SetRtpSsrc(void* data, size_t len, uint32_t value);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062// Assumes version 2, no padding, no extensions, no csrcs.
63bool SetRtpHeader(void* data, size_t len, const RtpHeader& header);
64
Amit Hilbuchedd20542019-03-18 12:33:43 -070065bool IsRtpPacket(rtc::ArrayView<const char> packet);
pkasting@chromium.orge9facf82015-02-17 20:36:28 +000066
Amit Hilbuchedd20542019-03-18 12:33:43 -070067bool IsRtcpPacket(rtc::ArrayView<const char> packet);
68// Checks the packet header to determine if it can be an RTP or RTCP packet.
69RtpPacketType InferRtpPacketType(rtc::ArrayView<const char> packet);
pkasting@chromium.orge9facf82015-02-17 20:36:28 +000070// True if |payload type| is 0-127.
71bool IsValidRtpPayloadType(int payload_type);
72
zstein3dcf0e92017-06-01 13:22:42 -070073// True if |size| is appropriate for the indicated packet type.
Amit Hilbuchedd20542019-03-18 12:33:43 -070074bool IsValidRtpPacketSize(RtpPacketType packet_type, size_t size);
zstein3dcf0e92017-06-01 13:22:42 -070075
Amit Hilbuchedd20542019-03-18 12:33:43 -070076// Returns "RTCP", "RTP" or "Unknown" according to |packet_type|.
77absl::string_view RtpPacketTypeToString(RtpPacketType packet_type);
zstein3dcf0e92017-06-01 13:22:42 -070078
Sergey Ulanovdc305db2016-01-14 17:14:54 -080079// Verifies that a packet has a valid RTP header.
Mirko Bonadei3d255302018-10-11 10:50:45 +020080bool RTC_EXPORT ValidateRtpHeader(const uint8_t* rtp,
81 size_t length,
82 size_t* header_length);
Sergey Ulanovdc305db2016-01-14 17:14:54 -080083
84// Helper method which updates the absolute send time extension if present.
85bool UpdateRtpAbsSendTimeExtension(uint8_t* rtp,
86 size_t length,
87 int extension_id,
88 uint64_t time_us);
89
90// Applies specified |options| to the packet. It updates the absolute send time
91// extension header if it is present present then updates HMAC.
Mirko Bonadei3d255302018-10-11 10:50:45 +020092bool RTC_EXPORT
93ApplyPacketOptions(uint8_t* data,
94 size_t length,
95 const rtc::PacketTimeUpdateParams& packet_time_params,
96 uint64_t time_us);
Sergey Ulanovdc305db2016-01-14 17:14:54 -080097
henrike@webrtc.org28e20752013-07-10 00:45:36 +000098} // namespace cricket
99
Steve Anton10542f22019-01-11 09:11:00 -0800100#endif // MEDIA_BASE_RTP_UTILS_H_