diff options
Diffstat (limited to 'dom/media/gtest/TestMediaCodecsSupport.cpp')
-rw-r--r-- | dom/media/gtest/TestMediaCodecsSupport.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/dom/media/gtest/TestMediaCodecsSupport.cpp b/dom/media/gtest/TestMediaCodecsSupport.cpp new file mode 100644 index 0000000000..86840cce09 --- /dev/null +++ b/dom/media/gtest/TestMediaCodecsSupport.cpp @@ -0,0 +1,157 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "gtest/gtest.h" +#include "MediaCodecsSupport.h" + +using namespace mozilla; +using namespace media; + +// Test MCSInfo::GetDecodeSupportSet function. +// This function is used to retrieve SW/HW support information for a +// given codec from a MediaCodecsSupported EnumSet. +// We validate that SW, HW, SW+HW, or lack of support information is +// properly returned. +TEST(MediaCodecsSupport, GetDecodeSupportSet) +{ + // Mock VP8 SW support, VP9 HW support, H264 SW+HW support + MediaCodecsSupported supported{MediaCodecsSupport::VP8SoftwareDecode, + MediaCodecsSupport::VP9HardwareDecode, + MediaCodecsSupport::H264SoftwareDecode, + MediaCodecsSupport::H264HardwareDecode}; + + MediaCodec codec; // Codec used to generate + filter results + DecodeSupportSet RV; // Return value to check for validity + + // Check only SW support returned for VP8 + codec = MediaCodec::VP8; + RV = MCSInfo::GetDecodeSupportSet(codec, supported); + EXPECT_TRUE(RV.contains(DecodeSupport::SoftwareDecode)); + EXPECT_TRUE(RV.size() == 1); + + // Check only HW support returned for VP9 + codec = MediaCodec::VP9; + RV = MCSInfo::GetDecodeSupportSet(codec, supported); + EXPECT_TRUE(RV.contains(DecodeSupport::HardwareDecode)); + EXPECT_TRUE(RV.size() == 1); + + // Check for both SW/HW support returned for H264 + codec = MediaCodec::H264; + RV = MCSInfo::GetDecodeSupportSet(codec, supported); + EXPECT_TRUE(RV.contains(DecodeSupport::SoftwareDecode)); + EXPECT_TRUE(RV.contains(DecodeSupport::HardwareDecode)); + EXPECT_TRUE(RV.size() == 2); + + // Check empty return if codec not in list of codecs + codec = MediaCodec::AV1; + RV = MCSInfo::GetDecodeSupportSet(codec, supported); + EXPECT_TRUE(RV.size() == 0); +} + +// Test MCSInfo::GetDecodeMediaCodecsSupported function. +// This function is used to generate codec-specific SW/HW +// support information from a generic codec identifier enum and +// generic SW/HW support information. +// We validate that SW, HW, SW+HW, or lack of support information is +// properly returned. +TEST(MediaCodecsSupport, GetDecodeMediaCodecsSupported) +{ + MediaCodec codec; // Codec used to generate / filter results + MediaCodecsSupported RV; // Return value to check for validity + DecodeSupportSet dss; // Non codec-specific SW / HW support information + + // Check SW support returned for VP8 + codec = MediaCodec::VP8; + dss = DecodeSupportSet{DecodeSupport::SoftwareDecode}; + RV = MCSInfo::GetDecodeMediaCodecsSupported(codec, dss); + EXPECT_TRUE(RV.contains(MediaCodecsSupport::VP8SoftwareDecode)); + EXPECT_TRUE(RV.size() == 1); + + // Check HW support returned for AV1 + codec = MediaCodec::AV1; + dss = DecodeSupportSet{DecodeSupport::HardwareDecode}; + RV = MCSInfo::GetDecodeMediaCodecsSupported(codec, dss); + EXPECT_TRUE(RV.contains(MediaCodecsSupport::AV1HardwareDecode)); + EXPECT_TRUE(RV.size() == 1); + + // Check SW + HW support returned for VP9 + codec = MediaCodec::VP9; + dss = DecodeSupportSet{DecodeSupport::SoftwareDecode, + DecodeSupport::HardwareDecode}; + RV = MCSInfo::GetDecodeMediaCodecsSupported(codec, dss); + EXPECT_TRUE(RV.contains(MediaCodecsSupport::VP9SoftwareDecode)); + EXPECT_TRUE(RV.contains(MediaCodecsSupport::VP9HardwareDecode)); + EXPECT_TRUE(RV.size() == 2); + + // Check empty return if codec not supported + codec = MediaCodec::AV1; + dss = DecodeSupportSet{}; + RV = MCSInfo::GetDecodeMediaCodecsSupported(codec, dss); + EXPECT_TRUE(RV.size() == 0); +} + +// Test MCSInfo::AddSupport function. +// This function is used to store codec support data. +// Incoming support data will be merged with any data that +// has already been stored. +TEST(MediaCodecsSupport, AddSupport) +{ + // Make sure we're not storing any existing support information. + MCSInfo::ResetSupport(); + EXPECT_TRUE(MCSInfo::GetSupport().size() == 0); + + // Add codec support one at a time via individual calls + MCSInfo::AddSupport(MediaCodecsSupport::AACSoftwareDecode); + MCSInfo::AddSupport(MediaCodecsSupport::VP9SoftwareDecode); + MCSInfo::AddSupport(MediaCodecsSupport::AV1HardwareDecode); + + // Add multiple codec support via MediaCodecsSupported EnumSet + MCSInfo::AddSupport( + MediaCodecsSupported{MediaCodecsSupport::H264SoftwareDecode, + MediaCodecsSupport::H264HardwareDecode}); + + // Query MCSInfo for supported codecs + MediaCodecsSupported supported = MCSInfo::GetSupport(); + DecodeSupportSet dss; + + // AAC should only report software decode support + dss = MCSInfo::GetDecodeSupportSet(MediaCodec::AAC, supported); + EXPECT_TRUE(dss.size() == 1); + EXPECT_TRUE(dss.contains(DecodeSupport::SoftwareDecode)); + + // AV1 should only report hardware decode support + dss = MCSInfo::GetDecodeSupportSet(MediaCodec::AV1, supported); + EXPECT_TRUE(dss.size() == 1); + EXPECT_TRUE(dss.contains(DecodeSupport::HardwareDecode)); + + // H264 should report both SW + HW decode support + dss = MCSInfo::GetDecodeSupportSet(MediaCodec::H264, supported); + EXPECT_TRUE(dss.size() == 2); + EXPECT_TRUE(dss.contains(DecodeSupport::SoftwareDecode)); + EXPECT_TRUE(dss.contains(DecodeSupport::HardwareDecode)); + + // Vorbis should report no decode support + dss = MCSInfo::GetDecodeSupportSet(MediaCodec::Vorbis, supported); + EXPECT_TRUE(dss.size() == 0); +} + +// Test MCSInfo::GetMediaCodecsSupportedString function. +// This function returns a human-readable string containing codec +// names and SW/HW playback support information. +TEST(MediaCodecsSupport, GetMediaCodecsSupportedString) +{ + // Make sure we're not storing any existing support information. + MCSInfo::ResetSupport(); + EXPECT_TRUE(MCSInfo::GetSupport().size() == 0); + + // Add H264 SW/HW support + VP8 Software decode support. + MCSInfo::AddSupport({MediaCodecsSupport::H264SoftwareDecode, + MediaCodecsSupport::H264HardwareDecode, + MediaCodecsSupport::VP8SoftwareDecode}); + + nsCString supportString; + MCSInfo::GetMediaCodecsSupportedString(supportString, MCSInfo::GetSupport()); + EXPECT_TRUE(supportString.Equals("H264 SW\nH264 HW\nVP8 SW"_ns)); +} |