mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 12:37:37 +00:00
ddedecabd0
--HG-- rename : content/media/nsAudioAvailableEventManager.cpp => content/media/AudioAvailableEventManager.cpp rename : content/media/nsAudioAvailableEventManager.h => content/media/AudioAvailableEventManager.h rename : content/media/nsAudioStream.cpp => content/media/AudioStream.cpp rename : content/media/nsAudioStream.h => content/media/AudioStream.h rename : content/media/nsMediaCache.cpp => content/media/MediaCache.cpp rename : content/media/nsMediaCache.h => content/media/MediaCache.h rename : content/media/nsBuiltinDecoder.cpp => content/media/MediaDecoder.cpp rename : content/media/nsBuiltinDecoder.h => content/media/MediaDecoder.h rename : content/media/nsBuiltinDecoderReader.cpp => content/media/MediaDecoderReader.cpp rename : content/media/nsBuiltinDecoderReader.h => content/media/MediaDecoderReader.h rename : content/media/nsBuiltinDecoderStateMachine.cpp => content/media/MediaDecoderStateMachine.cpp rename : content/media/nsBuiltinDecoderStateMachine.h => content/media/MediaDecoderStateMachine.h rename : content/media/dash/nsDASHDecoder.cpp => content/media/dash/DASHDecoder.cpp rename : content/media/dash/nsDASHDecoder.h => content/media/dash/DASHDecoder.h rename : content/media/dash/nsDASHReader.cpp => content/media/dash/DASHReader.cpp rename : content/media/dash/nsDASHReader.h => content/media/dash/DASHReader.h rename : content/media/dash/nsDASHRepDecoder.cpp => content/media/dash/DASHRepDecoder.cpp rename : content/media/dash/nsDASHRepDecoder.h => content/media/dash/DASHRepDecoder.h rename : content/media/gstreamer/nsGStreamerDecoder.cpp => content/media/gstreamer/GStreamerDecoder.cpp rename : content/media/gstreamer/nsGStreamerDecoder.h => content/media/gstreamer/GStreamerDecoder.h rename : content/media/gstreamer/nsGStreamerReader.cpp => content/media/gstreamer/GStreamerReader.cpp rename : content/media/gstreamer/nsGStreamerReader.h => content/media/gstreamer/GStreamerReader.h rename : content/media/ogg/nsOggCodecState.cpp => content/media/ogg/OggCodecState.cpp rename : content/media/ogg/nsOggCodecState.h => content/media/ogg/OggCodecState.h rename : content/media/ogg/nsOggDecoder.cpp => content/media/ogg/OggDecoder.cpp rename : content/media/ogg/nsOggDecoder.h => content/media/ogg/OggDecoder.h rename : content/media/ogg/nsOggReader.cpp => content/media/ogg/OggReader.cpp rename : content/media/ogg/nsOggReader.h => content/media/ogg/OggReader.h rename : content/media/omx/nsMediaOmxDecoder.cpp => content/media/omx/MediaOmxDecoder.cpp rename : content/media/omx/nsMediaOmxDecoder.h => content/media/omx/MediaOmxDecoder.h rename : content/media/omx/nsMediaOmxReader.cpp => content/media/omx/MediaOmxReader.cpp rename : content/media/omx/nsMediaOmxReader.h => content/media/omx/MediaOmxReader.h rename : content/media/plugins/nsMediaPluginDecoder.cpp => content/media/plugins/MediaPluginDecoder.cpp rename : content/media/plugins/nsMediaPluginDecoder.h => content/media/plugins/MediaPluginDecoder.h rename : content/media/plugins/nsMediaPluginHost.cpp => content/media/plugins/MediaPluginHost.cpp rename : content/media/plugins/nsMediaPluginHost.h => content/media/plugins/MediaPluginHost.h rename : content/media/plugins/nsMediaPluginReader.cpp => content/media/plugins/MediaPluginReader.cpp rename : content/media/plugins/nsMediaPluginReader.h => content/media/plugins/MediaPluginReader.h rename : content/media/raw/nsRawDecoder.cpp => content/media/raw/RawDecoder.cpp rename : content/media/raw/nsRawDecoder.h => content/media/raw/RawDecoder.h rename : content/media/raw/nsRawReader.cpp => content/media/raw/RawReader.cpp rename : content/media/raw/nsRawReader.h => content/media/raw/RawReader.h rename : content/media/raw/nsRawStructs.h => content/media/raw/RawStructs.h rename : content/media/wave/nsWaveDecoder.cpp => content/media/wave/WaveDecoder.cpp rename : content/media/wave/nsWaveDecoder.h => content/media/wave/WaveDecoder.h rename : content/media/wave/nsWaveReader.cpp => content/media/wave/WaveReader.cpp rename : content/media/wave/nsWaveReader.h => content/media/wave/WaveReader.h rename : content/media/webm/nsWebMBufferedParser.cpp => content/media/webm/WebMBufferedParser.cpp rename : content/media/webm/nsWebMBufferedParser.h => content/media/webm/WebMBufferedParser.h rename : content/media/webm/nsWebMDecoder.cpp => content/media/webm/WebMDecoder.cpp rename : content/media/webm/nsWebMDecoder.h => content/media/webm/WebMDecoder.h rename : content/media/webm/nsWebMReader.cpp => content/media/webm/WebMReader.cpp rename : content/media/webm/nsWebMReader.h => content/media/webm/WebMReader.h
123 lines
3.8 KiB
C++
123 lines
3.8 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 MOZILLA_AUDIOSEGMENT_H_
|
|
#define MOZILLA_AUDIOSEGMENT_H_
|
|
|
|
#include "MediaSegment.h"
|
|
#include "nsISupportsImpl.h"
|
|
#include "AudioSampleFormat.h"
|
|
#include "SharedBuffer.h"
|
|
|
|
namespace mozilla {
|
|
|
|
class AudioStream;
|
|
|
|
struct AudioChunk {
|
|
typedef mozilla::AudioSampleFormat SampleFormat;
|
|
|
|
// Generic methods
|
|
void SliceTo(TrackTicks aStart, TrackTicks aEnd)
|
|
{
|
|
NS_ASSERTION(aStart >= 0 && aStart < aEnd && aEnd <= mDuration,
|
|
"Slice out of bounds");
|
|
if (mBuffer) {
|
|
mOffset += int32_t(aStart);
|
|
}
|
|
mDuration = aEnd - aStart;
|
|
}
|
|
TrackTicks GetDuration() const { return mDuration; }
|
|
bool CanCombineWithFollowing(const AudioChunk& aOther) const
|
|
{
|
|
if (aOther.mBuffer != mBuffer) {
|
|
return false;
|
|
}
|
|
if (mBuffer) {
|
|
NS_ASSERTION(aOther.mBufferFormat == mBufferFormat && aOther.mBufferLength == mBufferLength,
|
|
"Wrong metadata about buffer");
|
|
return aOther.mOffset == mOffset + mDuration && aOther.mVolume == mVolume;
|
|
}
|
|
return true;
|
|
}
|
|
bool IsNull() const { return mBuffer == nullptr; }
|
|
void SetNull(TrackTicks aDuration)
|
|
{
|
|
mBuffer = nullptr;
|
|
mDuration = aDuration;
|
|
mOffset = 0;
|
|
mVolume = 1.0f;
|
|
}
|
|
|
|
TrackTicks mDuration; // in frames within the buffer
|
|
nsRefPtr<SharedBuffer> mBuffer; // null means data is all zeroes
|
|
int32_t mBufferLength; // number of frames in mBuffer (only meaningful if mBuffer is nonnull)
|
|
SampleFormat mBufferFormat; // format of frames in mBuffer (only meaningful if mBuffer is nonnull)
|
|
int32_t mOffset; // in frames within the buffer (zero if mBuffer is null)
|
|
float mVolume; // volume multiplier to apply (1.0f if mBuffer is nonnull)
|
|
};
|
|
|
|
/**
|
|
* A list of audio samples consisting of a sequence of slices of SharedBuffers.
|
|
* The audio rate is determined by the track, not stored in this class.
|
|
*/
|
|
class AudioSegment : public MediaSegmentBase<AudioSegment, AudioChunk> {
|
|
public:
|
|
typedef mozilla::AudioSampleFormat SampleFormat;
|
|
|
|
AudioSegment() : MediaSegmentBase<AudioSegment, AudioChunk>(AUDIO), mChannels(0) {}
|
|
|
|
bool IsInitialized()
|
|
{
|
|
return mChannels > 0;
|
|
}
|
|
void Init(int32_t aChannels)
|
|
{
|
|
NS_ASSERTION(aChannels > 0, "Bad number of channels");
|
|
NS_ASSERTION(!IsInitialized(), "Already initialized");
|
|
mChannels = aChannels;
|
|
}
|
|
int32_t GetChannels()
|
|
{
|
|
NS_ASSERTION(IsInitialized(), "Not initialized");
|
|
return mChannels;
|
|
}
|
|
void AppendFrames(already_AddRefed<SharedBuffer> aBuffer, int32_t aBufferLength,
|
|
int32_t aStart, int32_t aEnd, SampleFormat aFormat)
|
|
{
|
|
NS_ASSERTION(mChannels > 0, "Not initialized");
|
|
AudioChunk* chunk = AppendChunk(aEnd - aStart);
|
|
chunk->mBuffer = aBuffer;
|
|
chunk->mBufferFormat = aFormat;
|
|
chunk->mBufferLength = aBufferLength;
|
|
chunk->mOffset = aStart;
|
|
chunk->mVolume = 1.0f;
|
|
}
|
|
void ApplyVolume(float aVolume);
|
|
/**
|
|
* aOutput must have a matching number of channels, but we will automatically
|
|
* convert sample formats.
|
|
*/
|
|
void WriteTo(AudioStream* aOutput);
|
|
|
|
// Segment-generic methods not in MediaSegmentBase
|
|
void InitFrom(const AudioSegment& aOther)
|
|
{
|
|
NS_ASSERTION(mChannels == 0, "Channels already set");
|
|
mChannels = aOther.mChannels;
|
|
}
|
|
void CheckCompatible(const AudioSegment& aOther) const
|
|
{
|
|
NS_ASSERTION(aOther.mChannels == mChannels, "Non-matching channels");
|
|
}
|
|
static Type StaticType() { return AUDIO; }
|
|
|
|
protected:
|
|
int32_t mChannels;
|
|
};
|
|
|
|
}
|
|
|
|
#endif /* MOZILLA_AUDIOSEGMENT_H_ */
|