зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1662805 - Replace instantaneous audibility decisions for MediaStream and regular playback with the AudibilityMonitor. r=pehrsons
Depends on D89634 Differential Revision: https://phabricator.services.mozilla.com/D89635
This commit is contained in:
Родитель
86f7c4ac6f
Коммит
f07e869482
|
@ -35,14 +35,6 @@ using media::TimeUnit;
|
|||
const char* AudioData::sTypeName = "audio";
|
||||
const char* VideoData::sTypeName = "video";
|
||||
|
||||
bool IsDataLoudnessHearable(const AudioDataValue aData) {
|
||||
// We can transfer the digital value to dBFS via following formula. According
|
||||
// to American SMPTE standard, 0 dBu equals -20 dBFS. In theory 0 dBu is still
|
||||
// hearable, so we choose a smaller value as our threshold. If the loudness
|
||||
// is under this threshold, it might not be hearable.
|
||||
return 20.0f * std::log10(AudioSampleToFloat(aData)) > -100;
|
||||
}
|
||||
|
||||
AudioData::AudioData(int64_t aOffset, const media::TimeUnit& aTime,
|
||||
AlignedAudioBuffer&& aData, uint32_t aChannels,
|
||||
uint32_t aRate, uint32_t aChannelMap)
|
||||
|
@ -143,23 +135,6 @@ size_t AudioData::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const {
|
|||
return size;
|
||||
}
|
||||
|
||||
bool AudioData::IsAudible() const {
|
||||
if (!mAudioData) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const AudioDataValue* data = GetAdjustedData();
|
||||
|
||||
for (uint32_t frame = 0; frame < mFrames; ++frame) {
|
||||
for (uint32_t channel = 0; channel < mChannels; ++channel) {
|
||||
if (IsDataLoudnessHearable(data[frame * mChannels + channel])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
AlignedAudioBuffer AudioData::MoveableData() {
|
||||
// Trim buffer according to trimming mask.
|
||||
mAudioData.PopFront(mDataOffset);
|
||||
|
|
|
@ -375,10 +375,6 @@ class AudioData : public MediaData {
|
|||
// If mAudioBuffer is null, creates it from mAudioData.
|
||||
void EnsureAudioBuffer();
|
||||
|
||||
// To check whether mAudioData has audible signal, it's used to distinguish
|
||||
// the audiable data and silent data.
|
||||
bool IsAudible() const;
|
||||
|
||||
// Return true if the adjusted time is valid. Caller should handle error when
|
||||
// the result is invalid.
|
||||
bool AdjustForStartTime(const media::TimeUnit& aStartTime) override;
|
||||
|
|
|
@ -68,6 +68,7 @@ AudioSink::AudioSink(AbstractThread* aThread,
|
|||
mFramesParsed(0),
|
||||
mOutputRate(DecideAudioPlaybackSampleRate(aInfo)),
|
||||
mOutputChannels(DecideAudioPlaybackChannels(aInfo)),
|
||||
mAudibilityMonitor(mOutputRate, 2.0),
|
||||
mAudioQueue(aAudioQueue)
|
||||
{ }
|
||||
|
||||
|
@ -316,7 +317,9 @@ void AudioSink::Errored() {
|
|||
void AudioSink::CheckIsAudible(const AudioData* aData) {
|
||||
MOZ_ASSERT(aData);
|
||||
|
||||
bool isAudible = aData->IsAudible();
|
||||
mAudibilityMonitor.ProcessAudioData(aData);
|
||||
bool isAudible = mAudibilityMonitor.RecentlyAudible();
|
||||
|
||||
if (isAudible != mIsAudioDataAudible) {
|
||||
mIsAudioDataAudible = isAudible;
|
||||
mAudibleEvent.Notify(mIsAudioDataAudible);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#define AudioSink_h__
|
||||
|
||||
#include "AudioStream.h"
|
||||
#include "AudibilityMonitor.h"
|
||||
#include "MediaEventSource.h"
|
||||
#include "MediaInfo.h"
|
||||
#include "MediaQueue.h"
|
||||
|
@ -161,10 +162,8 @@ class AudioSink : private AudioStream::DataSource {
|
|||
// Never modifed after construction.
|
||||
uint32_t mOutputRate;
|
||||
uint32_t mOutputChannels;
|
||||
|
||||
// True when audio is producing audible sound, false when audio is silent.
|
||||
AudibilityMonitor mAudibilityMonitor;
|
||||
bool mIsAudioDataAudible;
|
||||
|
||||
MediaEventProducer<bool> mAudibleEvent;
|
||||
|
||||
MediaQueue<AudioData>& mAudioQueue;
|
||||
|
|
|
@ -420,6 +420,7 @@ nsresult DecodedStream::Start(const TimeUnit& aStartTime,
|
|||
mPlaying = true;
|
||||
mPrincipalHandle.Connect(mCanonicalOutputPrincipal);
|
||||
mWatchManager.Watch(mPlaying, &DecodedStream::PlayingChanged);
|
||||
mAudibilityMonitor.emplace(AudibilityMonitor(mInfo.mAudio.mRate, 2.0f));
|
||||
ConnectListener();
|
||||
|
||||
class R : public Runnable {
|
||||
|
@ -517,6 +518,7 @@ void DecodedStream::Stop() {
|
|||
|
||||
mPrincipalHandle.DisconnectIfConnected();
|
||||
mWatchManager.Unwatch(mPlaying, &DecodedStream::PlayingChanged);
|
||||
mAudibilityMonitor.reset();
|
||||
}
|
||||
|
||||
bool DecodedStream::IsStarted() const {
|
||||
|
@ -674,7 +676,9 @@ void DecodedStream::SendAudio(double aVolume,
|
|||
void DecodedStream::CheckIsDataAudible(const AudioData* aData) {
|
||||
MOZ_ASSERT(aData);
|
||||
|
||||
bool isAudible = aData->IsAudible();
|
||||
mAudibilityMonitor->ProcessAudioData(aData);
|
||||
bool isAudible = mAudibilityMonitor->RecentlyAudible();
|
||||
|
||||
if (isAudible != mIsAudioDataAudible) {
|
||||
mIsAudioDataAudible = isAudible;
|
||||
mAudibleEvent.Notify(mIsAudioDataAudible);
|
||||
|
|
|
@ -111,6 +111,7 @@ class DecodedStream : public MediaSink {
|
|||
MediaInfo mInfo;
|
||||
// True when stream is producing audible sound, false when stream is silent.
|
||||
bool mIsAudioDataAudible = false;
|
||||
Maybe<AudibilityMonitor> mAudibilityMonitor;
|
||||
MediaEventProducer<bool> mAudibleEvent;
|
||||
|
||||
MediaQueue<AudioData>& mAudioQueue;
|
||||
|
|
Загрузка…
Ссылка в новой задаче