Coverage Report

Created: 2018-09-25 14:53

/src/mozilla-central/dom/media/webm/WebMWriter.cpp
Line
Count
Source (jump to first uncovered line)
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
WebMWriter::WebMWriter(uint32_t aTrackTypes) : ContainerWriter()
14
0
{
15
0
  mMetadataRequiredFlag = aTrackTypes;
16
0
  mEbmlComposer = new EbmlComposer();
17
0
}
18
19
WebMWriter::~WebMWriter()
20
0
{
21
0
  // Out-of-line dtor so mEbmlComposer nsAutoPtr can delete a complete type.
22
0
}
23
24
nsresult
25
WebMWriter::WriteEncodedTrack(const EncodedFrameContainer& aData,
26
                              uint32_t aFlags)
27
0
{
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
0
  }
32
0
  return NS_OK;
33
0
}
34
35
nsresult
36
WebMWriter::GetContainerData(nsTArray<nsTArray<uint8_t> >* aOutputBufs,
37
                             uint32_t aFlags)
38
0
{
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
0
  }
44
0
  return NS_OK;
45
0
}
46
47
nsresult
48
WebMWriter::SetMetadata(TrackMetadataBase* aMetadata)
49
0
{
50
0
  MOZ_ASSERT(aMetadata);
51
0
  AUTO_PROFILER_LABEL("WebMWriter::SetMetadata", OTHER);
52
0
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
0
  }
60
0
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
0
  }
68
0
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
0
  }
76
0
77
0
  if (!mMetadataRequiredFlag) {
78
0
    mEbmlComposer->GenerateHeader();
79
0
  }
80
0
  return NS_OK;
81
0
}
82
83
} // namespace mozilla