diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn index 0844d14815..4873a744cd 100644 --- a/modules/rtp_rtcp/BUILD.gn +++ b/modules/rtp_rtcp/BUILD.gn @@ -23,6 +23,7 @@ rtc_library("rtp_rtcp_format") { "include/rtp_header_extension_map.h", "include/rtp_rtcp_defines.h", "source/byte_io.h", + "source/corruption_detection_extension.h", "source/rtcp_packet.h", "source/rtcp_packet/app.h", "source/rtcp_packet/bye.h", @@ -63,6 +64,7 @@ rtc_library("rtp_rtcp_format") { sources = [ "include/report_block_data.cc", "include/rtp_rtcp_defines.cc", + "source/corruption_detection_extension.cc", "source/rtcp_packet.cc", "source/rtcp_packet/app.cc", "source/rtcp_packet/bye.cc", @@ -124,6 +126,7 @@ rtc_library("rtp_rtcp_format") { "../../api/units:timestamp", "../../api/video:video_layers_allocation", "../../api/video:video_rtp_headers", + "../../common_video:common_video", "../../rtc_base:bit_buffer", "../../rtc_base:bitstream_reader", "../../rtc_base:buffer", @@ -141,6 +144,7 @@ rtc_library("rtp_rtcp_format") { "../video_coding:codec_globals_headers", "//third_party/abseil-cpp/absl/algorithm:container", "//third_party/abseil-cpp/absl/base:core_headers", + "//third_party/abseil-cpp/absl/container:inlined_vector", "//third_party/abseil-cpp/absl/strings:string_view", "//third_party/abseil-cpp/absl/types:optional", "//third_party/abseil-cpp/absl/types:variant", @@ -524,21 +528,6 @@ rtc_library("rtp_packetizer_av1_test_helper") { ] } -rtc_library("corruption_detection_extension") { - visibility = [ "*" ] - sources = [ - "source/corruption_detection_extension.cc", - "source/corruption_detection_extension.h", - ] - deps = [ - ":rtp_rtcp_format", - "../../api:array_view", - "../../common_video:common_video", - "//third_party/abseil-cpp/absl/container:inlined_vector", - "//third_party/abseil-cpp/absl/strings:string_view", - ] -} - if (rtc_include_tests) { if (!build_with_chromium) { rtc_executable("test_packet_masks_metrics") { @@ -774,7 +763,7 @@ if (rtc_include_tests) { testonly = true sources = [ "source/corruption_detection_extension_unittest.cc" ] deps = [ - ":corruption_detection_extension", + ":rtp_rtcp_format", "../../common_video:common_video", "../../test:test_support", "//third_party/abseil-cpp/absl/types:optional", diff --git a/modules/rtp_rtcp/include/rtp_rtcp_defines.h b/modules/rtp_rtcp/include/rtp_rtcp_defines.h index 0ba93b0603..911a4eb2af 100644 --- a/modules/rtp_rtcp/include/rtp_rtcp_defines.h +++ b/modules/rtp_rtcp/include/rtp_rtcp_defines.h @@ -88,6 +88,7 @@ enum RTPExtensionType : int { kRtpExtensionDependencyDescriptor, kRtpExtensionColorSpace, kRtpExtensionVideoFrameTrackingId, + kRtpExtensionCorruptionDetection, kRtpExtensionNumberOfExtensions // Must be the last entity in the enum. }; diff --git a/modules/rtp_rtcp/source/corruption_detection_extension.cc b/modules/rtp_rtcp/source/corruption_detection_extension.cc index 8bfc050b88..614d0c9a5a 100644 --- a/modules/rtp_rtcp/source/corruption_detection_extension.cc +++ b/modules/rtp_rtcp/source/corruption_detection_extension.cc @@ -73,7 +73,7 @@ bool CorruptionDetectionExtension::Parse(rtc::ArrayView data, } if ((data.size() != kMandatoryPayloadBytes && data.size() <= kConfigurationBytes) || - data.size() > 16) { + data.size() > kMaxValueSizeBytes) { return false; } message->interpret_sequence_index_as_most_significant_bits_ = data[0] >> 7; @@ -93,7 +93,7 @@ bool CorruptionDetectionExtension::Parse(rtc::ArrayView data, bool CorruptionDetectionExtension::Write( rtc::ArrayView data, const CorruptionDetectionMessage& message) { - if (data.size() != ValueSize(message)) { + if (data.size() != ValueSize(message) || data.size() > kMaxValueSizeBytes) { return false; } diff --git a/modules/rtp_rtcp/source/corruption_detection_extension.h b/modules/rtp_rtcp/source/corruption_detection_extension.h index d77e91898f..66bde1af2b 100644 --- a/modules/rtp_rtcp/source/corruption_detection_extension.h +++ b/modules/rtp_rtcp/source/corruption_detection_extension.h @@ -31,8 +31,8 @@ class CorruptionDetectionExtension { public: using value_type = CorruptionDetectionMessage; - // TODO: b/358039777 - Change to our `RTPExtensionType` when available. - static constexpr RTPExtensionType kId = kRtpExtensionNumberOfExtensions; + static constexpr RTPExtensionType kId = kRtpExtensionCorruptionDetection; + static constexpr uint8_t kMaxValueSizeBytes = 16; static constexpr char kCorruptionDetectionUri[] = "http://www.webrtc.org/experiments/rtp-hdrext/corruption-detection"; diff --git a/modules/rtp_rtcp/source/rtp_header_extension_map.cc b/modules/rtp_rtcp/source/rtp_header_extension_map.cc index 3c828baab6..6b5ee607ef 100644 --- a/modules/rtp_rtcp/source/rtp_header_extension_map.cc +++ b/modules/rtp_rtcp/source/rtp_header_extension_map.cc @@ -16,6 +16,7 @@ #include "api/array_view.h" #include "api/rtp_parameters.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" +#include "modules/rtp_rtcp/source/corruption_detection_extension.h" #include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h" #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h" #include "modules/rtp_rtcp/source/rtp_header_extensions.h" @@ -58,6 +59,7 @@ constexpr ExtensionInfo kExtensions[] = { CreateExtensionInfo(), CreateExtensionInfo(), CreateExtensionInfo(), + CreateExtensionInfo(), }; // Because of kRtpExtensionNone, NumberOfExtension is 1 bigger than the actual diff --git a/modules/rtp_rtcp/source/rtp_packet.cc b/modules/rtp_rtcp/source/rtp_packet.cc index afa9568d7a..19372880b2 100644 --- a/modules/rtp_rtcp/source/rtp_packet.cc +++ b/modules/rtp_rtcp/source/rtp_packet.cc @@ -196,6 +196,7 @@ void RtpPacket::ZeroMutableExtensions() { case RTPExtensionType::kRtpExtensionCsrcAudioLevel: case RTPExtensionType::kRtpExtensionAbsoluteCaptureTime: case RTPExtensionType::kRtpExtensionColorSpace: + case RTPExtensionType::kRtpExtensionCorruptionDetection: case RTPExtensionType::kRtpExtensionGenericFrameDescriptor: case RTPExtensionType::kRtpExtensionDependencyDescriptor: case RTPExtensionType::kRtpExtensionMid: diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc index b64f8b3b4e..2abbfe5896 100644 --- a/modules/rtp_rtcp/source/rtp_sender.cc +++ b/modules/rtp_rtcp/source/rtp_sender.cc @@ -30,6 +30,7 @@ #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "modules/rtp_rtcp/source/byte_io.h" +#include "modules/rtp_rtcp/source/corruption_detection_extension.h" #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h" #include "modules/rtp_rtcp/source/rtp_header_extension_size.h" #include "modules/rtp_rtcp/source/rtp_header_extensions.h" @@ -89,6 +90,7 @@ constexpr RtpExtensionSize kVideoExtensionSizes[] = { CreateMaxExtensionSize(), CreateMaxExtensionSize(), CreateMaxExtensionSize(), + CreateMaxExtensionSize(), {RtpGenericFrameDescriptorExtension00::kId, RtpGenericFrameDescriptorExtension00::kMaxSizeBytes}, }; @@ -131,6 +133,7 @@ bool IsNonVolatile(RTPExtensionType type) { case kRtpExtensionVideoTiming: case kRtpExtensionColorSpace: case kRtpExtensionVideoFrameTrackingId: + case kRtpExtensionCorruptionDetection: return false; case kRtpExtensionNone: case kRtpExtensionNumberOfExtensions: diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn index 3c33ad75e3..68c4d11883 100644 --- a/test/fuzzers/BUILD.gn +++ b/test/fuzzers/BUILD.gn @@ -236,6 +236,7 @@ webrtc_fuzzer_test("rtcp_receiver_fuzzer") { webrtc_fuzzer_test("rtp_packet_fuzzer") { sources = [ "rtp_packet_fuzzer.cc" ] deps = [ + "../../common_video:common_video", "../../modules/rtp_rtcp:rtp_rtcp_format", "//third_party/abseil-cpp/absl/types:optional", ] diff --git a/test/fuzzers/rtp_packet_fuzzer.cc b/test/fuzzers/rtp_packet_fuzzer.cc index be4e9a3e85..5d7c31d965 100644 --- a/test/fuzzers/rtp_packet_fuzzer.cc +++ b/test/fuzzers/rtp_packet_fuzzer.cc @@ -12,7 +12,9 @@ #include #include "absl/types/optional.h" +#include "common_video/corruption_detection_message.h" #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" +#include "modules/rtp_rtcp/source/corruption_detection_extension.h" #include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h" #include "modules/rtp_rtcp/source/rtp_header_extensions.h" #include "modules/rtp_rtcp/source/rtp_packet_received.h" @@ -164,6 +166,11 @@ void FuzzOneInput(const uint8_t* data, size_t size) { // This extension requires state to read and so complicated that // deserves own fuzzer. break; + case kRtpExtensionCorruptionDetection: { + CorruptionDetectionMessage message; + packet.GetExtension(&message); + break; + } } }