/*
 *  Copyright (c) 2015 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 "modules/audio_coding/neteq/tools/neteq_external_decoder_test.h"

#include "api/audio/audio_frame.h"
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "rtc_base/format_macros.h"
#include "test/gtest.h"

namespace webrtc {
namespace test {

NetEqExternalDecoderTest::NetEqExternalDecoderTest(NetEqDecoder codec,
                                                   int sample_rate_hz,
                                                   AudioDecoder* decoder)
    : codec_(codec),
      decoder_(decoder),
      sample_rate_hz_(sample_rate_hz),
      channels_(decoder_->Channels()) {
  NetEq::Config config;
  config.sample_rate_hz = sample_rate_hz_;
  neteq_.reset(NetEq::Create(config, CreateBuiltinAudioDecoderFactory()));
}

void NetEqExternalDecoderTest::Init() {
  ASSERT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(decoder_, codec_, name_,
                                                        kPayloadType));
}

void NetEqExternalDecoderTest::InsertPacket(
    RTPHeader rtp_header,
    rtc::ArrayView<const uint8_t> payload,
    uint32_t receive_timestamp) {
  ASSERT_EQ(NetEq::kOK,
            neteq_->InsertPacket(rtp_header, payload, receive_timestamp));
}

void NetEqExternalDecoderTest::GetOutputAudio(AudioFrame* output) {
  // Get audio from regular instance.
  bool muted;
  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(output, &muted));
  ASSERT_FALSE(muted);
  EXPECT_EQ(channels_, output->num_channels_);
  EXPECT_EQ(static_cast<size_t>(kOutputLengthMs * sample_rate_hz_ / 1000),
            output->samples_per_channel_);
  EXPECT_EQ(sample_rate_hz_, neteq_->last_output_sample_rate_hz());
}

}  // namespace test
}  // namespace webrtc
