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:
Paul Adenot 2023-08-08 12:12:54 +00:00
parent 30413328ea
commit bb102802b7
3 changed files with 54 additions and 51 deletions

View File

@ -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());

View File

@ -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);

View File

@ -169,7 +169,7 @@ dictionary MediaStateDebugInfo {
long demuxEOS = 0;
long drainState = 0;
boolean waitingForKey = false;
long lastStreamSourceID = 0;
long long lastStreamSourceID = 0;
};
dictionary MediaFrameStats {