The provisioning response and the pending session operations run on the handler thread and MediaDrm events
arrive on the main thread, while RemoteMediaDrmBridgeStub calls release() and the other entry points on a
binder thread. A release() in the middle of one of them could use the released MediaDrm and crash the process,
or start a handler thread that nothing quits. The entry points and those three paths now hold the bridge's
lock; the provisioning request itself stays outside it.
A second release() now returns early. The bridge releases itself after some MediaDrm failures, and the stub's
later release() used to throw before it finished its own teardown.
RemoteMediaDrmBridgeStub now updates its static list of stubs under the class lock Codec reads it with. Code
that read this state without a lock and has no callers is removed instead: isSecureDecoderComponentRequired(),
and MediaDrmProxy's getMediaCrypto() lookup with its proxy list, which takes getMediaCrypto() off the
GeckoMediaDrm interface.
A failed provisioning response now also rejects the queued session operations, which used to wait for a later
provisioning to succeed. A session that started the provisioning is rejected once, in release() as well.