/*
 *  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"

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(const uint8_t* data, size_t size) {
  const std::vector<AudioDecoderMultiChannelOpusConfig> surround_configs = {
      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 = surround_configs[data[0] % surround_configs.size()];
  RTC_CHECK(config.IsOk());
  std::unique_ptr<AudioDecoder> dec =
      AudioDecoderMultiChannelOpus::MakeAudioDecoder(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, data, size, dec.get(),
                   kSampleRateHz, sizeof(output), output);
}
}  // namespace webrtc
