mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-08 19:04:45 +00:00
Bug 1840399 - Fix static-analysis warnings in MediaFormatReader. r=media-playback-reviewers,webidl,saschanaz,alwu
Differential Revision: https://phabricator.services.mozilla.com/D182189
This commit is contained in:
parent
30413328ea
commit
bb102802b7
@ -56,7 +56,7 @@ mozilla::LazyLogModule gMediaDemuxerLog("MediaDemuxer");
|
||||
|
||||
namespace mozilla {
|
||||
|
||||
typedef void* MediaDataDecoderID;
|
||||
using MediaDataDecoderID = void *;
|
||||
|
||||
/**
|
||||
* This class tracks shutdown promises to ensure all decoders are shut down
|
||||
@ -73,7 +73,7 @@ class MediaFormatReader::ShutdownPromisePool {
|
||||
RefPtr<ShutdownPromise> Shutdown();
|
||||
|
||||
// Track a shutdown promise.
|
||||
void Track(RefPtr<ShutdownPromise> aPromise);
|
||||
void Track(const RefPtr<ShutdownPromise>& aPromise);
|
||||
|
||||
// Shut down a decoder and track its shutdown promise.
|
||||
void ShutdownDecoder(already_AddRefed<MediaDataDecoder> aDecoder) {
|
||||
@ -96,7 +96,7 @@ RefPtr<ShutdownPromise> MediaFormatReader::ShutdownPromisePool::Shutdown() {
|
||||
}
|
||||
|
||||
void MediaFormatReader::ShutdownPromisePool::Track(
|
||||
RefPtr<ShutdownPromise> aPromise) {
|
||||
const RefPtr<ShutdownPromise>& aPromise) {
|
||||
MOZ_DIAGNOSTIC_ASSERT(!mShutdown);
|
||||
MOZ_DIAGNOSTIC_ASSERT(!mPromises.Contains(aPromise));
|
||||
mPromises.Insert(aPromise);
|
||||
@ -1069,7 +1069,7 @@ bool MediaFormatReader::ResolveSetCDMPromiseIfDone(TrackType aTrack) {
|
||||
|
||||
if (mSetCDMForTracks.isEmpty()) {
|
||||
LOGV("%s : Done ", __func__);
|
||||
mSetCDMPromise.Resolve(/* aIgnored = */ true, __func__);
|
||||
mSetCDMPromise.Resolve(/* aResolveValue = */ true, __func__);
|
||||
if (HasAudio()) {
|
||||
ScheduleUpdate(TrackInfo::kAudioTrack);
|
||||
}
|
||||
@ -1135,7 +1135,7 @@ RefPtr<SetCDMPromise> MediaFormatReader::SetCDMProxy(CDMProxy* aProxy) {
|
||||
// 3) A null cdm proxy is set
|
||||
// the promise can be resolved directly.
|
||||
mSetCDMForTracks.clear();
|
||||
return SetCDMPromise::CreateAndResolve(/* aIgnored = */ true, __func__);
|
||||
return SetCDMPromise::CreateAndResolve(/* aResolveValue = */ true, __func__);
|
||||
}
|
||||
|
||||
RefPtr<SetCDMPromise> p = mSetCDMPromise.Ensure(__func__);
|
||||
@ -1559,16 +1559,16 @@ void MediaFormatReader::DoDemuxVideo() {
|
||||
p->Then(
|
||||
OwnerThread(), __func__,
|
||||
[self, perfRecorder(std::move(perfRecorder))](
|
||||
RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) mutable {
|
||||
const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples) mutable {
|
||||
perfRecorder.Record();
|
||||
self->OnVideoDemuxCompleted(std::move(aSamples));
|
||||
self->OnVideoDemuxCompleted(aSamples);
|
||||
},
|
||||
[self](const MediaResult& aError) { self->OnVideoDemuxFailed(aError); })
|
||||
->Track(mVideo.mDemuxRequest);
|
||||
}
|
||||
|
||||
void MediaFormatReader::OnVideoDemuxCompleted(
|
||||
RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) {
|
||||
const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples) {
|
||||
AUTO_PROFILER_LABEL("MediaFormatReader::OnVideoDemuxCompleted",
|
||||
MEDIA_PLAYBACK);
|
||||
LOGV("%zu video samples demuxed (sid:%d)", aSamples->GetSamples().Length(),
|
||||
@ -1654,16 +1654,16 @@ void MediaFormatReader::DoDemuxAudio() {
|
||||
p->Then(
|
||||
OwnerThread(), __func__,
|
||||
[self, perfRecorder(std::move(perfRecorder))](
|
||||
RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) mutable {
|
||||
const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples) mutable {
|
||||
perfRecorder.Record();
|
||||
self->OnAudioDemuxCompleted(std::move(aSamples));
|
||||
self->OnAudioDemuxCompleted(aSamples);
|
||||
},
|
||||
[self](const MediaResult& aError) { self->OnAudioDemuxFailed(aError); })
|
||||
->Track(mAudio.mDemuxRequest);
|
||||
}
|
||||
|
||||
void MediaFormatReader::OnAudioDemuxCompleted(
|
||||
RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) {
|
||||
const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples) {
|
||||
LOGV("%zu audio samples demuxed (sid:%d)", aSamples->GetSamples().Length(),
|
||||
aSamples->GetSamples()[0]->mTrackInfo
|
||||
? aSamples->GetSamples()[0]->mTrackInfo->GetID()
|
||||
@ -1684,7 +1684,7 @@ void MediaFormatReader::NotifyNewOutput(
|
||||
DDLOG(DDLogCategory::Log,
|
||||
aTrack == TrackInfo::kAudioTrack ? "decoded_audio" : "decoded_video",
|
||||
"no output samples");
|
||||
} else
|
||||
} else {
|
||||
for (auto&& sample : aResults) {
|
||||
if (DecoderDoctorLogger::IsDDLoggingEnabled()) {
|
||||
switch (sample->mType) {
|
||||
@ -1759,6 +1759,7 @@ void MediaFormatReader::NotifyNewOutput(
|
||||
decoder.mNumOfConsecutiveUtilityCrashes = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
LOG("Done processing new %s samples", TrackTypeToStr(aTrack));
|
||||
|
||||
if (!aResults.IsEmpty()) {
|
||||
@ -2683,7 +2684,7 @@ RefPtr<MediaFormatReader::WaitForDataPromise> MediaFormatReader::WaitForData(
|
||||
return p;
|
||||
}
|
||||
|
||||
nsresult MediaFormatReader::ResetDecode(TrackSet aTracks) {
|
||||
nsresult MediaFormatReader::ResetDecode(const TrackSet& aTracks) {
|
||||
AUTO_PROFILER_LABEL("MediaFormatReader::ResetDecode", MEDIA_PLAYBACK);
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
LOGV("");
|
||||
@ -3303,30 +3304,29 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) {
|
||||
aInfo.mAudioState.mHasPromise = mAudio.HasPromise();
|
||||
aInfo.mAudioState.mWaitingPromise = !mAudio.mWaitingPromise.IsEmpty();
|
||||
aInfo.mAudioState.mHasDemuxRequest = mAudio.mDemuxRequest.Exists();
|
||||
aInfo.mAudioState.mDemuxQueueSize =
|
||||
uint32_t(mAudio.mQueuedSamples.Length());
|
||||
aInfo.mAudioState.mDemuxQueueSize = AssertedCast<int>(mAudio.mQueuedSamples.Length());
|
||||
aInfo.mAudioState.mHasDecoder = mAudio.mDecodeRequest.Exists();
|
||||
aInfo.mAudioState.mTimeTreshold =
|
||||
mAudio.mTimeThreshold ? mAudio.mTimeThreshold.ref().Time().ToSeconds()
|
||||
: -1.0;
|
||||
aInfo.mAudioState.mTimeTresholdHasSeeked =
|
||||
mAudio.mTimeThreshold ? mAudio.mTimeThreshold.ref().mHasSeeked : false;
|
||||
aInfo.mAudioState.mNumSamplesInput = mAudio.mNumSamplesInput;
|
||||
aInfo.mAudioState.mNumSamplesOutput = mAudio.mNumSamplesOutput;
|
||||
aInfo.mAudioState.mQueueSize = size_t(mAudio.mSizeOfQueue);
|
||||
aInfo.mAudioState.mPending = mAudio.mOutput.Length();
|
||||
aInfo.mAudioState.mNumSamplesInput = AssertedCast<int64_t>(mAudio.mNumSamplesInput);
|
||||
aInfo.mAudioState.mNumSamplesOutput = AssertedCast<int64_t>(mAudio.mNumSamplesOutput);
|
||||
aInfo.mAudioState.mQueueSize = AssertedCast<int32_t>(size_t(mAudio.mSizeOfQueue));
|
||||
aInfo.mAudioState.mPending = AssertedCast<int>(mAudio.mOutput.Length());
|
||||
aInfo.mAudioState.mWaitingForData = mAudio.mWaitingForData;
|
||||
aInfo.mAudioState.mDemuxEOS = mAudio.mDemuxEOS;
|
||||
aInfo.mAudioState.mDrainState = int32_t(mAudio.mDrainState);
|
||||
aInfo.mAudioState.mWaitingForKey = mAudio.mWaitingForKey;
|
||||
aInfo.mAudioState.mLastStreamSourceID = mAudio.mLastStreamSourceID;
|
||||
aInfo.mAudioState.mLastStreamSourceID = AssertedCast<int64_t>(mAudio.mLastStreamSourceID);
|
||||
}
|
||||
|
||||
CopyUTF8toUTF16(audioDecoderName, aInfo.mAudioDecoderName);
|
||||
CopyUTF8toUTF16(audioType, aInfo.mAudioType);
|
||||
aInfo.mAudioChannels = audioInfo.mChannels;
|
||||
aInfo.mAudioChannels = AssertedCast<int32_t>(audioInfo.mChannels);
|
||||
aInfo.mAudioRate = audioInfo.mRate;
|
||||
aInfo.mAudioFramesDecoded = mAudio.mNumSamplesOutputTotal;
|
||||
aInfo.mAudioFramesDecoded = AssertedCast<int64_t>(mAudio.mNumSamplesOutputTotal);
|
||||
|
||||
VideoInfo videoInfo;
|
||||
if (HasVideo()) {
|
||||
@ -3338,23 +3338,22 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) {
|
||||
aInfo.mVideoState.mHasPromise = mVideo.HasPromise();
|
||||
aInfo.mVideoState.mWaitingPromise = !mVideo.mWaitingPromise.IsEmpty();
|
||||
aInfo.mVideoState.mHasDemuxRequest = mVideo.mDemuxRequest.Exists();
|
||||
aInfo.mVideoState.mDemuxQueueSize =
|
||||
uint32_t(mVideo.mQueuedSamples.Length());
|
||||
aInfo.mVideoState.mDemuxQueueSize = AssertedCast<int32_t>(mVideo.mQueuedSamples.Length());
|
||||
aInfo.mVideoState.mHasDecoder = mVideo.mDecodeRequest.Exists();
|
||||
aInfo.mVideoState.mTimeTreshold =
|
||||
mVideo.mTimeThreshold ? mVideo.mTimeThreshold.ref().Time().ToSeconds()
|
||||
: -1.0;
|
||||
aInfo.mVideoState.mTimeTresholdHasSeeked =
|
||||
mVideo.mTimeThreshold ? mVideo.mTimeThreshold.ref().mHasSeeked : false;
|
||||
aInfo.mVideoState.mNumSamplesInput = mVideo.mNumSamplesInput;
|
||||
aInfo.mVideoState.mNumSamplesOutput = mVideo.mNumSamplesOutput;
|
||||
aInfo.mVideoState.mQueueSize = size_t(mVideo.mSizeOfQueue);
|
||||
aInfo.mVideoState.mPending = mVideo.mOutput.Length();
|
||||
aInfo.mVideoState.mNumSamplesInput = AssertedCast<int64_t>(mVideo.mNumSamplesInput);
|
||||
aInfo.mVideoState.mNumSamplesOutput = AssertedCast<int64_t>(mVideo.mNumSamplesOutput);
|
||||
aInfo.mVideoState.mQueueSize = AssertedCast<int32_t>(size_t(mVideo.mSizeOfQueue));
|
||||
aInfo.mVideoState.mPending = AssertedCast<int32_t>(mVideo.mOutput.Length());
|
||||
aInfo.mVideoState.mWaitingForData = mVideo.mWaitingForData;
|
||||
aInfo.mVideoState.mDemuxEOS = mVideo.mDemuxEOS;
|
||||
aInfo.mVideoState.mDrainState = int32_t(mVideo.mDrainState);
|
||||
aInfo.mVideoState.mWaitingForKey = mVideo.mWaitingForKey;
|
||||
aInfo.mVideoState.mLastStreamSourceID = mVideo.mLastStreamSourceID;
|
||||
aInfo.mVideoState.mLastStreamSourceID = AssertedCast<int64_t>(mVideo.mLastStreamSourceID);
|
||||
}
|
||||
|
||||
CopyUTF8toUTF16(videoDecoderName, aInfo.mVideoDecoderName);
|
||||
@ -3365,14 +3364,14 @@ void MediaFormatReader::GetDebugInfo(dom::MediaFormatReaderDebugInfo& aInfo) {
|
||||
videoInfo.mDisplay.height < 0 ? 0 : videoInfo.mDisplay.height;
|
||||
aInfo.mVideoRate = mVideo.mMeanRate.Mean();
|
||||
aInfo.mVideoHardwareAccelerated = VideoIsHardwareAccelerated();
|
||||
aInfo.mVideoNumSamplesOutputTotal = mVideo.mNumSamplesOutputTotal;
|
||||
aInfo.mVideoNumSamplesSkippedTotal = mVideo.mNumSamplesSkippedTotal;
|
||||
aInfo.mVideoNumSamplesOutputTotal = AssertedCast<int64_t>(mVideo.mNumSamplesOutputTotal);
|
||||
aInfo.mVideoNumSamplesSkippedTotal = AssertedCast<int64_t>(mVideo.mNumSamplesSkippedTotal);
|
||||
|
||||
// Looking at dropped frames
|
||||
FrameStatisticsData stats = mFrameStats->GetFrameStatisticsData();
|
||||
aInfo.mFrameStats.mDroppedDecodedFrames = stats.mDroppedDecodedFrames;
|
||||
aInfo.mFrameStats.mDroppedSinkFrames = stats.mDroppedSinkFrames;
|
||||
aInfo.mFrameStats.mDroppedCompositorFrames = stats.mDroppedCompositorFrames;
|
||||
aInfo.mFrameStats.mDroppedDecodedFrames = AssertedCast<int64_t>(stats.mDroppedDecodedFrames);
|
||||
aInfo.mFrameStats.mDroppedSinkFrames = AssertedCast<int64_t>(stats.mDroppedSinkFrames);
|
||||
aInfo.mFrameStats.mDroppedCompositorFrames = AssertedCast<int64_t>(stats.mDroppedCompositorFrames);
|
||||
}
|
||||
|
||||
void MediaFormatReader::SetVideoNullDecode(bool aIsNullDecode) {
|
||||
@ -3403,7 +3402,7 @@ void MediaFormatReader::SetNullDecode(TrackType aTrack, bool aIsNullDecode) {
|
||||
|
||||
void MediaFormatReader::OnFirstDemuxCompleted(
|
||||
TrackInfo::TrackType aType,
|
||||
RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples) {
|
||||
const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples) {
|
||||
AUTO_PROFILER_LABEL("MediaFormatReader::OnFirstDemuxCompleted",
|
||||
MEDIA_PLAYBACK);
|
||||
MOZ_ASSERT(OnTaskQueue());
|
||||
|
@ -56,7 +56,7 @@ struct MetadataHolder {
|
||||
UniquePtr<MetadataTags> mTags;
|
||||
};
|
||||
|
||||
typedef void* MediaDecoderOwnerID;
|
||||
using MediaDecoderOwnerID = void *;
|
||||
|
||||
struct MOZ_STACK_CLASS MediaFormatReaderInit {
|
||||
MediaResource* mResource = nullptr;
|
||||
@ -75,8 +75,8 @@ class MediaFormatReader final
|
||||
: public SupportsThreadSafeWeakPtr<MediaFormatReader>,
|
||||
public DecoderDoctorLifeLogger<MediaFormatReader> {
|
||||
static const bool IsExclusive = true;
|
||||
typedef TrackInfo::TrackType TrackType;
|
||||
typedef MozPromise<bool, MediaResult, IsExclusive> NotifyDataArrivedPromise;
|
||||
using TrackType = TrackInfo::TrackType;
|
||||
using NotifyDataArrivedPromise = MozPromise<bool, MediaResult, IsExclusive>;
|
||||
|
||||
public:
|
||||
MOZ_DECLARE_REFCOUNTED_TYPENAME(MediaFormatReader)
|
||||
@ -161,7 +161,7 @@ class MediaFormatReader final
|
||||
//
|
||||
// aParam is a set of TrackInfo::TrackType enums specifying which
|
||||
// queues need to be reset, defaulting to both audio and video tracks.
|
||||
nsresult ResetDecode(TrackSet aTracks);
|
||||
nsresult ResetDecode(const TrackSet& aTracks);
|
||||
|
||||
// Destroys the decoding state. The reader cannot be made usable again.
|
||||
// This is different from ReleaseMediaResources() as it is irreversable,
|
||||
@ -501,32 +501,35 @@ class MediaFormatReader final
|
||||
// if we have too many, or if warnings should be treated as errors.
|
||||
return mNumOfConsecutiveDecodingError > mMaxConsecutiveDecodingError ||
|
||||
StaticPrefs::media_playback_warnings_as_errors();
|
||||
} else if (mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER) {
|
||||
}
|
||||
if (mError.ref() == NS_ERROR_DOM_MEDIA_NEED_NEW_DECODER) {
|
||||
// If the caller asked for a new decoder we shouldn't treat
|
||||
// it as fatal.
|
||||
return false;
|
||||
} else if (mError.ref() ==
|
||||
}
|
||||
if (mError.ref() ==
|
||||
NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_RDD_OR_GPU_ERR) {
|
||||
// Allow RDD crashes to be non-fatal, but give up
|
||||
// if we have too many, or if warnings should be treated as errors.
|
||||
return mNumOfConsecutiveRDDOrGPUCrashes >
|
||||
mMaxConsecutiveRDDOrGPUCrashes ||
|
||||
StaticPrefs::media_playback_warnings_as_errors();
|
||||
} else if (mError.ref() ==
|
||||
}
|
||||
if (mError.ref() ==
|
||||
NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_UTILITY_ERR) {
|
||||
bool tooManyConsecutiveCrashes =
|
||||
mNumOfConsecutiveUtilityCrashes > mMaxConsecutiveUtilityCrashes;
|
||||
// TODO: Telemetry?
|
||||
return tooManyConsecutiveCrashes ||
|
||||
StaticPrefs::media_playback_warnings_as_errors();
|
||||
} else if (mError.ref() ==
|
||||
}
|
||||
if (mError.ref() ==
|
||||
NS_ERROR_DOM_MEDIA_REMOTE_DECODER_CRASHED_MF_CDM_ERR) {
|
||||
return false;
|
||||
} else {
|
||||
}
|
||||
// All other error types are fatal
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// If set, all decoded samples prior mTimeThreshold will be dropped.
|
||||
// Used for internal seeking when a change of stream is detected or when
|
||||
@ -650,7 +653,8 @@ class MediaFormatReader final
|
||||
if (aValue == media::TimeUnit::Zero()) {
|
||||
return;
|
||||
}
|
||||
mMean += (1.0f / aValue.ToSeconds() - mMean) / ++mCount;
|
||||
mMean += static_cast<float>((1.0f / aValue.ToSeconds() - mMean) /
|
||||
static_cast<double>(++mCount));
|
||||
}
|
||||
|
||||
void Reset() {
|
||||
@ -734,13 +738,13 @@ class MediaFormatReader final
|
||||
void OnDemuxFailed(TrackType aTrack, const MediaResult& aError);
|
||||
|
||||
void DoDemuxVideo();
|
||||
void OnVideoDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
|
||||
void OnVideoDemuxCompleted(const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples);
|
||||
void OnVideoDemuxFailed(const MediaResult& aError) {
|
||||
OnDemuxFailed(TrackType::kVideoTrack, aError);
|
||||
}
|
||||
|
||||
void DoDemuxAudio();
|
||||
void OnAudioDemuxCompleted(RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
|
||||
void OnAudioDemuxCompleted(const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples);
|
||||
void OnAudioDemuxFailed(const MediaResult& aError) {
|
||||
OnDemuxFailed(TrackType::kAudioTrack, aError);
|
||||
}
|
||||
@ -819,7 +823,7 @@ class MediaFormatReader final
|
||||
MediaEventListener mOnTrackWaitingForKeyListener;
|
||||
|
||||
void OnFirstDemuxCompleted(TrackInfo::TrackType aType,
|
||||
RefPtr<MediaTrackDemuxer::SamplesHolder> aSamples);
|
||||
const RefPtr<MediaTrackDemuxer::SamplesHolder>& aSamples);
|
||||
|
||||
void OnFirstDemuxFailed(TrackInfo::TrackType aType,
|
||||
const MediaResult& aError);
|
||||
|
@ -169,7 +169,7 @@ dictionary MediaStateDebugInfo {
|
||||
long demuxEOS = 0;
|
||||
long drainState = 0;
|
||||
boolean waitingForKey = false;
|
||||
long lastStreamSourceID = 0;
|
||||
long long lastStreamSourceID = 0;
|
||||
};
|
||||
|
||||
dictionary MediaFrameStats {
|
||||
|
Loading…
Reference in New Issue
Block a user