blob: c2347cc8bdbeb85230b5acac3222eeaa1642f24c [file] [log] [blame]
danilchap1edb7ab2016-04-20 05:25:10 -07001/*
2 * Copyright (c) 2016 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 */
katrielc36a321d2016-07-05 07:20:24 -070010
Jonas Olsson941a07c2018-09-13 10:07:07 +020011#include <bitset>
12
Johannes Kron54047be2019-02-21 14:09:20 +000013#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Danil Chapovalov916ec7d2018-06-25 18:22:15 +020015#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
17#include "modules/rtp_rtcp/source/rtp_packet_received.h"
danilchap1edb7ab2016-04-20 05:25:10 -070018
19namespace webrtc {
Johannes Krond6c6f162019-02-21 09:33:14 +010020// We decide which header extensions to register by reading four bytes
katrielc36a321d2016-07-05 07:20:24 -070021// from the beginning of |data| and interpreting it as a bitmask over
Johannes Krond6c6f162019-02-21 09:33:14 +010022// the RTPExtensionType enum. This assert ensures four bytes are enough.
23static_assert(kRtpExtensionNumberOfExtensions <= 32,
katrielc36a321d2016-07-05 07:20:24 -070024 "Insufficient bits read to configure all header extensions. Add "
25 "an extra byte and update the switches.");
danilchap1edb7ab2016-04-20 05:25:10 -070026
katrielc36a321d2016-07-05 07:20:24 -070027void FuzzOneInput(const uint8_t* data, size_t size) {
Johannes Krond6c6f162019-02-21 09:33:14 +010028 if (size <= 4)
katrielc36a321d2016-07-05 07:20:24 -070029 return;
30
Johannes Krond6c6f162019-02-21 09:33:14 +010031 // Don't use the configuration byte as part of the packet.
32 std::bitset<32> extensionMask(*reinterpret_cast<const uint32_t*>(data));
33 data += 4;
34 size -= 4;
katrielc36a321d2016-07-05 07:20:24 -070035
Johannes Krond6c6f162019-02-21 09:33:14 +010036 RtpPacketReceived::ExtensionManager extensions(/*extmap_allow_mixed=*/true);
37 // Start at local_id = 1 since 0 is an invalid extension id.
38 int local_id = 1;
39 // Skip i = 0 since it maps to kRtpExtensionNone.
danilchapef8d7732017-04-19 02:59:48 -070040 for (int i = 1; i < kRtpExtensionNumberOfExtensions; i++) {
katrielc36a321d2016-07-05 07:20:24 -070041 RTPExtensionType extension_type = static_cast<RTPExtensionType>(i);
Johannes Krond6c6f162019-02-21 09:33:14 +010042 if (extensionMask[i]) {
katrielc36a321d2016-07-05 07:20:24 -070043 // Extensions are registered with an ID, which you signal to the
44 // peer so they know what to expect. This code only cares about
Johannes Krond6c6f162019-02-21 09:33:14 +010045 // parsing so the value of the ID isn't relevant.
46 extensions.RegisterByType(local_id++, extension_type);
katrielc36a321d2016-07-05 07:20:24 -070047 }
48 }
49
50 RtpPacketReceived packet(&extensions);
danilchap1edb7ab2016-04-20 05:25:10 -070051 packet.Parse(data, size);
52
53 // Call packet accessors because they have extra checks.
54 packet.Marker();
55 packet.PayloadType();
56 packet.SequenceNumber();
57 packet.Timestamp();
58 packet.Ssrc();
59 packet.Csrcs();
katrielc36a321d2016-07-05 07:20:24 -070060
61 // Each extension has its own getter. It is supported behaviour to
62 // call GetExtension on an extension which was not registered, so we
63 // don't check the bitmask here.
64 for (int i = 0; i < kRtpExtensionNumberOfExtensions; i++) {
65 switch (static_cast<RTPExtensionType>(i)) {
66 case kRtpExtensionNone:
67 case kRtpExtensionNumberOfExtensions:
68 break;
69 case kRtpExtensionTransmissionTimeOffset:
70 int32_t offset;
71 packet.GetExtension<TransmissionOffset>(&offset);
72 break;
73 case kRtpExtensionAudioLevel:
74 bool voice_activity;
75 uint8_t audio_level;
76 packet.GetExtension<AudioLevel>(&voice_activity, &audio_level);
77 break;
78 case kRtpExtensionAbsoluteSendTime:
79 uint32_t sendtime;
80 packet.GetExtension<AbsoluteSendTime>(&sendtime);
81 break;
Chen Xingcd8a6e22019-07-01 10:56:51 +020082 case kRtpExtensionAbsoluteCaptureTime: {
83 AbsoluteCaptureTime extension;
84 packet.GetExtension<AbsoluteCaptureTimeExtension>(&extension);
85 break;
86 }
katrielc36a321d2016-07-05 07:20:24 -070087 case kRtpExtensionVideoRotation:
88 uint8_t rotation;
89 packet.GetExtension<VideoOrientation>(&rotation);
90 break;
91 case kRtpExtensionTransportSequenceNumber:
92 uint16_t seqnum;
93 packet.GetExtension<TransportSequenceNumber>(&seqnum);
94 break;
Johannes Kron54047be2019-02-21 14:09:20 +000095 case kRtpExtensionTransportSequenceNumber02: {
96 uint16_t seqnum;
97 absl::optional<FeedbackRequest> feedback_request;
98 packet.GetExtension<TransportSequenceNumberV2>(&seqnum,
99 &feedback_request);
100 break;
101 }
katrielc36a321d2016-07-05 07:20:24 -0700102 case kRtpExtensionPlayoutDelay:
Danil Chapovalov08b03512016-09-07 15:08:13 +0200103 PlayoutDelay playout;
104 packet.GetExtension<PlayoutDelayLimits>(&playout);
katrielc36a321d2016-07-05 07:20:24 -0700105 break;
ilnik00d802b2017-04-11 10:34:31 -0700106 case kRtpExtensionVideoContentType:
107 VideoContentType content_type;
108 packet.GetExtension<VideoContentTypeExtension>(&content_type);
109 break;
ilnik04f4d122017-06-19 07:18:55 -0700110 case kRtpExtensionVideoTiming:
ilnik2edc6842017-07-06 03:06:50 -0700111 VideoSendTiming timing;
ilnik04f4d122017-06-19 07:18:55 -0700112 packet.GetExtension<VideoTimingExtension>(&timing);
113 break;
Johnny Leee0c8b232018-09-11 16:50:49 -0400114 case kRtpExtensionFrameMarking:
115 FrameMarking frame_marking;
116 packet.GetExtension<FrameMarkingExtension>(&frame_marking);
117 break;
danilchapef8d7732017-04-19 02:59:48 -0700118 case kRtpExtensionRtpStreamId: {
119 std::string rsid;
120 packet.GetExtension<RtpStreamId>(&rsid);
121 break;
122 }
123 case kRtpExtensionRepairedRtpStreamId: {
124 std::string rsid;
125 packet.GetExtension<RepairedRtpStreamId>(&rsid);
126 break;
127 }
Steve Antona3251dd2017-07-21 09:58:31 -0700128 case kRtpExtensionMid: {
129 std::string mid;
130 packet.GetExtension<RtpMid>(&mid);
131 break;
132 }
Elad Alonccb9b752019-02-19 13:01:31 +0100133 case kRtpExtensionGenericFrameDescriptor00: {
Danil Chapovalov916ec7d2018-06-25 18:22:15 +0200134 RtpGenericFrameDescriptor descriptor;
Elad Alonccb9b752019-02-19 13:01:31 +0100135 packet.GetExtension<RtpGenericFrameDescriptorExtension00>(&descriptor);
136 break;
137 }
138 case kRtpExtensionGenericFrameDescriptor01: {
139 RtpGenericFrameDescriptor descriptor;
140 packet.GetExtension<RtpGenericFrameDescriptorExtension01>(&descriptor);
Danil Chapovalov916ec7d2018-06-25 18:22:15 +0200141 break;
142 }
Johannes Kron09d65882018-11-27 14:36:41 +0100143 case kRtpExtensionColorSpace: {
144 ColorSpace color_space;
145 packet.GetExtension<ColorSpaceExtension>(&color_space);
Johannes Kronad1d9f02018-11-09 11:12:36 +0100146 break;
147 }
Danil Chapovalov52e52422019-06-27 16:45:40 +0200148 case kRtpExtensionGenericFrameDescriptor02:
149 // This extension requires state to read and so complicated that
150 // deserves own fuzzer.
151 break;
katrielc36a321d2016-07-05 07:20:24 -0700152 }
153 }
danilchap1edb7ab2016-04-20 05:25:10 -0700154}
danilchap1edb7ab2016-04-20 05:25:10 -0700155} // namespace webrtc