| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include <fuzzer/FuzzedDataProvider.h> |
| |
| #include "components/speech/audio_encoder.h" |
| |
| // Copied from speech_recognition_engine.cc. |
| const int kDefaultConfigSampleRate = 8000; |
| const int kDefaultConfigBitsPerSample = 16; |
| const int kAudioSampleRate = 16000; |
| const int kAudioPacketIntervalMs = 100; |
| |
| const int kDefaultConfigBytesPerSample = kDefaultConfigBitsPerSample / 8; |
| |
| extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { |
| FuzzedDataProvider provider(data, size); |
| AudioEncoder encoder(kDefaultConfigSampleRate, kDefaultConfigBitsPerSample); |
| |
| while (provider.remaining_bytes()) { |
| std::string chunk_str = |
| provider.ConsumeRandomLengthString(provider.remaining_bytes()); |
| if (chunk_str.size() % kDefaultConfigBytesPerSample) { |
| // `AudioChunk` expects the data size to be divisible by sample size. |
| continue; |
| } |
| scoped_refptr<AudioChunk> chunk = |
| new AudioChunk(reinterpret_cast<const uint8_t*>(chunk_str.data()), |
| chunk_str.size(), kDefaultConfigBytesPerSample); |
| encoder.Encode(*chunk); |
| } |
| |
| size_t sample_count = kAudioSampleRate * kAudioPacketIntervalMs / 1000; |
| scoped_refptr<AudioChunk> dummy_chunk = new AudioChunk( |
| sample_count * sizeof(int16_t), kDefaultConfigBytesPerSample); |
| encoder.Encode(*dummy_chunk.get()); |
| encoder.Flush(); |
| scoped_refptr<AudioChunk> encoded_data(encoder.GetEncodedDataAndClear()); |
| encoded_data->AsString(); |
| encoder.GetMimeType(); |
| encoder.GetBitsPerSample(); |
| return 0; |
| } |