// Copyright 2014 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 <string>

#include "cobalt/media/base/mock_media_log.h"
#include "cobalt/media/formats/mp4/aac.h"
#include "starboard/types.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

using ::testing::AllOf;
using ::testing::HasSubstr;
using ::testing::InSequence;
using ::testing::StrictMock;

namespace cobalt {
namespace media {

namespace mp4 {

MATCHER_P(AudioProfileLog, profile_string, "") {
  return CONTAINS_STRING(arg,
                         "Audio codec: " + std::string(profile_string) + ".");
}

MATCHER_P(AudioSamplingFrequencyLog, frequency_string, "") {
  return CONTAINS_STRING(
      arg, "Sampling frequency: " + std::string(frequency_string) + "Hz.");
}

MATCHER_P(AudioExtensionSamplingFrequencyLog, ex_string, "") {
  return CONTAINS_STRING(
      arg, "Sampling frequency(Extension): " + std::string(ex_string) + "Hz.");
}

MATCHER_P(AudioChannelLayoutLog, layout_string, "") {
  return CONTAINS_STRING(arg,
                         "Channel layout: " + std::string(layout_string) + ".");
}

MATCHER_P(UnsupportedFrequencyIndexLog, frequency_index, "") {
  return CONTAINS_STRING(arg, "Sampling Frequency Index(0x" +
                                  std::string(frequency_index) +
                                  ") is not supported.");
}

MATCHER_P(UnsupportedExtensionFrequencyIndexLog, frequency_index, "") {
  return CONTAINS_STRING(arg, "Extension Sampling Frequency Index(0x" +
                                  std::string(frequency_index) +
                                  ") is not supported.");
}

MATCHER_P(UnsupportedChannelConfigLog, channel_index, "") {
  return CONTAINS_STRING(arg, "Channel Configuration(" +
                                  std::string(channel_index) +
                                  ") is not supported");
}

MATCHER_P(UnsupportedAudioProfileLog, profile_string, "") {
  return CONTAINS_STRING(
      arg, "Audio codec(" + std::string(profile_string) + ") is not supported");
}

class AACTest : public testing::Test {
 public:
  AACTest() : media_log_(new StrictMock<MockMediaLog>()) {}

  bool Parse(const std::vector<uint8_t>& data) {
    return aac_.Parse(data, media_log_);
  }

  scoped_refptr<StrictMock<MockMediaLog>> media_log_;
  AAC aac_;
};

TEST_F(AACTest, BasicProfileTest) {
  uint8_t buffer[] = {0x12, 0x10};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));

  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("44100"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("3")));
  EXPECT_TRUE(Parse(data));
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 44100);
  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_STEREO);
}

TEST_F(AACTest, ExtensionTest) {
  uint8_t buffer[] = {0x13, 0x08, 0x56, 0xe5, 0x9d, 0x48, 0x80};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));

  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
      AudioExtensionSamplingFrequencyLog("48000"), AudioChannelLayoutLog("3")));
  EXPECT_TRUE(Parse(data));
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 48000);
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(true), 48000);
  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_STEREO);
}

// Test implicit SBR with mono channel config.
// Mono channel layout should only be reported if SBR is not
// specified. Otherwise stereo should be reported.
// See ISO 14496-3:2005 Section 1.6.5.3 for details about this special casing.
TEST_F(AACTest, ImplicitSBR_ChannelConfig0) {
  uint8_t buffer[] = {0x13, 0x08};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));

  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
  EXPECT_TRUE(Parse(data));

  // Test w/o implict SBR.
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 24000);
  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_MONO);

  // Test implicit SBR.
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(true), 48000);
  EXPECT_EQ(aac_.GetChannelLayout(true), CHANNEL_LAYOUT_STEREO);
}

// Tests implicit SBR with a stereo channel config.
TEST_F(AACTest, ImplicitSBR_ChannelConfig1) {
  uint8_t buffer[] = {0x13, 0x10};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));

  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("3")));
  EXPECT_TRUE(Parse(data));

  // Test w/o implict SBR.
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 24000);
  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_STEREO);

  // Test implicit SBR.
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(true), 48000);
  EXPECT_EQ(aac_.GetChannelLayout(true), CHANNEL_LAYOUT_STEREO);
}

TEST_F(AACTest, SixChannelTest) {
  uint8_t buffer[] = {0x11, 0xb0};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));

  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("48000"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("12")));
  EXPECT_TRUE(Parse(data));
  EXPECT_EQ(aac_.GetOutputSamplesPerSecond(false), 48000);
  EXPECT_EQ(aac_.GetChannelLayout(false), CHANNEL_LAYOUT_5_1_BACK);
}

TEST_F(AACTest, DataTooShortTest) {
  std::vector<uint8_t> data;

  EXPECT_FALSE(Parse(data));

  data.push_back(0x12);
  EXPECT_FALSE(Parse(data));
}

TEST_F(AACTest, IncorrectProfileTest) {
  InSequence s;
  uint8_t buffer[] = {0x0, 0x08};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));
  EXPECT_MEDIA_LOG(UnsupportedAudioProfileLog("mp4a.40.0"));
  EXPECT_FALSE(Parse(data));

  data[0] = 0x08;
  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.1"), AudioSamplingFrequencyLog("96000"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
  EXPECT_TRUE(Parse(data));

  data[0] = 0x28;
  // No media log for this profile 5, since not enough bits are in |data| to
  // first parse profile 5's extension frequency index.
  EXPECT_FALSE(Parse(data));
}

TEST_F(AACTest, IncorrectFrequencyTest) {
  uint8_t buffer[] = {0x0f, 0x88};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));
  EXPECT_FALSE(Parse(data));

  data[0] = 0x0e;
  data[1] = 0x08;
  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.1"), AudioSamplingFrequencyLog("7350"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
  EXPECT_TRUE(Parse(data));
}

TEST_F(AACTest, IncorrectChannelTest) {
  uint8_t buffer[] = {0x0e, 0x00};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));
  EXPECT_FALSE(Parse(data));

  data[1] = 0x08;
  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.1"), AudioSamplingFrequencyLog("7350"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("2")));
  EXPECT_TRUE(Parse(data));
}

TEST_F(AACTest, UnsupportedProfileTest) {
  InSequence s;
  uint8_t buffer[] = {0x3a, 0x08};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));
  EXPECT_MEDIA_LOG(UnsupportedAudioProfileLog("mp4a.40.7"));
  EXPECT_FALSE(Parse(data));

  data[0] = 0x12;
  data[1] = 0x18;
  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("44100"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("5")));
  EXPECT_TRUE(Parse(data));
}

TEST_F(AACTest, UnsupportedChannelLayoutTest) {
  InSequence s;
  uint8_t buffer[] = {0x12, 0x78};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));
  EXPECT_MEDIA_LOG(UnsupportedChannelConfigLog("15"));
  EXPECT_FALSE(Parse(data));

  data[1] = 0x18;
  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("44100"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("5")));
  EXPECT_TRUE(Parse(data));
}

TEST_F(AACTest, UnsupportedFrequencyIndexTest) {
  InSequence s;
  uint8_t buffer[] = {0x17, 0x10};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));
  EXPECT_MEDIA_LOG(UnsupportedFrequencyIndexLog("e"));
  EXPECT_FALSE(Parse(data));

  data[0] = 0x13;
  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("24000"),
      AudioExtensionSamplingFrequencyLog("0"), AudioChannelLayoutLog("3")));
  EXPECT_TRUE(Parse(data));
}

TEST_F(AACTest, UnsupportedExFrequencyIndexTest) {
  InSequence s;
  uint8_t buffer[] = {0x29, 0x17, 0x08, 0x0};
  std::vector<uint8_t> data;

  data.assign(buffer, buffer + sizeof(buffer));
  EXPECT_MEDIA_LOG(UnsupportedExtensionFrequencyIndexLog("e"));
  EXPECT_FALSE(Parse(data));

  data[1] = 0x11;
  EXPECT_MEDIA_LOG(AllOf(
      AudioProfileLog("mp4a.40.2"), AudioSamplingFrequencyLog("64000"),
      AudioExtensionSamplingFrequencyLog("64000"), AudioChannelLayoutLog("3")));
  EXPECT_TRUE(Parse(data));
}

}  // namespace mp4

}  // namespace media
}  // namespace cobalt
