diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn index a15e5f0a03..e36fbb6c07 100644 --- a/test/fuzzers/BUILD.gn +++ b/test/fuzzers/BUILD.gn @@ -28,6 +28,7 @@ rtc_library("webrtc_fuzzer_main") { } rtc_library("fuzz_data_helper") { + testonly = true sources = [ "fuzz_data_helper.cc", "fuzz_data_helper.h", @@ -228,6 +229,7 @@ webrtc_fuzzer_test("congestion_controller_feedback_fuzzer") { } rtc_library("audio_decoder_fuzzer") { + testonly = true sources = [ "audio_decoder_fuzzer.cc", "audio_decoder_fuzzer.h", @@ -290,13 +292,27 @@ webrtc_fuzzer_test("audio_decoder_multiopus_fuzzer") { ] } +rtc_library("audio_encoder_fuzzer") { + testonly = true + sources = [ + "audio_encoder_fuzzer.cc", + "audio_encoder_fuzzer.h", + ] + deps = [ + ":fuzz_data_helper", + "../../api:array_view", + "../../api/audio_codecs:audio_codecs_api", + "../../rtc_base:checks", + "../../rtc_base:rtc_base_approved", + ] +} + webrtc_fuzzer_test("audio_encoder_opus_fuzzer") { sources = [ "audio_encoder_opus_fuzzer.cc" ] deps = [ - "../../api:array_view", + ":audio_encoder_fuzzer", "../../api/audio_codecs/opus:audio_encoder_opus", "../../rtc_base:checks", - "../../rtc_base:rtc_base_approved", ] } @@ -391,6 +407,7 @@ webrtc_fuzzer_test("pseudotcp_parser_fuzzer") { } rtc_library("audio_processing_fuzzer_helper") { + testonly = true sources = [ "audio_processing_fuzzer_helper.cc", "audio_processing_fuzzer_helper.h", diff --git a/test/fuzzers/audio_encoder_fuzzer.cc b/test/fuzzers/audio_encoder_fuzzer.cc new file mode 100644 index 0000000000..54def44480 --- /dev/null +++ b/test/fuzzers/audio_encoder_fuzzer.cc @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "test/fuzzers/audio_encoder_fuzzer.h" + +#include + +#include "rtc_base/buffer.h" +#include "rtc_base/checks.h" +#include "test/fuzzers/fuzz_data_helper.h" + +namespace webrtc { + +// This function reads bytes from |data_view|, interprets them as RTP timestamp +// and input samples, and sends them for encoding. The process continues until +// no more data is available. +void FuzzAudioEncoder(rtc::ArrayView data_view, + std::unique_ptr encoder) { + test::FuzzDataHelper data(data_view); + const size_t block_size_samples = + encoder->SampleRateHz() / 100 * encoder->NumChannels(); + const size_t block_size_bytes = block_size_samples * sizeof(int16_t); + if (data_view.size() / block_size_bytes > 1000) { + // If the size of the fuzzer data is more than 1000 input blocks (i.e., more + // than 10 seconds), then don't fuzz at all for the fear of timing out. + return; + } + + rtc::BufferT input_aligned(block_size_samples); + rtc::Buffer encoded; + + // Each round in the loop below will need one block of samples + a 32-bit + // timestamp from the fuzzer input. + const size_t bytes_to_read = block_size_bytes + sizeof(uint32_t); + while (data.CanReadBytes(bytes_to_read)) { + const uint32_t timestamp = data.Read(); + auto byte_array = data.ReadByteArray(block_size_bytes); + // Align the data by copying to another array. + RTC_DCHECK_EQ(input_aligned.size() * sizeof(int16_t), + byte_array.size() * sizeof(uint8_t)); + memcpy(input_aligned.data(), byte_array.data(), byte_array.size()); + auto info = encoder->Encode(timestamp, input_aligned, &encoded); + } +} + +} // namespace webrtc diff --git a/test/fuzzers/audio_encoder_fuzzer.h b/test/fuzzers/audio_encoder_fuzzer.h new file mode 100644 index 0000000000..0c879df4d3 --- /dev/null +++ b/test/fuzzers/audio_encoder_fuzzer.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef TEST_FUZZERS_AUDIO_ENCODER_FUZZER_H_ +#define TEST_FUZZERS_AUDIO_ENCODER_FUZZER_H_ + +#include + +#include "api/array_view.h" +#include "api/audio_codecs/audio_encoder.h" + +namespace webrtc { + +void FuzzAudioEncoder(rtc::ArrayView data_view, + std::unique_ptr encoder); + +} // namespace webrtc + +#endif // TEST_FUZZERS_AUDIO_ENCODER_FUZZER_H_ diff --git a/test/fuzzers/audio_encoder_opus_fuzzer.cc b/test/fuzzers/audio_encoder_opus_fuzzer.cc index 50c285616b..d67e6d6067 100644 --- a/test/fuzzers/audio_encoder_opus_fuzzer.cc +++ b/test/fuzzers/audio_encoder_opus_fuzzer.cc @@ -8,57 +8,20 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "api/array_view.h" #include "api/audio_codecs/opus/audio_encoder_opus.h" -#include "rtc_base/buffer.h" #include "rtc_base/checks.h" -#include "test/fuzzers/fuzz_data_helper.h" +#include "test/fuzzers/audio_encoder_fuzzer.h" namespace webrtc { -namespace { - -// This function reads bytes from |data_view|, interprets them -// as RTP timestamp and input samples, and sends them for encoding. The process -// continues until no more data is available. -void FuzzAudioEncoder(rtc::ArrayView data_view, - AudioEncoder* encoder) { - test::FuzzDataHelper data(data_view); - const size_t block_size_samples = - encoder->SampleRateHz() / 100 * encoder->NumChannels(); - const size_t block_size_bytes = block_size_samples * sizeof(int16_t); - if (data_view.size() / block_size_bytes > 1000) { - // If the size of the fuzzer data is more than 1000 input blocks (i.e., more - // than 10 seconds), then don't fuzz at all for the fear of timing out. - return; - } - - rtc::BufferT input_aligned(block_size_samples); - rtc::Buffer encoded; - - // Each round in the loop below will need one block of samples + a 32-bit - // timestamp from the fuzzer input. - const size_t bytes_to_read = block_size_bytes + sizeof(uint32_t); - while (data.CanReadBytes(bytes_to_read)) { - const uint32_t timestamp = data.Read(); - auto byte_array = data.ReadByteArray(block_size_bytes); - // Align the data by copying to another array. - RTC_DCHECK_EQ(input_aligned.size() * sizeof(int16_t), - byte_array.size() * sizeof(uint8_t)); - memcpy(input_aligned.data(), byte_array.data(), byte_array.size()); - auto info = encoder->Encode(timestamp, input_aligned, &encoded); - } -} - -} // namespace void FuzzOneInput(const uint8_t* data, size_t size) { AudioEncoderOpus::Config config; config.frame_size_ms = 20; RTC_CHECK(config.IsOk()); constexpr int kPayloadType = 100; - std::unique_ptr enc = - AudioEncoderOpus::MakeAudioEncoder(config, kPayloadType); - FuzzAudioEncoder(rtc::ArrayView(data, size), enc.get()); + FuzzAudioEncoder( + /*data_view=*/{data, size}, + /*encoder=*/AudioEncoderOpus::MakeAudioEncoder(config, kPayloadType)); } } // namespace webrtc