/* -*- 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(); opusMeta->mChannels = 1; opusMeta->mSamplingFrequency = 48000; opusMeta->mIdHeader.AppendElement(1); opusMeta->mCommentHeader.AppendElement(1); AutoTArray, 1> metadata; metadata.AppendElement(std::move(opusMeta)); OggWriter ogg; MOZ_ALWAYS_SUCCEEDS(ogg.SetMetadata(metadata)); { nsTArray> buffer; MOZ_ALWAYS_SUCCEEDS( ogg.GetContainerData(&buffer, ContainerWriter::GET_HEADER)); } size_t inputBytes = 0; const size_t USECS_PER_MS = 1000; auto frameData = MakeRefPtr(); 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( media::TimeUnit::FromMicroseconds(20 * USECS_PER_MS * i), 48000 / 1000 * 20 /* 20ms */, 48000, EncodedFrame::OPUS_AUDIO_FRAME, frameData); AutoTArray, 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> 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); }