Bug 1627818 - part1 : allow DecodedStream to notify audible state change. r=padenot

`AudioSink` provides a way to let us know if the media data is audible, and we should do the same thing for the `DecodedStream`, in order to update the correct audible state.

Differential Revision: https://phabricator.services.mozilla.com/D70259
This commit is contained in:
alwu 2020-04-17 18:10:22 +00:00
Родитель 1ad47078f4
Коммит 7e16a99879
3 изменённых файлов: 28 добавлений и 8 удалений

Просмотреть файл

@ -2734,6 +2734,15 @@ void MediaDecoderStateMachine::AudioAudibleChanged(bool aAudible) {
}
MediaSink* MediaDecoderStateMachine::CreateAudioSink() {
if (mOutputCaptured) {
DecodedStream* stream =
new DecodedStream(this, mOutputTracks, mVolume, mPlaybackRate,
mPreservesPitch, mAudioQueue, mVideoQueue);
mAudibleListener = stream->AudibleEvent().Connect(
OwnerThread(), this, &MediaDecoderStateMachine::AudioAudibleChanged);
return stream;
}
RefPtr<MediaDecoderStateMachine> self = this;
auto audioSinkCreator = [self]() {
MOZ_ASSERT(self->OnTaskQueue());
@ -2752,12 +2761,7 @@ MediaSink* MediaDecoderStateMachine::CreateAudioSink() {
already_AddRefed<MediaSink> MediaDecoderStateMachine::CreateMediaSink() {
MOZ_ASSERT(OnTaskQueue());
RefPtr<MediaSink> audioSink =
mOutputCaptured
? new DecodedStream(this, mOutputTracks, mVolume, mPlaybackRate,
mPreservesPitch, mAudioQueue, mVideoQueue)
: CreateAudioSink();
RefPtr<MediaSink> audioSink = CreateAudioSink();
RefPtr<MediaSink> mediaSink =
new VideoSink(mTaskQueue, audioSink, mVideoQueue, mVideoFrameContainer,
*mFrameStats, sVideoQueueSendToCompositorSize);
@ -3113,12 +3117,11 @@ void MediaDecoderStateMachine::StopMediaSink() {
MOZ_ASSERT(OnTaskQueue());
if (mMediaSink->IsStarted()) {
LOG("Stop MediaSink");
mAudibleListener.DisconnectIfExists();
mMediaSink->Stop();
mMediaSinkAudioEndedPromise.DisconnectIfExists();
mMediaSinkVideoEndedPromise.DisconnectIfExists();
}
mAudibleListener.DisconnectIfExists();
}
void MediaDecoderStateMachine::RequestAudioData() {

Просмотреть файл

@ -654,6 +654,7 @@ void DecodedStream::SendAudio(double aVolume,
LOG_DS(LogLevel::Verbose, "Queueing audio [%" PRId64 ",%" PRId64 "]",
audio[i]->mTime.ToMicroseconds(),
audio[i]->GetEndTime().ToMicroseconds());
CheckIsDataAudible(audio[i]);
SendStreamAudio(mData.get(), mStartTime.ref(), audio[i], &output, rate,
aPrincipalHandle);
}
@ -670,6 +671,16 @@ void DecodedStream::SendAudio(double aVolume,
}
}
void DecodedStream::CheckIsDataAudible(const AudioData* aData) {
MOZ_ASSERT(aData);
bool isAudible = aData->IsAudible();
if (isAudible != mIsAudioDataAudible) {
mIsAudioDataAudible = isAudible;
mAudibleEvent.Notify(mIsAudioDataAudible);
}
}
void DecodedStreamData::WriteVideoToSegment(
layers::Image* aImage, const TimeUnit& aStart, const TimeUnit& aEnd,
const gfx::IntSize& aIntrinsicSize, const TimeStamp& aTimeStamp,

Просмотреть файл

@ -63,6 +63,8 @@ class DecodedStream : public MediaSink {
void Shutdown() override;
void GetDebugInfo(dom::MediaSinkDebugInfo& aInfo) override;
MediaEventSource<bool>& AudibleEvent() { return mAudibleEvent; }
protected:
virtual ~DecodedStream();
@ -74,6 +76,7 @@ class DecodedStream : public MediaSink {
void ResetVideo(const PrincipalHandle& aPrincipalHandle);
void SendData();
void NotifyOutput(int64_t aTime);
void CheckIsDataAudible(const AudioData* aData);
void AssertOwnerThread() const {
MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
@ -106,6 +109,9 @@ class DecodedStream : public MediaSink {
media::NullableTimeUnit mStartTime;
media::TimeUnit mLastOutputTime;
MediaInfo mInfo;
// True when stream is producing audible sound, false when stream is silent.
bool mIsAudioDataAudible = false;
MediaEventProducer<bool> mAudibleEvent;
MediaQueue<AudioData>& mAudioQueue;
MediaQueue<VideoData>& mVideoQueue;