diff --git a/starboard/shared/starboard/media/codec_util.cc b/starboard/shared/starboard/media/codec_util.cc index f930682f76b..ad0f6868204 100644 --- a/starboard/shared/starboard/media/codec_util.cc +++ b/starboard/shared/starboard/media/codec_util.cc @@ -16,6 +16,7 @@ #include #include +#include #include #include "starboard/common/log.h" @@ -107,13 +108,24 @@ SbMediaAudioCodec GetAudioCodecFromString(const char* codec, return kSbMediaAudioCodecPcm; } #if SB_API_VERSION >= 15 - if (strcmp(codec, "iamf") == 0 || strncmp(codec, "iamf.", 5) == 0) { + if (strcmp(codec, "iamf") == 0 || IsIamfMimeType(codec)) { return kSbMediaAudioCodecIamf; } #endif // SB_API_VERSION >= 15 return kSbMediaAudioCodecNone; } +bool IsIamfMimeType(std::string mime_type) { + return std::regex_match(mime_type, + std::regex("iamf\\.\\d{3}\\.\\d{3}\\.Opus")) || + std::regex_match( + mime_type, std::regex("iamf\\.\\d{3}\\.\\d{3}\\.mp4a\\.40\\.2")) || + std::regex_match(mime_type, + std::regex("iamf\\.\\d{3}\\.\\d{3}\\.fLaC")) || + std::regex_match(mime_type, + std::regex("iamf\\.\\d{3}\\.\\d{3}\\.ipcm")); +} + } // namespace media } // namespace starboard } // namespace shared diff --git a/starboard/shared/starboard/media/codec_util.h b/starboard/shared/starboard/media/codec_util.h index b6f6b61513c..b0bbbf32e0a 100644 --- a/starboard/shared/starboard/media/codec_util.h +++ b/starboard/shared/starboard/media/codec_util.h @@ -70,6 +70,9 @@ class VideoConfig { SbMediaAudioCodec GetAudioCodecFromString(const char* codec, const char* subtype); +#if SB_API_VERSION >= 15 +bool IsIamfMimeType(std::string mime_type); +#endif // SB_API_VERSION >= 15 } // namespace media } // namespace starboard } // namespace shared diff --git a/starboard/shared/starboard/media/codec_util_test.cc b/starboard/shared/starboard/media/codec_util_test.cc index 16faa5aeb51..81ff0d3f885 100644 --- a/starboard/shared/starboard/media/codec_util_test.cc +++ b/starboard/shared/starboard/media/codec_util_test.cc @@ -263,6 +263,41 @@ TEST(CodecUtilTest, DoesNotParse1AsPcmForNonWavSubtypes) { EXPECT_EQ(GetAudioCodecFromString("1", "webm"), kSbMediaAudioCodecNone); } +TEST(CodecUtilTest, ParsesIamfCodec) { +#if SB_API_VERSION < 15 + GTEST_SKIP() << "IAMF is unsupported on Starboard " << SB_API_VERSION; +#endif // SB_API_VERSION < 15 + EXPECT_EQ(GetAudioCodecFromString("iamf", ""), kSbMediaAudioCodecIamf); + EXPECT_EQ(GetAudioCodecFromString("iamf.000.000.Opus", ""), + kSbMediaAudioCodecIamf); + EXPECT_EQ(GetAudioCodecFromString("iamf.000.000.mp4a.40.2", ""), + kSbMediaAudioCodecIamf); + EXPECT_EQ(GetAudioCodecFromString("iamf.000.000.fLaC", ""), + kSbMediaAudioCodecIamf); + EXPECT_EQ(GetAudioCodecFromString("iamf.000.000.ipcm", ""), + kSbMediaAudioCodecIamf); +} + +TEST(CodecUtilTest, IamfRegex) { +#if SB_API_VERSION < 15 + GTEST_SKIP() << "IAMF is unsupported on Starboard " << SB_API_VERSION; +#endif // SB_API_VERSION < 15 + EXPECT_TRUE(IsIamfMimeType("iamf.000.000.Opus")); + EXPECT_TRUE(IsIamfMimeType("iamf.999.999.Opus")); + EXPECT_TRUE(IsIamfMimeType("iamf.000.000.mp4a.40.2")); + EXPECT_TRUE(IsIamfMimeType("iamf.000.000.fLaC")); + EXPECT_TRUE(IsIamfMimeType("iamf.000.000.ipcm")); + + EXPECT_FALSE(IsIamfMimeType("iamf.000.000.Opu")); + EXPECT_FALSE(IsIamfMimeType("iamf,000.000.Opus")); + EXPECT_FALSE(IsIamfMimeType("Iamf.000.000.Opus")); + EXPECT_FALSE(IsIamfMimeType("iamf.000.000.0pus")); + EXPECT_FALSE(IsIamfMimeType("iamf.xxx.yyy.Opus")); + + EXPECT_FALSE(IsIamfMimeType("iamf.000.000.mp4a.40.3")); + EXPECT_FALSE(IsIamfMimeType("iamf.000.000.flac")); +} + } // namespace } // namespace media } // namespace starboard