// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/base/audio_decoder_config.h"
#include "media/base/demuxer.h"
#include "media/base/demuxer_memory_limit.h"
#include "media/base/media_util.h"
#include "media/base/video_decoder_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/types/optional.h"

namespace media {

static const gfx::Size kCodedSize(320, 240);
static const gfx::Rect kVisibleRect(320, 240);
static const gfx::Size kNaturalSize(320, 240);

TEST(DemuxerMemoryLimitCastTest, GetDemuxerStreamAudioMemoryLimit) {
  EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(nullptr),
            internal::kDemuxerStreamAudioMemoryLimitLow);

  AudioDecoderConfig audio_config_opus(
      AudioCodec::kOpus, SampleFormat::kSampleFormatS16,
      ChannelLayout::CHANNEL_LAYOUT_STEREO, 5000 /* samples_per_second */,
      EmptyExtraData(), EncryptionScheme::kUnencrypted);
  EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_opus),
            internal::kDemuxerStreamAudioMemoryLimitLow);

  AudioDecoderConfig audio_config_ac3(
      AudioCodec::kAC3, SampleFormat::kSampleFormatS16,
      ChannelLayout::CHANNEL_LAYOUT_STEREO, 5000 /* samples_per_second */,
      EmptyExtraData(), EncryptionScheme::kUnencrypted);
  EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_ac3),
            internal::kDemuxerStreamAudioMemoryLimitMedium);

  AudioDecoderConfig audio_config_aac_1(
      AudioCodec::kAAC, SampleFormat::kSampleFormatS16,
      ChannelLayout::CHANNEL_LAYOUT_5_0, 5000 /* samples_per_second */,
      EmptyExtraData(), EncryptionScheme::kUnencrypted);
  EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_aac_1),
            internal::kDemuxerStreamAudioMemoryLimitMedium);

  AudioDecoderConfig audio_config_aac_2(
      AudioCodec::kAAC, SampleFormat::kSampleFormatS16,
      ChannelLayout::CHANNEL_LAYOUT_STEREO, 5000 /* samples_per_second */,
      EmptyExtraData(), EncryptionScheme::kUnencrypted);
  EXPECT_EQ(GetDemuxerStreamAudioMemoryLimit(&audio_config_aac_2),
            internal::kDemuxerStreamAudioMemoryLimitLow);
}

TEST(DemuxerMemoryLimitCastTest, GetDemuxerStreamVideoMemoryLimit) {
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kFFmpegDemuxer, nullptr),
            internal::kDemuxerStreamVideoMemoryLimitDefault);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kChunkDemuxer, nullptr),
            internal::kDemuxerStreamVideoMemoryLimitLow);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kMediaUrlDemuxer, nullptr),
            internal::kDemuxerStreamVideoMemoryLimitLow);

  VideoDecoderConfig video_config(
      VideoCodec::kVP8, VIDEO_CODEC_PROFILE_UNKNOWN,
      VideoDecoderConfig::AlphaMode::kIsOpaque, VideoColorSpace(),
      kNoTransformation, kCodedSize, kVisibleRect, kNaturalSize,
      EmptyExtraData(), EncryptionScheme::kUnencrypted);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kFFmpegDemuxer, &video_config),
            internal::kDemuxerStreamVideoMemoryLimitDefault);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kChunkDemuxer, &video_config),
            internal::kDemuxerStreamVideoMemoryLimitLow);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kMediaUrlDemuxer, &video_config),
            internal::kDemuxerStreamVideoMemoryLimitLow);

  video_config.Initialize(VideoCodec::kVP9, VIDEO_CODEC_PROFILE_UNKNOWN,
                          VideoDecoderConfig::AlphaMode::kIsOpaque,
                          VideoColorSpace(), kNoTransformation, kCodedSize,
                          kVisibleRect, kNaturalSize, EmptyExtraData(),
                          EncryptionScheme::kUnencrypted);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kFFmpegDemuxer, &video_config),
            internal::kDemuxerStreamVideoMemoryLimitDefault);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kChunkDemuxer, &video_config),
            internal::kDemuxerStreamVideoMemoryLimitMedium);
  EXPECT_EQ(GetDemuxerStreamVideoMemoryLimit(
                Demuxer::DemuxerTypes::kMediaUrlDemuxer, &video_config),
            internal::kDemuxerStreamVideoMemoryLimitLow);
}

TEST(DemuxerMemoryLimitCastTest, GetDemuxerMemoryLimit) {
  EXPECT_EQ(GetDemuxerMemoryLimit(Demuxer::DemuxerTypes::kFFmpegDemuxer),
            internal::kDemuxerStreamAudioMemoryLimitLow +
                internal::kDemuxerStreamVideoMemoryLimitDefault);
  EXPECT_EQ(GetDemuxerMemoryLimit(Demuxer::DemuxerTypes::kChunkDemuxer),
            internal::kDemuxerStreamAudioMemoryLimitLow +
                internal::kDemuxerStreamVideoMemoryLimitLow);
  EXPECT_EQ(GetDemuxerMemoryLimit(Demuxer::DemuxerTypes::kMediaUrlDemuxer),
            internal::kDemuxerStreamAudioMemoryLimitLow +
                internal::kDemuxerStreamVideoMemoryLimitLow);
}

}  // namespace media
