Add the corruption detection extension to RTPExtensionType

Bug: webrtc:358039777
Change-Id: Ib825593e5c37beb0cba3190c1d3bdcf1c9d957cf
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/360144
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Fanny Linderborg <linderborg@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42861}
This commit is contained in:
Fanny Linderborg 2024-08-22 13:39:58 +02:00 committed by WebRTC LUCI CQ
parent ad1775634f
commit fd6f4b4e51
9 changed files with 24 additions and 20 deletions

View File

@ -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",

View File

@ -88,6 +88,7 @@ enum RTPExtensionType : int {
kRtpExtensionDependencyDescriptor,
kRtpExtensionColorSpace,
kRtpExtensionVideoFrameTrackingId,
kRtpExtensionCorruptionDetection,
kRtpExtensionNumberOfExtensions // Must be the last entity in the enum.
};

View File

@ -73,7 +73,7 @@ bool CorruptionDetectionExtension::Parse(rtc::ArrayView<const uint8_t> 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<const uint8_t> data,
bool CorruptionDetectionExtension::Write(
rtc::ArrayView<uint8_t> data,
const CorruptionDetectionMessage& message) {
if (data.size() != ValueSize(message)) {
if (data.size() != ValueSize(message) || data.size() > kMaxValueSizeBytes) {
return false;
}

View File

@ -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";

View File

@ -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<ColorSpaceExtension>(),
CreateExtensionInfo<InbandComfortNoiseExtension>(),
CreateExtensionInfo<VideoFrameTrackingIdExtension>(),
CreateExtensionInfo<CorruptionDetectionExtension>(),
};
// Because of kRtpExtensionNone, NumberOfExtension is 1 bigger than the actual

View File

@ -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:

View File

@ -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<RtpStreamId>(),
CreateMaxExtensionSize<RepairedRtpStreamId>(),
CreateMaxExtensionSize<RtpMid>(),
CreateMaxExtensionSize<CorruptionDetectionExtension>(),
{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:

View File

@ -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",
]

View File

@ -12,7 +12,9 @@
#include <vector>
#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<CorruptionDetectionExtension>(&message);
break;
}
}
}