зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
1ad47078f4
Коммит
7e16a99879
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче