/*
 *  Copyright (c) 2019 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 <cstddef>
#include <cstdint>
#include <memory>
#include <vector>

#include "api/audio_codecs/opus/audio_decoder_multi_channel_opus.h"
#include "api/audio_codecs/opus/audio_decoder_multi_channel_opus_config.h"
#include "rtc_base/checks.h"
#include "test/fuzzers/audio_decoder_fuzzer.h"
#include "test/fuzzers/fuzz_data_helper.h"

namespace webrtc {

AudioDecoderMultiChannelOpusConfig MakeDecoderConfig(
    int num_channels,
    int num_streams,
    int coupled_streams,
    std::vector<unsigned char> channel_mapping) {
  AudioDecoderMultiChannelOpusConfig config;
  config.num_channels = num_channels;
  config.num_streams = num_streams;
  config.coupled_streams = coupled_streams;
  config.channel_mapping = channel_mapping;
  return config;
}

void FuzzOneInput(FuzzDataHelper fuzz_data) {
  const AudioDecoderMultiChannelOpusConfig kSurroundConfigs[] = {
      MakeDecoderConfig(1, 1, 0, {0}),  // Mono

      MakeDecoderConfig(2, 2, 0, {0, 0}),  // Copy the first (of
                                           // 2) decoded streams
                                           // into both output
                                           // channel 0 and output
                                           // channel 1. Ignore
                                           // the 2nd decoded
                                           // stream.

      MakeDecoderConfig(4, 2, 2, {0, 1, 2, 3}),             // Quad.
      MakeDecoderConfig(6, 4, 2, {0, 4, 1, 2, 3, 5}),       // 5.1
      MakeDecoderConfig(8, 5, 3, {0, 6, 1, 2, 3, 4, 5, 7})  // 7.1
  };

  const auto config = fuzz_data.SelectOneOf(kSurroundConfigs);

  RTC_CHECK(config.IsOk());
  std::unique_ptr<AudioDecoder> dec =
      AudioDecoderMultiChannelOpus::MakeAudioDecoder(std::move(config));
  RTC_CHECK(dec);
  const int kSampleRateHz = 48000;
  const size_t kAllocatedOuputSizeSamples =
      4 * kSampleRateHz / 10;  // 4x100 ms, 4 times the size of the output array
                               // for the stereo Opus codec. It should be enough
                               // for 8 channels.
  int16_t output[kAllocatedOuputSizeSamples];
  FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, fuzz_data, dec.get(),
                   kSampleRateHz, sizeof(output), output);
}
}  // namespace webrtc
