From de2e7ed4b708e84fb72f998ce4aa9fbd2fb9b235 Mon Sep 17 00:00:00 2001 From: Austin Osagie Date: Wed, 28 Aug 2024 14:19:11 -0700 Subject: [PATCH] Explicity check for supported IAMF codecs parameter strings b/356704307 --- .../shared/starboard/media/codec_util.cc | 14 +++++++- starboard/shared/starboard/media/codec_util.h | 3 ++ .../shared/starboard/media/codec_util_test.cc | 35 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/starboard/shared/starboard/media/codec_util.cc b/starboard/shared/starboard/media/codec_util.cc index f930682f76b0..ad0f68682047 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 b6f6b61513c6..b0bbbf32e0a2 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 16faa5aeb51f..81ff0d3f8854 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