[EME] Diagnostic assert when disabling EME while playing EME content

Assigned to



4 years ago
2 years ago


(Reporter: cpearce, Assigned: cpearce)


(Blocks: 1 bug)

Firefox Tracking Flags

(Not tracked)




4 years ago
I was playing the mse-access demo and I disabled EME from options and I got a fatal assertion.

GMP thread:

SharedDecoderCallback::AssertHaveActiveProxy() Line 65	C++
SharedDecoderCallback::Error() Line 30	C++
MediaDataDecoderCallbackProxy::Error() Line 16	C++
VideoCallbackAdapter::Terminated() Line 104	C++
gmp::GMPVideoDecoderParent::Shutdown() Line 213	C++
gmp::GMPVideoDecoderParent::RecvShutdown() Line 346	C++
gmp::PGMPVideoDecoderParent::OnMessageReceived(const IPC::Message & msg__) Line 469	C++
gmp::PGMPContentParent::OnMessageReceived(const IPC::Message & msg__) Line 568	C++

Decode task queue:

ReentrantMonitor::Wait(unsigned int aInterval) Line 471	C++
ReentrantMonitorAutoEnter::Wait(unsigned int aInterval) Line 191	C++
nsEventQueue::GetEvent(bool aMayWait, nsIRunnable * * aResult) Line 66	C++
nsThread::nsChainedEventQueue::GetEvent(bool aMayWait, nsIRunnable * * aEvent) Line 117	C++
nsThread::ProcessNextEvent(bool aMayWait, bool * aResult) Line 835	C++
NS_ProcessNextEvent(nsIThread * aThread, bool aMayWait) Line 265	C++
nsThread::DispatchInternal(nsIRunnable * aEvent, unsigned int aFlags, nsThread::nsNestedEventTarget * aTarget) Line 566	C++
nsThread::Dispatch(nsIRunnable * aEvent, unsigned int aFlags) Line 584	C++
MediaDataDecoderProxy::Shutdown() Line 90	C++
EMEMediaDataDecoderProxy::Shutdown() Line 167	C++
H264Converter::Shutdown() Line 104	C++
SharedDecoderManager::Shutdown() Line 206	C++
MediaSourceReader::ContinueShutdown() Line 517	C++
MediaPromise<bool,bool,0>::InvokeCallbackMethod<mozilla::MediaSourceReader,bool>(mozilla::MediaSourceReader * aThisVal, void (void) * aMethod, bool aValue) Line 249	C++
MediaPromise<bool,bool,0>::MethodThenValue<mozilla::MediaSourceReader,void (__thiscall mozilla::MediaSourceReader::*)(void),void (__thiscall mozilla::MediaSourceReader::*)(void)>::DoResolveOrRejectInternal(mozilla::MediaPromise<bool,bool,0>::ResolveOrRejectValue & aValue) Line 277	C++
MediaPromise<bool,bool,0>::ThenValueBase::DoResolveOrReject(mozilla::MediaPromise<bool,bool,0>::ResolveOrRejectValue & aValue) Line 219	C++
MediaPromise<bool,bool,0>::ThenValueBase::ResolveOrRejectRunnable::Run() Line 170	C++
MediaTaskQueue::Runner::Run() Line 258	C++

Comment 1

4 years ago
Problem is that we handle the CDM crash in two places; in the MediaKeys and in the GMPVideoDecoder. They're racing to see who can shutdown the SDM first. If the MediaKeys gets in first, it'll cause the SDM to shutdown, and when the GMPVideodEcoder's MediaDecoderCallbackProxy tries to call the SDM::Error() callback, we'll hit this assert.

Comment 2

4 years ago
Seems I have to have it paused and in a background tab and then have the video go dormant to repro the assertion. This causes SDM::SetIdle() to be called, which clears the active proxy.
One more reason to get rid of SharedDecoderManager.
Component: Audio/Video → Audio/Video: Playback
Mass change P2 -> P3
Priority: P2 → P3
You need to log in before you can comment on or make changes to this bug.