chromium/media/base/audio_codecs_unittest.cc

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

#include "media/base/audio_codecs.h"

#include "testing/gtest/include/gtest/gtest.h"

namespace media {
#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
TEST(ParseDolbyAc4CodecIdTest, DolbyAc4CodecIds) {
  uint8_t bitstream_version;
  uint8_t presentation_version;
  uint8_t presentation_level;

  EXPECT_TRUE(ParseDolbyAc4CodecId("ac-4.02.01.00", &bitstream_version,
                                   &presentation_version, &presentation_level));
  EXPECT_EQ(bitstream_version, 0x02);
  EXPECT_EQ(presentation_version, 0x01);
  EXPECT_EQ(presentation_level, 0);

  // For IMS case:
  EXPECT_TRUE(ParseDolbyAc4CodecId("ac-4.02.02.00", &bitstream_version,
                                   &presentation_version, &presentation_level));
  EXPECT_EQ(bitstream_version, 0x02);
  EXPECT_EQ(presentation_version, 0x02);
  EXPECT_EQ(presentation_level, 0);

  EXPECT_TRUE(ParseDolbyAc4CodecId("ac-4.02.01.04", &bitstream_version,
                                   &presentation_version, &presentation_level));
  EXPECT_EQ(bitstream_version, 0x02);
  EXPECT_EQ(presentation_version, 0x01);
  EXPECT_EQ(presentation_level, 0x04);

  EXPECT_FALSE(ParseDolbyAc4CodecId("ac-4.00.00.00", &bitstream_version,
                                    &presentation_version,
                                    &presentation_level));
  EXPECT_FALSE(ParseDolbyAc4CodecId("ac-4.01.00.00", &bitstream_version,
                                    &presentation_version,
                                    &presentation_level));
  EXPECT_FALSE(ParseDolbyAc4CodecId("ac-4.02.00.00", &bitstream_version,
                                    &presentation_version,
                                    &presentation_level));
  EXPECT_FALSE(ParseDolbyAc4CodecId("ac-4.02.01.08", &bitstream_version,
                                    &presentation_version,
                                    &presentation_level));
  EXPECT_FALSE(ParseDolbyAc4CodecId("ac4.02.01.00", &bitstream_version,
                                    &presentation_version,
                                    &presentation_level));
  EXPECT_FALSE(ParseDolbyAc4CodecId("ac-4.02.01.00.00", &bitstream_version,
                                    &presentation_version,
                                    &presentation_level));
}
#endif  // BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)

#if BUILDFLAG(ENABLE_PLATFORM_IAMF_AUDIO)
TEST(ParseIamfCodecIdTest, IamfCodecIds) {
  EXPECT_TRUE(ParseIamfCodecId("iamf.000.000.opus", nullptr, nullptr));
  EXPECT_TRUE(ParseIamfCodecId("iamf.000.000.Opus", nullptr, nullptr));

  EXPECT_TRUE(ParseIamfCodecId("iamf.000.000.mp4a.40.2", nullptr, nullptr));

  EXPECT_TRUE(ParseIamfCodecId("iamf.000.000.flac", nullptr, nullptr));
  EXPECT_TRUE(ParseIamfCodecId("iamf.000.000.fLaC", nullptr, nullptr));

  EXPECT_TRUE(ParseIamfCodecId("iamf.000.000.ipcm", nullptr, nullptr));

  uint8_t primary_profile;
  uint8_t additional_profile;

  EXPECT_TRUE(ParseIamfCodecId("iamf.000.000.ipcm", &primary_profile,
                               &additional_profile));
  EXPECT_EQ(primary_profile, 0x00);
  EXPECT_EQ(additional_profile, 0x00);

  EXPECT_TRUE(ParseIamfCodecId("iamf.001.001.ipcm", &primary_profile,
                               &additional_profile));
  EXPECT_EQ(primary_profile, 0x01);
  EXPECT_EQ(additional_profile, 0x01);

  EXPECT_TRUE(ParseIamfCodecId("iamf.000.001.ipcm", &primary_profile,
                               &additional_profile));
  EXPECT_EQ(primary_profile, 0x00);
  EXPECT_EQ(additional_profile, 0x01);

  EXPECT_TRUE(ParseIamfCodecId("iamf.001.000.ipcm", &primary_profile,
                               &additional_profile));
  EXPECT_EQ(primary_profile, 0x01);
  EXPECT_EQ(additional_profile, 0x00);

  EXPECT_TRUE(ParseIamfCodecId("iamf.001.002.ipcm", &primary_profile,
                               &additional_profile));
  EXPECT_EQ(primary_profile, 0x01);
  EXPECT_EQ(additional_profile, 0x02);

  EXPECT_TRUE(ParseIamfCodecId("iamf.255.255.ipcm", &primary_profile,
                               &additional_profile));
  EXPECT_EQ(primary_profile, 0xFF);
  EXPECT_EQ(additional_profile, 0xFF);

  // Invalid codec strings
  EXPECT_FALSE(ParseIamfCodecId("", nullptr, nullptr));

  EXPECT_FALSE(ParseIamfCodecId("iamf.000.000.mp4a", nullptr, nullptr));
  EXPECT_FALSE(ParseIamfCodecId("iamf.000.000.mp4a.30.5", nullptr, nullptr));
  EXPECT_FALSE(ParseIamfCodecId("iamf.000.000.mp4a.40.5", nullptr, nullptr));
  EXPECT_FALSE(
      ParseIamfCodecId("iamf.000.000.000.mp4a.40.2", nullptr, nullptr));

  EXPECT_FALSE(ParseIamfCodecId("iamf.256.000.Opus", nullptr, nullptr));
  EXPECT_FALSE(ParseIamfCodecId("iamf.000.256.Opus", nullptr, nullptr));

  EXPECT_FALSE(ParseIamfCodecId("iamf.00.000.ipcm", nullptr, nullptr));
  EXPECT_FALSE(ParseIamfCodecId("iamf.000.00.ipcm", nullptr, nullptr));
  EXPECT_FALSE(ParseIamfCodecId("iamd.000.000.ipcm", nullptr, nullptr));
  EXPECT_FALSE(ParseIamfCodecId("ia.000.000.ipcm", nullptr, nullptr));
}
#endif  // BUILDFLAG(ENABLE_PLATFORM_IAMF)

}  // namespace media