summaryrefslogtreecommitdiffstats
path: root/dom/media/webm/WebMWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webm/WebMWriter.cpp')
-rw-r--r--dom/media/webm/WebMWriter.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/dom/media/webm/WebMWriter.cpp b/dom/media/webm/WebMWriter.cpp
new file mode 100644
index 000000000..a98a14f4e
--- /dev/null
+++ b/dom/media/webm/WebMWriter.cpp
@@ -0,0 +1,87 @@
+/* -*- 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 "WebMWriter.h"
+#include "EbmlComposer.h"
+#include "GeckoProfiler.h"
+#include "OpusTrackEncoder.h"
+
+namespace mozilla {
+
+WebMWriter::WebMWriter(uint32_t aTrackTypes) : ContainerWriter()
+{
+ mMetadataRequiredFlag = aTrackTypes;
+ mEbmlComposer = new EbmlComposer();
+}
+
+WebMWriter::~WebMWriter()
+{
+ // Out-of-line dtor so mEbmlComposer nsAutoPtr can delete a complete type.
+}
+
+nsresult
+WebMWriter::WriteEncodedTrack(const EncodedFrameContainer& aData,
+ uint32_t aFlags)
+{
+ PROFILER_LABEL("WebMWriter", "SetMetadata",
+ js::ProfileEntry::Category::OTHER);
+ for (uint32_t i = 0 ; i < aData.GetEncodedFrames().Length(); i++) {
+ mEbmlComposer->WriteSimpleBlock(aData.GetEncodedFrames().ElementAt(i).get());
+ }
+ return NS_OK;
+}
+
+nsresult
+WebMWriter::GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
+ uint32_t aFlags)
+{
+ PROFILER_LABEL("WebMWriter", "GetContainerData",
+ js::ProfileEntry::Category::OTHER);
+ mEbmlComposer->ExtractBuffer(aOutputBufs, aFlags);
+ if (aFlags & ContainerWriter::FLUSH_NEEDED) {
+ mIsWritingComplete = true;
+ }
+ return NS_OK;
+}
+
+nsresult
+WebMWriter::SetMetadata(TrackMetadataBase* aMetadata)
+{
+ MOZ_ASSERT(aMetadata);
+ PROFILER_LABEL("WebMWriter", "SetMetadata",
+ js::ProfileEntry::Category::OTHER);
+
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VP8) {
+ VP8Metadata* meta = static_cast<VP8Metadata*>(aMetadata);
+ MOZ_ASSERT(meta, "Cannot find vp8 encoder metadata");
+ mEbmlComposer->SetVideoConfig(meta->mWidth, meta->mHeight,
+ meta->mDisplayWidth, meta->mDisplayHeight,
+ meta->mEncodedFrameRate);
+ mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_VIDEO_TRACK;
+ }
+
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VORBIS) {
+ VorbisMetadata* meta = static_cast<VorbisMetadata*>(aMetadata);
+ MOZ_ASSERT(meta, "Cannot find vorbis encoder metadata");
+ mEbmlComposer->SetAudioConfig(meta->mSamplingFrequency, meta->mChannels);
+ mEbmlComposer->SetAudioCodecPrivateData(meta->mData);
+ mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_AUDIO_TRACK;
+ }
+
+ if (aMetadata->GetKind() == TrackMetadataBase::METADATA_OPUS) {
+ OpusMetadata* meta = static_cast<OpusMetadata*>(aMetadata);
+ MOZ_ASSERT(meta, "Cannot find Opus encoder metadata");
+ mEbmlComposer->SetAudioConfig(meta->mSamplingFrequency, meta->mChannels);
+ mEbmlComposer->SetAudioCodecPrivateData(meta->mIdHeader);
+ mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_AUDIO_TRACK;
+ }
+
+ if (!mMetadataRequiredFlag) {
+ mEbmlComposer->GenerateHeader();
+ }
+ return NS_OK;
+}
+
+} // namespace mozilla