Failed to instantiate drm object

Hi,

Lately, a few users have faced crashes while playing movies with DRM content.
Here is how the app handles the DRM-stream:

fun createSourceConfig(mainStreamUrl: String, drmUrl: String): : SourceConfig {
       return SourceConfig(mainStreamUrl, SourceType.Dash).apply {
            val widevineDrm = WidevineConfig(drmUrl)
            val header: MutableMap<String?, String?> = HashMap()
            header["utoken-drm"] = "wv"
            widevineDrm.httpHeaders = header
            this.drmConfig = widevineDrm
        }
}

It works fine so far and only a few users experienced the crash.
Bitmovin player version 3.55.0 → 3.60.0
Impacted devices:

Brand Model Android Version
(TV) D9 Manufacture Diyomate D9 PRO 5G Android 11.1
(TV) Google TV Chromecast Google TV (HD) Android 12
Samsung Galaxy Note10+ 5G, Galaxy S21 Ultra 5G Android 9
Huawei P30 Pro Android 9
Asus ROG Phone Android 9

This is the full crash logs:

com.bitmovin.player.core.y.d.acquireExoMediaDrm
Fatal Exception: androidx.media3.exoplayer.drm.UnsupportedDrmException
android.media.UnsupportedSchemeException: Failed to instantiate drm object.

Caused by android.media.UnsupportedSchemeException: Failed to instantiate drm object.
       at android.media.MediaDrm.native_setup(MediaDrm.java)
       at android.media.MediaDrm.<init>(MediaDrm.java:223)
       at androidx.media3.exoplayer.drm.FrameworkMediaDrm.<init>(FrameworkMediaDrm.java:117)
       at androidx.media3.exoplayer.drm.FrameworkMediaDrm.newInstance(FrameworkMediaDrm.java:105)
       at com.bitmovin.player.core.b0.d.acquireExoMediaDrm(SourceFile:1)
       at androidx.media3.exoplayer.drm.DefaultDrmSessionManager.prepare(DefaultDrmSessionManager.java:402)
       at androidx.media3.exoplayer.dash.DashMediaSource.prepareSourceInternal(DashMediaSource.java:572)
       at androidx.media3.exoplayer.source.BaseMediaSource.prepareSource(BaseMediaSource.java:249)
       at com.bitmovin.player.core.i0.m.prepareSource(SourceFile:8)
       at androidx.media3.exoplayer.source.CompositeMediaSource.prepareChildSource(CompositeMediaSource.java:122)
       at androidx.media3.exoplayer.source.WrappingMediaSource.prepareChildSource(WrappingMediaSource.java:240)
       at androidx.media3.exoplayer.source.MaskingMediaSource.createPeriod(MaskingMediaSource.java:127)
       at androidx.media3.exoplayer.MediaSourceList.createPeriod(MediaSourceList.java:338)
       at androidx.media3.exoplayer.MediaPeriodHolder.createMediaPeriod(MediaPeriodHolder.java:451)
       at androidx.media3.exoplayer.MediaPeriodHolder.<init>(MediaPeriodHolder.java:116)
       at androidx.media3.exoplayer.MediaPeriodQueue.enqueueNextMediaPeriodHolder(MediaPeriodQueue.java:193)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.maybeUpdateLoadingPeriod(ExoPlayerImplInternal.java:2125)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.updatePeriods(ExoPlayerImplInternal.java:2112)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1056)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:539)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:193)
       at android.os.HandlerThread.run(HandlerThread.java:65)

Caused by android.media.UnsupportedSchemeException
Failed to instantiate drm object.
Caused by android.media.UnsupportedSchemeException: Failed to instantiate drm object.
       at android.media.MediaDrm.native_setup(MediaDrm.java)
       at android.media.MediaDrm.<init>(MediaDrm.java:223)
       at androidx.media3.exoplayer.drm.FrameworkMediaDrm.<init>(FrameworkMediaDrm.java:117)
       at androidx.media3.exoplayer.drm.FrameworkMediaDrm.newInstance(FrameworkMediaDrm.java:105)
       at com.bitmovin.player.core.b0.d.acquireExoMediaDrm(SourceFile:1)
       at androidx.media3.exoplayer.drm.DefaultDrmSessionManager.prepare(DefaultDrmSessionManager.java:402)
       at androidx.media3.exoplayer.dash.DashMediaSource.prepareSourceInternal(DashMediaSource.java:572)
       at androidx.media3.exoplayer.source.BaseMediaSource.prepareSource(BaseMediaSource.java:249)
       at com.bitmovin.player.core.i0.m.prepareSource(SourceFile:8)
       at androidx.media3.exoplayer.source.CompositeMediaSource.prepareChildSource(CompositeMediaSource.java:122)
       at androidx.media3.exoplayer.source.WrappingMediaSource.prepareChildSource(WrappingMediaSource.java:240)
       at androidx.media3.exoplayer.source.MaskingMediaSource.createPeriod(MaskingMediaSource.java:127)
       at androidx.media3.exoplayer.MediaSourceList.createPeriod(MediaSourceList.java:338)
       at androidx.media3.exoplayer.MediaPeriodHolder.createMediaPeriod(MediaPeriodHolder.java:451)
       at androidx.media3.exoplayer.MediaPeriodHolder.<init>(MediaPeriodHolder.java:116)
       at androidx.media3.exoplayer.MediaPeriodQueue.enqueueNextMediaPeriodHolder(MediaPeriodQueue.java:193)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.maybeUpdateLoadingPeriod(ExoPlayerImplInternal.java:2125)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.updatePeriods(ExoPlayerImplInternal.java:2112)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1056)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:539)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:193)
       at android.os.HandlerThread.run(HandlerThread.java:65)

Crash logs on Chromecast Google TV

Fatal Exception: androidx.media3.exoplayer.drm.UnsupportedDrmException: android.media.UnsupportedSchemeException: Failed to instantiate drm object: NO_INIT
============================== Beginning of DRM Plugin Log ==============================
  02-20 21:41:31.207 I found instance=castkey version=android.hardware.drm@1.3::IDrmFactory
  02-20 21:41:31.207 I found instance=clearkey version=android.hardware.drm@1.4::IDrmFactory
  02-20 21:41:31.207 I found instance=netflix version=android.hardware.drm@1.4::IDrmFactory
  02-20 21:41:31.207 I found instance=playready version=android.hardware.drm@1.4::IDrmFactory
  02-20 21:41:31.207 I found instance=widevine version=android.hardware.drm@1.4::IDrmFactory
  02-20 21:41:51.645 W Cannot cast android.hardware.drm@1.0::IDrmPlugin obj to android.hardware.drm@1.4::IDrmPlugin plugin
  02-20 21:41:51.787 W Cannot cast android.hardware.drm@1.0::IDrmPlugin obj to android.hardware.drm@1.4::IDrmPlugin plugin
  02-20 21:42:36.983 E uuid=[79d64ace edef8ba9] No supported hal instance found
============================== End of DRM Plugin Log ==============================
       at androidx.media3.exoplayer.drm.FrameworkMediaDrm.newInstance(FrameworkMediaDrm.java:107)
       at com.bitmovin.player.core.y.d.acquireExoMediaDrm(SourceFile:1)
       at androidx.media3.exoplayer.drm.DefaultDrmSessionManager.prepare(DefaultDrmSessionManager.java:396)
       at androidx.media3.exoplayer.dash.DashMediaSource.prepareSourceInternal(DashMediaSource.java:507)
       at androidx.media3.exoplayer.source.BaseMediaSource.prepareSource(BaseMediaSource.java:232)
       at com.bitmovin.player.core.f0.m.prepareSource(SourceFile:8)
       at androidx.media3.exoplayer.source.CompositeMediaSource.prepareChildSource(CompositeMediaSource.java:122)
       at androidx.media3.exoplayer.source.WrappingMediaSource.prepareChildSource(WrappingMediaSource.java:214)
       at androidx.media3.exoplayer.source.MaskingMediaSource.prepareSourceInternal(MaskingMediaSource.java:84)
       at androidx.media3.exoplayer.source.WrappingMediaSource.prepareSourceInternal(WrappingMediaSource.java:67)
       at androidx.media3.exoplayer.source.BaseMediaSource.prepareSource(BaseMediaSource.java:232)
       at androidx.media3.exoplayer.MediaSourceList.prepareChildSource(MediaSourceList.java:452)
       at androidx.media3.exoplayer.MediaSourceList.prepare(MediaSourceList.java:293)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.prepareInternal(ExoPlayerImplInternal.java:757)
       at androidx.media3.exoplayer.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:516)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loopOnce(Looper.java:201)
       at android.os.Looper.loop(Looper.java:288)
       at android.os.HandlerThread.run(HandlerThread.java:67)

I can not identify which movie triggered this issue. Could I prevent the crash using try catch? so I can silently send the crash report to the Firebase log for further investigation. Please let me know if you need more information.

Hi @puthea.mam,

thanks for reaching out. As far as I can see it at the moment there is no way of catching the mentioned exception.

We are tracking the issue internally and will update here once we have additional information available.

In the mean time you can try checking for supported DRM scheme using code similar to the following in order to prevent the crash.

MediaDrm.isCryptoSchemeSupported(/* DRM scheme, e.g. widevine */)

Sorry that I don’t have any better news as of now.

Best,
Lukas

1 Like