Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
4 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #include "WebMWriter.h"
7 : #include "EbmlComposer.h"
8 : #include "GeckoProfiler.h"
9 : #include "OpusTrackEncoder.h"
10 :
11 : namespace mozilla {
12 :
13 0 : WebMWriter::WebMWriter(uint32_t aTrackTypes) : ContainerWriter()
14 : {
15 0 : mMetadataRequiredFlag = aTrackTypes;
16 0 : mEbmlComposer = new EbmlComposer();
17 0 : }
18 :
19 0 : WebMWriter::~WebMWriter()
20 : {
21 : // Out-of-line dtor so mEbmlComposer nsAutoPtr can delete a complete type.
22 0 : }
23 :
24 : nsresult
25 0 : WebMWriter::WriteEncodedTrack(const EncodedFrameContainer& aData,
26 : uint32_t aFlags)
27 : {
28 0 : AUTO_PROFILER_LABEL("WebMWriter::WriteEncodedTrack", OTHER);
29 0 : for (uint32_t i = 0 ; i < aData.GetEncodedFrames().Length(); i++) {
30 0 : mEbmlComposer->WriteSimpleBlock(aData.GetEncodedFrames().ElementAt(i).get());
31 : }
32 0 : return NS_OK;
33 : }
34 :
35 : nsresult
36 0 : WebMWriter::GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
37 : uint32_t aFlags)
38 : {
39 0 : AUTO_PROFILER_LABEL("WebMWriter::GetContainerData", OTHER);
40 0 : mEbmlComposer->ExtractBuffer(aOutputBufs, aFlags);
41 0 : if (aFlags & ContainerWriter::FLUSH_NEEDED) {
42 0 : mIsWritingComplete = true;
43 : }
44 0 : return NS_OK;
45 : }
46 :
47 : nsresult
48 0 : WebMWriter::SetMetadata(TrackMetadataBase* aMetadata)
49 : {
50 0 : MOZ_ASSERT(aMetadata);
51 0 : AUTO_PROFILER_LABEL("WebMWriter::SetMetadata", OTHER);
52 :
53 0 : if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VP8) {
54 0 : VP8Metadata* meta = static_cast<VP8Metadata*>(aMetadata);
55 0 : MOZ_ASSERT(meta, "Cannot find vp8 encoder metadata");
56 0 : mEbmlComposer->SetVideoConfig(meta->mWidth, meta->mHeight,
57 0 : meta->mDisplayWidth, meta->mDisplayHeight);
58 0 : mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_VIDEO_TRACK;
59 : }
60 :
61 0 : if (aMetadata->GetKind() == TrackMetadataBase::METADATA_VORBIS) {
62 0 : VorbisMetadata* meta = static_cast<VorbisMetadata*>(aMetadata);
63 0 : MOZ_ASSERT(meta, "Cannot find vorbis encoder metadata");
64 0 : mEbmlComposer->SetAudioConfig(meta->mSamplingFrequency, meta->mChannels);
65 0 : mEbmlComposer->SetAudioCodecPrivateData(meta->mData);
66 0 : mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_AUDIO_TRACK;
67 : }
68 :
69 0 : if (aMetadata->GetKind() == TrackMetadataBase::METADATA_OPUS) {
70 0 : OpusMetadata* meta = static_cast<OpusMetadata*>(aMetadata);
71 0 : MOZ_ASSERT(meta, "Cannot find Opus encoder metadata");
72 0 : mEbmlComposer->SetAudioConfig(meta->mSamplingFrequency, meta->mChannels);
73 0 : mEbmlComposer->SetAudioCodecPrivateData(meta->mIdHeader);
74 0 : mMetadataRequiredFlag = mMetadataRequiredFlag & ~ContainerWriter::CREATE_AUDIO_TRACK;
75 : }
76 :
77 0 : if (!mMetadataRequiredFlag) {
78 0 : mEbmlComposer->GenerateHeader();
79 : }
80 0 : return NS_OK;
81 : }
82 :
83 : } // namespace mozilla
|