summaryrefslogtreecommitdiffstats
path: root/dom/media/gtest/TestOggWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/gtest/TestOggWriter.cpp')
-rw-r--r--dom/media/gtest/TestOggWriter.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/dom/media/gtest/TestOggWriter.cpp b/dom/media/gtest/TestOggWriter.cpp
new file mode 100644
index 0000000000..d9df697cfe
--- /dev/null
+++ b/dom/media/gtest/TestOggWriter.cpp
@@ -0,0 +1,62 @@
+/* -*- 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 "OggWriter.h"
+#include "OpusTrackEncoder.h"
+
+using namespace mozilla;
+
+// Writing multiple 4kB-pages should return all of them on getting.
+TEST(TestOggWriter, MultiPageInput)
+{
+ auto opusMeta = MakeRefPtr<OpusMetadata>();
+ opusMeta->mChannels = 1;
+ opusMeta->mSamplingFrequency = 48000;
+ opusMeta->mIdHeader.AppendElement(1);
+ opusMeta->mCommentHeader.AppendElement(1);
+ AutoTArray<RefPtr<TrackMetadataBase>, 1> metadata;
+ metadata.AppendElement(std::move(opusMeta));
+
+ OggWriter ogg;
+ MOZ_ALWAYS_SUCCEEDS(ogg.SetMetadata(metadata));
+ {
+ nsTArray<nsTArray<uint8_t>> buffer;
+ MOZ_ALWAYS_SUCCEEDS(
+ ogg.GetContainerData(&buffer, ContainerWriter::GET_HEADER));
+ }
+
+ size_t inputBytes = 0;
+ const size_t USECS_PER_MS = 1000;
+ auto frameData = MakeRefPtr<EncodedFrame::FrameData>();
+ frameData->SetLength(320); // 320B per 20ms == 128kbps
+ PodZero(frameData->Elements(), frameData->Length());
+ // 50 frames at 320B = 16kB = 4 4kB-pages
+ for (int i = 0; i < 50; ++i) {
+ auto frame = MakeRefPtr<EncodedFrame>(
+ media::TimeUnit::FromMicroseconds(20 * USECS_PER_MS * i),
+ 48000 / 1000 * 20 /* 20ms */, 48000, EncodedFrame::OPUS_AUDIO_FRAME,
+ frameData);
+ AutoTArray<RefPtr<EncodedFrame>, 1> frames;
+ frames.AppendElement(std::move(frame));
+ uint32_t flags = 0;
+ if (i == 49) {
+ flags |= ContainerWriter::END_OF_STREAM;
+ }
+ MOZ_ALWAYS_SUCCEEDS(ogg.WriteEncodedTrack(frames, flags));
+ inputBytes += frameData->Length();
+ }
+
+ nsTArray<nsTArray<uint8_t>> buffer;
+ MOZ_ALWAYS_SUCCEEDS(
+ ogg.GetContainerData(&buffer, ContainerWriter::FLUSH_NEEDED));
+ size_t outputBytes = 0;
+ for (const auto& b : buffer) {
+ outputBytes += b.Length();
+ }
+
+ EXPECT_EQ(inputBytes, 16000U);
+ EXPECT_EQ(outputBytes, 16208U);
+}