From d8bbc7858622b6d9c278469aab701ca0b609cddf Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 15 May 2024 05:35:49 +0200 Subject: Merging upstream version 126.0. Signed-off-by: Daniel Baumann --- dom/media/MediaFormatReader.cpp | 46 +++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 13 deletions(-) (limited to 'dom/media/MediaFormatReader.cpp') diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp index 9553e67b00..7eb8e4e5e2 100644 --- a/dom/media/MediaFormatReader.cpp +++ b/dom/media/MediaFormatReader.cpp @@ -891,7 +891,10 @@ MediaFormatReader::MediaFormatReader(MediaFormatReaderInit& aInit, "MediaFormatReader::mBuffered (Canonical)"), mFrameStats(aInit.mFrameStats), mMediaDecoderOwnerID(aInit.mMediaDecoderOwnerID), - mTrackingId(std::move(aInit.mTrackingId)) { + mTrackingId(std::move(aInit.mTrackingId)), + mReadMetadataStartTime(Nothing()), + mReadMetaDataTime(TimeDuration::Zero()), + mTotalWaitingForVideoDataTime(TimeDuration::Zero()) { MOZ_ASSERT(aDemuxer); MOZ_COUNT_CTOR(MediaFormatReader); DDLINKCHILD("audio decoder data", "MediaFormatReader::DecoderDataWithPromise", @@ -1162,6 +1165,10 @@ MediaFormatReader::AsyncReadMetadata() { return MetadataPromise::CreateAndResolve(std::move(metadata), __func__); } + if (!mReadMetadataStartTime) { + mReadMetadataStartTime = Some(TimeStamp::Now()); + } + RefPtr p = mMetadataPromise.Ensure(__func__); mDemuxer->Init() @@ -1342,6 +1349,11 @@ void MediaFormatReader::MaybeResolveMetadataPromise() { &MediaFormatReader::NotifyTrackInfoUpdated); mIsWatchingWorkingInfo = true; + if (mReadMetadataStartTime) { + mReadMetaDataTime = TimeStamp::Now() - *mReadMetadataStartTime; + mReadMetadataStartTime.reset(); + } + mMetadataPromise.Resolve(std::move(metadata), __func__); } @@ -1490,7 +1502,7 @@ void MediaFormatReader::OnDemuxFailed(TrackType aTrack, aTrack == TrackType::kVideoTrack ? "video_demux_interruption" : "audio_demux_interruption", aError); - if (!decoder.mWaitingForData) { + if (!decoder.mWaitingForDataStartTime) { decoder.RequestDrain(); } NotifyEndOfStream(aTrack); @@ -1500,7 +1512,7 @@ void MediaFormatReader::OnDemuxFailed(TrackType aTrack, aTrack == TrackType::kVideoTrack ? "video_demux_interruption" : "audio_demux_interruption", aError); - if (!decoder.mWaitingForData) { + if (!decoder.mWaitingForDataStartTime) { decoder.RequestDrain(); } NotifyWaitingForData(aTrack); @@ -1783,7 +1795,7 @@ void MediaFormatReader::NotifyError(TrackType aTrack, void MediaFormatReader::NotifyWaitingForData(TrackType aTrack) { MOZ_ASSERT(OnTaskQueue()); auto& decoder = GetDecoderData(aTrack); - decoder.mWaitingForData = true; + decoder.mWaitingForDataStartTime = Some(TimeStamp::Now()); if (decoder.mTimeThreshold) { decoder.mTimeThreshold.ref().mWaiting = true; } @@ -1848,7 +1860,7 @@ bool MediaFormatReader::UpdateReceivedNewData(TrackType aTrack) { return false; } - // We do not want to clear mWaitingForData while there are pending + // We do not want to clear mWaitingForDataStartTime while there are pending // demuxing or seeking operations that could affect the value of this flag. // This is in order to ensure that we will retry once they complete as we may // now have new data that could potentially allow those operations to @@ -1870,7 +1882,7 @@ bool MediaFormatReader::UpdateReceivedNewData(TrackType aTrack) { } if (decoder.HasPendingDrain()) { - // We do not want to clear mWaitingForData or mDemuxEOS while + // We do not want to clear mWaitingForDataStartTime or mDemuxEOS while // a drain is in progress in order to properly complete the operation. return false; } @@ -1879,7 +1891,11 @@ bool MediaFormatReader::UpdateReceivedNewData(TrackType aTrack) { if (decoder.mTimeThreshold) { decoder.mTimeThreshold.ref().mWaiting = false; } - decoder.mWaitingForData = false; + if (aTrack == TrackType::kVideoTrack && decoder.mWaitingForDataStartTime) { + mTotalWaitingForVideoDataTime += + TimeStamp::Now() - *decoder.mWaitingForDataStartTime; + } + decoder.mWaitingForDataStartTime.reset(); if (decoder.HasFatalError()) { return false; @@ -2390,7 +2406,7 @@ void MediaFormatReader::Update(TrackType aTrack) { NotifyDecoderBenchmarkStore(); } decoder.RejectPromise(NS_ERROR_DOM_MEDIA_END_OF_STREAM, __func__); - } else if (decoder.mWaitingForData) { + } else if (decoder.mWaitingForDataStartTime) { if (decoder.mDrainState == DrainState::DrainCompleted && decoder.mLastDecodedSampleTime && !decoder.mNextStreamSourceID) { // We have completed draining the decoder following WaitingForData. @@ -2562,8 +2578,9 @@ void MediaFormatReader::Update(TrackType aTrack) { decoder.mNumSamplesOutput, uint32_t(size_t(decoder.mSizeOfQueue)), decoder.mDecodeRequest.Exists(), decoder.mFlushing, decoder.mDescription.get(), uint32_t(decoder.mOutput.Length()), - decoder.mWaitingForData, decoder.mDemuxEOS, int32_t(decoder.mDrainState), - decoder.mLastStreamSourceID, IsDecoderWaitingForCDM(aTrack)); + !!decoder.mWaitingForDataStartTime, decoder.mDemuxEOS, + int32_t(decoder.mDrainState), decoder.mLastStreamSourceID, + IsDecoderWaitingForCDM(aTrack)); if (IsWaitingOnCDMResource() || !ResolveSetCDMPromiseIfDone(aTrack)) { // If the content is encrypted, MFR won't start to create decoder until @@ -2576,7 +2593,7 @@ void MediaFormatReader::Update(TrackType aTrack) { (decoder.IsWaitingForKey())) { // Nothing more we can do at present. LOGV("Still waiting for data or key. data(%d)/key(%d)", - decoder.mWaitingForData, decoder.mWaitingForKey); + !!decoder.mWaitingForDataStartTime, decoder.mWaitingForKey); return; } @@ -3319,7 +3336,7 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) { aInfo.mAudioState.mQueueSize = AssertedCast(size_t(mAudio.mSizeOfQueue)); aInfo.mAudioState.mPending = AssertedCast(mAudio.mOutput.Length()); - aInfo.mAudioState.mWaitingForData = mAudio.mWaitingForData; + aInfo.mAudioState.mWaitingForData = !!mAudio.mWaitingForDataStartTime; aInfo.mAudioState.mDemuxEOS = mAudio.mDemuxEOS; aInfo.mAudioState.mDrainState = int32_t(mAudio.mDrainState); aInfo.mAudioState.mWaitingForKey = mAudio.mWaitingForKey; @@ -3359,12 +3376,15 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) { aInfo.mVideoState.mQueueSize = AssertedCast(size_t(mVideo.mSizeOfQueue)); aInfo.mVideoState.mPending = AssertedCast(mVideo.mOutput.Length()); - aInfo.mVideoState.mWaitingForData = mVideo.mWaitingForData; + aInfo.mVideoState.mWaitingForData = !!mVideo.mWaitingForDataStartTime; aInfo.mVideoState.mDemuxEOS = mVideo.mDemuxEOS; aInfo.mVideoState.mDrainState = int32_t(mVideo.mDrainState); aInfo.mVideoState.mWaitingForKey = mVideo.mWaitingForKey; aInfo.mVideoState.mLastStreamSourceID = AssertedCast(mVideo.mLastStreamSourceID); + aInfo.mTotalReadMetadataTimeMs = mReadMetaDataTime.ToMilliseconds(); + aInfo.mTotalWaitingForVideoDataTimeMs = + mTotalWaitingForVideoDataTime.ToMilliseconds(); } CopyUTF8toUTF16(videoDecoderName, aInfo.mVideoDecoderName); -- cgit v1.2.3