gecko-dev/dom/media/encoder/OpusTrackEncoder.h
Bryce Van Dyk f2da582b18 Bug 1014393 - Remove EncodedFrameContainer. r=pehrsons
Remove EncodedFrameContainer and clean up areas where it was used.
EncodedFrameContainer provided a wrapper around an
nsTArray<RefPtr<EncodedFrame>>, but it simplifies the code to simply expose
this array. Also clean up unused enums in EncodedFrame, and clean up some of
the outdated comments for our encoded frame handling.

Differential Revision: https://phabricator.services.mozilla.com/D35384

--HG--
rename : dom/media/encoder/EncodedFrameContainer.h => dom/media/encoder/EncodedFrame.h
extra : moz-landing-system : lando
2019-08-03 17:27:16 +00:00

90 lines
2.6 KiB
C++

/* -*- 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/. */
#ifndef OpusTrackEncoder_h_
#define OpusTrackEncoder_h_
#include <stdint.h>
#include <speex/speex_resampler.h>
#include "TrackEncoder.h"
struct OpusEncoder;
namespace mozilla {
// Opus meta data structure
class OpusMetadata : public TrackMetadataBase {
public:
// The ID Header of OggOpus. refer to http://wiki.xiph.org/OggOpus.
nsTArray<uint8_t> mIdHeader;
// The Comment Header of OggOpus.
nsTArray<uint8_t> mCommentHeader;
int32_t mChannels;
float mSamplingFrequency;
MetadataKind GetKind() const override { return METADATA_OPUS; }
};
class OpusTrackEncoder : public AudioTrackEncoder {
public:
explicit OpusTrackEncoder(TrackRate aTrackRate);
virtual ~OpusTrackEncoder();
already_AddRefed<TrackMetadataBase> GetMetadata() override;
nsresult GetEncodedTrack(nsTArray<RefPtr<EncodedFrame>>& aData) override;
protected:
int GetPacketDuration() override;
nsresult Init(int aChannels, int aSamplingRate) override;
/**
* Get the samplerate of the data to be fed to the Opus encoder. This might be
* different from the input samplerate if resampling occurs.
*/
int GetOutputSampleRate();
private:
/**
* The Opus encoder from libopus.
*/
OpusEncoder* mEncoder;
/**
* A local segment queue which takes the raw data out from mRawSegment in the
* call of GetEncodedTrack(). Opus encoder only accepts GetPacketDuration()
* samples from mSourceSegment every encoding cycle, thus it needs to be
* global in order to store the leftover segments taken from mRawSegment.
*/
AudioSegment mSourceSegment;
/**
* Total samples of delay added by codec, can be queried by the encoder. From
* the perspective of decoding, real data begins this many samples late, so
* the encoder needs to append this many null samples to the end of stream,
* in order to align the time of input and output.
*/
int mLookahead;
/**
* If the input sample rate does not divide 48kHz evenly, the input data are
* resampled.
*/
SpeexResamplerState* mResampler;
/**
* Store the resampled frames that don't fit into an Opus packet duration.
* They will be prepended to the resampled frames next encoding cycle.
*/
nsTArray<AudioDataValue> mResampledLeftover;
// TimeStamp in microseconds.
uint64_t mOutputTimeStamp;
};
} // namespace mozilla
#endif