summaryrefslogtreecommitdiffstats
path: root/dom/media/gtest/TestTrackEncoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/gtest/TestTrackEncoder.cpp')
-rw-r--r--dom/media/gtest/TestTrackEncoder.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/dom/media/gtest/TestTrackEncoder.cpp b/dom/media/gtest/TestTrackEncoder.cpp
new file mode 100644
index 000000000..01d5c86e9
--- /dev/null
+++ b/dom/media/gtest/TestTrackEncoder.cpp
@@ -0,0 +1,94 @@
+/* -*- 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 "OpusTrackEncoder.h"
+
+using namespace mozilla;
+
+class TestOpusTrackEncoder : public OpusTrackEncoder
+{
+public:
+ // Return true if it has successfully initialized the Opus encoder.
+ bool TestOpusCreation(int aChannels, int aSamplingRate)
+ {
+ if (Init(aChannels, aSamplingRate) == NS_OK) {
+ if (GetPacketDuration()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // Return the sample rate of data to be fed to the Opus encoder, could be
+ // re-sampled if it was not one of the Opus supported sampling rates.
+ // Init() is expected to be called first.
+ int TestGetOutputSampleRate()
+ {
+ return mInitialized ? GetOutputSampleRate() : 0;
+ }
+};
+
+static bool
+TestOpusInit(int aChannels, int aSamplingRate)
+{
+ TestOpusTrackEncoder encoder;
+ return encoder.TestOpusCreation(aChannels, aSamplingRate);
+}
+
+static int
+TestOpusResampler(int aChannels, int aSamplingRate)
+{
+ TestOpusTrackEncoder encoder;
+ EXPECT_TRUE(encoder.TestOpusCreation(aChannels, aSamplingRate));
+ return encoder.TestGetOutputSampleRate();
+}
+
+TEST(Media, OpusEncoder_Init)
+{
+ // Expect false with 0 or negative channels of input signal.
+ EXPECT_FALSE(TestOpusInit(0, 16000));
+ EXPECT_FALSE(TestOpusInit(-1, 16000));
+
+ // The Opus format supports up to 8 channels, and supports multitrack audio up
+ // to 255 channels, but the current implementation supports only mono and
+ // stereo, and downmixes any more than that.
+ // Expect false with channels of input signal exceed the max supported number.
+ EXPECT_FALSE(TestOpusInit(8 + 1, 16000));
+
+ // Should accept channels within valid range.
+ for (int i = 1; i <= 8; i++) {
+ EXPECT_TRUE(TestOpusInit(i, 16000));
+ }
+
+ // Expect false with 0 or negative sampling rate of input signal.
+ EXPECT_FALSE(TestOpusInit(1, 0));
+ EXPECT_FALSE(TestOpusInit(1, -1));
+
+ // Verify sample rate bounds checking.
+ EXPECT_FALSE(TestOpusInit(2, 2000));
+ EXPECT_FALSE(TestOpusInit(2, 4000));
+ EXPECT_FALSE(TestOpusInit(2, 7999));
+ EXPECT_TRUE(TestOpusInit(2, 8000));
+ EXPECT_TRUE(TestOpusInit(2, 192000));
+ EXPECT_FALSE(TestOpusInit(2, 192001));
+ EXPECT_FALSE(TestOpusInit(2, 200000));
+}
+
+TEST(Media, OpusEncoder_Resample)
+{
+ // Sampling rates of data to be fed to Opus encoder, should remain unchanged
+ // if it is one of Opus supported rates (8000, 12000, 16000, 24000 and 48000
+ // (kHz)) at initialization.
+ EXPECT_TRUE(TestOpusResampler(1, 8000) == 8000);
+ EXPECT_TRUE(TestOpusResampler(1, 12000) == 12000);
+ EXPECT_TRUE(TestOpusResampler(1, 16000) == 16000);
+ EXPECT_TRUE(TestOpusResampler(1, 24000) == 24000);
+ EXPECT_TRUE(TestOpusResampler(1, 48000) == 48000);
+
+ // Otherwise, it should be resampled to 48kHz by resampler.
+ EXPECT_FALSE(TestOpusResampler(1, 9600) == 9600);
+ EXPECT_FALSE(TestOpusResampler(1, 44100) == 44100);
+}