1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #include <bitset> 12*d9f75844SAndroid Build Coastguard Worker #include <vector> 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 15*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" 16*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h" 17*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_header_extensions.h" 18*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_packet_received.h" 19*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_video_layers_allocation_extension.h" 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 22*d9f75844SAndroid Build Coastguard Worker // We decide which header extensions to register by reading four bytes 23*d9f75844SAndroid Build Coastguard Worker // from the beginning of `data` and interpreting it as a bitmask over 24*d9f75844SAndroid Build Coastguard Worker // the RTPExtensionType enum. This assert ensures four bytes are enough. 25*d9f75844SAndroid Build Coastguard Worker static_assert(kRtpExtensionNumberOfExtensions <= 32, 26*d9f75844SAndroid Build Coastguard Worker "Insufficient bits read to configure all header extensions. Add " 27*d9f75844SAndroid Build Coastguard Worker "an extra byte and update the switches."); 28*d9f75844SAndroid Build Coastguard Worker FuzzOneInput(const uint8_t * data,size_t size)29*d9f75844SAndroid Build Coastguard Workervoid FuzzOneInput(const uint8_t* data, size_t size) { 30*d9f75844SAndroid Build Coastguard Worker if (size <= 4) 31*d9f75844SAndroid Build Coastguard Worker return; 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker // Don't use the configuration byte as part of the packet. 34*d9f75844SAndroid Build Coastguard Worker std::bitset<32> extensionMask(*reinterpret_cast<const uint32_t*>(data)); 35*d9f75844SAndroid Build Coastguard Worker data += 4; 36*d9f75844SAndroid Build Coastguard Worker size -= 4; 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker RtpPacketReceived::ExtensionManager extensions(/*extmap_allow_mixed=*/true); 39*d9f75844SAndroid Build Coastguard Worker // Start at local_id = 1 since 0 is an invalid extension id. 40*d9f75844SAndroid Build Coastguard Worker int local_id = 1; 41*d9f75844SAndroid Build Coastguard Worker // Skip i = 0 since it maps to kRtpExtensionNone. 42*d9f75844SAndroid Build Coastguard Worker for (int i = 1; i < kRtpExtensionNumberOfExtensions; i++) { 43*d9f75844SAndroid Build Coastguard Worker RTPExtensionType extension_type = static_cast<RTPExtensionType>(i); 44*d9f75844SAndroid Build Coastguard Worker if (extensionMask[i]) { 45*d9f75844SAndroid Build Coastguard Worker // Extensions are registered with an ID, which you signal to the 46*d9f75844SAndroid Build Coastguard Worker // peer so they know what to expect. This code only cares about 47*d9f75844SAndroid Build Coastguard Worker // parsing so the value of the ID isn't relevant. 48*d9f75844SAndroid Build Coastguard Worker extensions.RegisterByType(local_id++, extension_type); 49*d9f75844SAndroid Build Coastguard Worker } 50*d9f75844SAndroid Build Coastguard Worker } 51*d9f75844SAndroid Build Coastguard Worker 52*d9f75844SAndroid Build Coastguard Worker RtpPacketReceived packet(&extensions); 53*d9f75844SAndroid Build Coastguard Worker packet.Parse(data, size); 54*d9f75844SAndroid Build Coastguard Worker 55*d9f75844SAndroid Build Coastguard Worker // Call packet accessors because they have extra checks. 56*d9f75844SAndroid Build Coastguard Worker packet.Marker(); 57*d9f75844SAndroid Build Coastguard Worker packet.PayloadType(); 58*d9f75844SAndroid Build Coastguard Worker packet.SequenceNumber(); 59*d9f75844SAndroid Build Coastguard Worker packet.Timestamp(); 60*d9f75844SAndroid Build Coastguard Worker packet.Ssrc(); 61*d9f75844SAndroid Build Coastguard Worker packet.Csrcs(); 62*d9f75844SAndroid Build Coastguard Worker 63*d9f75844SAndroid Build Coastguard Worker // Each extension has its own getter. It is supported behaviour to 64*d9f75844SAndroid Build Coastguard Worker // call GetExtension on an extension which was not registered, so we 65*d9f75844SAndroid Build Coastguard Worker // don't check the bitmask here. 66*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < kRtpExtensionNumberOfExtensions; i++) { 67*d9f75844SAndroid Build Coastguard Worker switch (static_cast<RTPExtensionType>(i)) { 68*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionNone: 69*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionNumberOfExtensions: 70*d9f75844SAndroid Build Coastguard Worker break; 71*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionTransmissionTimeOffset: 72*d9f75844SAndroid Build Coastguard Worker int32_t offset; 73*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<TransmissionOffset>(&offset); 74*d9f75844SAndroid Build Coastguard Worker break; 75*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionAudioLevel: 76*d9f75844SAndroid Build Coastguard Worker bool voice_activity; 77*d9f75844SAndroid Build Coastguard Worker uint8_t audio_level; 78*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<AudioLevel>(&voice_activity, &audio_level); 79*d9f75844SAndroid Build Coastguard Worker break; 80*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionCsrcAudioLevel: { 81*d9f75844SAndroid Build Coastguard Worker std::vector<uint8_t> audio_levels; 82*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<CsrcAudioLevel>(&audio_levels); 83*d9f75844SAndroid Build Coastguard Worker break; 84*d9f75844SAndroid Build Coastguard Worker } 85*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionAbsoluteSendTime: 86*d9f75844SAndroid Build Coastguard Worker uint32_t sendtime; 87*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<AbsoluteSendTime>(&sendtime); 88*d9f75844SAndroid Build Coastguard Worker break; 89*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionAbsoluteCaptureTime: { 90*d9f75844SAndroid Build Coastguard Worker AbsoluteCaptureTime extension; 91*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<AbsoluteCaptureTimeExtension>(&extension); 92*d9f75844SAndroid Build Coastguard Worker break; 93*d9f75844SAndroid Build Coastguard Worker } 94*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionVideoRotation: 95*d9f75844SAndroid Build Coastguard Worker uint8_t rotation; 96*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<VideoOrientation>(&rotation); 97*d9f75844SAndroid Build Coastguard Worker break; 98*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionTransportSequenceNumber: 99*d9f75844SAndroid Build Coastguard Worker uint16_t seqnum; 100*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<TransportSequenceNumber>(&seqnum); 101*d9f75844SAndroid Build Coastguard Worker break; 102*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionTransportSequenceNumber02: { 103*d9f75844SAndroid Build Coastguard Worker uint16_t seqnum; 104*d9f75844SAndroid Build Coastguard Worker absl::optional<FeedbackRequest> feedback_request; 105*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<TransportSequenceNumberV2>(&seqnum, 106*d9f75844SAndroid Build Coastguard Worker &feedback_request); 107*d9f75844SAndroid Build Coastguard Worker break; 108*d9f75844SAndroid Build Coastguard Worker } 109*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionPlayoutDelay: { 110*d9f75844SAndroid Build Coastguard Worker VideoPlayoutDelay playout; 111*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<PlayoutDelayLimits>(&playout); 112*d9f75844SAndroid Build Coastguard Worker break; 113*d9f75844SAndroid Build Coastguard Worker } 114*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionVideoContentType: 115*d9f75844SAndroid Build Coastguard Worker VideoContentType content_type; 116*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<VideoContentTypeExtension>(&content_type); 117*d9f75844SAndroid Build Coastguard Worker break; 118*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionVideoTiming: { 119*d9f75844SAndroid Build Coastguard Worker VideoSendTiming timing; 120*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<VideoTimingExtension>(&timing); 121*d9f75844SAndroid Build Coastguard Worker break; 122*d9f75844SAndroid Build Coastguard Worker } 123*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionRtpStreamId: { 124*d9f75844SAndroid Build Coastguard Worker std::string rsid; 125*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<RtpStreamId>(&rsid); 126*d9f75844SAndroid Build Coastguard Worker break; 127*d9f75844SAndroid Build Coastguard Worker } 128*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionRepairedRtpStreamId: { 129*d9f75844SAndroid Build Coastguard Worker std::string rsid; 130*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<RepairedRtpStreamId>(&rsid); 131*d9f75844SAndroid Build Coastguard Worker break; 132*d9f75844SAndroid Build Coastguard Worker } 133*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionMid: { 134*d9f75844SAndroid Build Coastguard Worker std::string mid; 135*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<RtpMid>(&mid); 136*d9f75844SAndroid Build Coastguard Worker break; 137*d9f75844SAndroid Build Coastguard Worker } 138*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionGenericFrameDescriptor00: { 139*d9f75844SAndroid Build Coastguard Worker RtpGenericFrameDescriptor descriptor; 140*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<RtpGenericFrameDescriptorExtension00>(&descriptor); 141*d9f75844SAndroid Build Coastguard Worker break; 142*d9f75844SAndroid Build Coastguard Worker } 143*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionColorSpace: { 144*d9f75844SAndroid Build Coastguard Worker ColorSpace color_space; 145*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<ColorSpaceExtension>(&color_space); 146*d9f75844SAndroid Build Coastguard Worker break; 147*d9f75844SAndroid Build Coastguard Worker } 148*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionInbandComfortNoise: { 149*d9f75844SAndroid Build Coastguard Worker absl::optional<uint8_t> noise_level; 150*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<InbandComfortNoiseExtension>(&noise_level); 151*d9f75844SAndroid Build Coastguard Worker break; 152*d9f75844SAndroid Build Coastguard Worker } 153*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionVideoLayersAllocation: { 154*d9f75844SAndroid Build Coastguard Worker VideoLayersAllocation allocation; 155*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<RtpVideoLayersAllocationExtension>(&allocation); 156*d9f75844SAndroid Build Coastguard Worker break; 157*d9f75844SAndroid Build Coastguard Worker } 158*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionVideoFrameTrackingId: { 159*d9f75844SAndroid Build Coastguard Worker uint16_t tracking_id; 160*d9f75844SAndroid Build Coastguard Worker packet.GetExtension<VideoFrameTrackingIdExtension>(&tracking_id); 161*d9f75844SAndroid Build Coastguard Worker break; 162*d9f75844SAndroid Build Coastguard Worker } 163*d9f75844SAndroid Build Coastguard Worker case kRtpExtensionGenericFrameDescriptor02: 164*d9f75844SAndroid Build Coastguard Worker // This extension requires state to read and so complicated that 165*d9f75844SAndroid Build Coastguard Worker // deserves own fuzzer. 166*d9f75844SAndroid Build Coastguard Worker break; 167*d9f75844SAndroid Build Coastguard Worker } 168*d9f75844SAndroid Build Coastguard Worker } 169*d9f75844SAndroid Build Coastguard Worker 170*d9f75844SAndroid Build Coastguard Worker // Check that zero-ing mutable extensions wouldn't cause any problems. 171*d9f75844SAndroid Build Coastguard Worker packet.ZeroMutableExtensions(); 172*d9f75844SAndroid Build Coastguard Worker } 173*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 174