ExoPlayer
                                
                                
                                
                                    ExoPlayer copied to clipboard
                            
                            
                            
                        L3 playback fails UnsupportedSchemeException/UnsupportedDrmException on certain devices
On certain devices the fallback to L3 fails with UnsupportedSchemeException/UnsupportedDrmException. We have automatic fallback mechanism to force L3 while the device doesn't allow to use L1. As descibed here:
https://github.com/google/ExoPlayer/issues/8108
While playing DASH we build drmSessionManager or dummySessionManager while UnsupportedDrmException occurs. I am aware that on emulator DRM content may be disabled but on another emulator playback works as expected with both L1/ L3 forced.
These are the most important parts in code I believe
            VIDEO_TYPE_DASH -> {
                val drmSessionManager =
                        getDrmSessionManager(licenseUrl, C.WIDEVINE_UUID, bandwidthMeter, userAgent, shouldUseL3Workaround)
                DashMediaSource.Factory(
                        DefaultDashChunkSource.Factory(mediaDataSourceFactory),
                        buildDataSourceFactory(context, false, bandwidthMeter, userAgent)
                )       .setDrmSessionManagerProvider { _ -> drmSessionManager }
                        .createMediaSource(getMediaItem(streamUrl, MIME_TYPE_DASH))
            }
    private fun getDrmSessionManager(
            drmLicenseUrl: String,
            drmSchemeUuid: UUID,
            bandwidthMeter: BandwidthMeter,
            userAgent: String,
            shouldUseL3Workaround: Boolean,
    ): DrmSessionManager {
        return try {
            buildDrmSessionManager(drmSchemeUuid, drmLicenseUrl, bandwidthMeter, userAgent, shouldUseL3Workaround)
        } catch (e: UnsupportedDrmException) {
            dummySessionManager
        }
    }
    @Throws(UnsupportedDrmException::class)
    private fun buildDrmSessionManager(
            uuid: UUID,
            licenseUrl: String,
            bandwidthMeter: BandwidthMeter,
            userAgent: String,
            shouldUseL3Workaround: Boolean,
    ): DrmSessionManager {
        val drmCallback = HttpMediaDrmCallback(
                licenseUrl,
                buildHttpDataSourceFactory(bandwidthMeter, userAgent)
        )
        val mediaDrm = FrameworkMediaDrm.newInstance(uuid)
        if (shouldUseL3Workaround) {
            mediaDrm.setPropertyString("securityLevel", "L3")
        }
        return DefaultDrmSessionManager.Builder()
                .setUuidAndExoMediaDrmProvider(uuid, ExoMediaDrm.AppManagedProvider(mediaDrm))
                .setMultiSession(true)
                .build(drmCallback)
    }
    private val dummySessionManager: DrmSessionManager = DrmSessionManager.getDummyDrmSessionManager()
Erros seems to relate to the fullHD rendition which is included in manifest file. May it be malformed though? If needed I'll send via email .mpd manifest file as well. So far we excluded the 1080p quality profile and playback works.
Not working emulator is Nexus7 with API 25, working is Pixel C API 31. Googling UnsupportedSchemeException led me to explanation of that exception which isException thrown when an attempt is made to construct a MediaDrm object using a crypto scheme UUID that is not supported by the device
Not working list of devices is: Redmi Note 6 Pro, Redmi 5 Plus, Redmi K20 Pro/Mi 9T Pro, Honor 9, Redmi Note 7/Z717VL, Huawei mate 20 lite,JNY-LX1 and more.
I attach the logs from JNY-LX1 Huawei. Huawei BP stream issue Android studio log_2.txt
The logs differs on Emulator are different though:
      com.google.android.exoplayer2.ExoPlaybackException: Source error
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:641)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:595)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:154)
        at android.os.HandlerThread.run(HandlerThread.java:61)
     Caused by: com.google.android.exoplayer2.drm.DrmSession$DrmSessionException: com.google.android.exoplayer2.drm.UnsupportedDrmException
        at com.google.android.exoplayer2.drm.DrmSessionManager$1.acquireSession(DrmSessionManager.java:59)
        at com.google.android.exoplayer2.source.SampleQueue.onFormatResult(SampleQueue.java:926)
        at com.google.android.exoplayer2.source.SampleQueue.peekSampleMetadata(SampleQueue.java:697)
        at com.google.android.exoplayer2.source.SampleQueue.read(SampleQueue.java:423)
        at com.google.android.exoplayer2.source.chunk.ChunkSampleStream.readData(ChunkSampleStream.java:392)
        at com.google.android.exoplayer2.BaseRenderer.readSource(BaseRenderer.java:425)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:948)
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:779)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:998)
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:499)
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.os.HandlerThread.run(HandlerThread.java:61) 
     Caused by: com.google.android.exoplayer2.drm.UnsupportedDrmException
        at com.google.android.exoplayer2.drm.DrmSessionManager$1.acquireSession(DrmSessionManager.java:59) 
        at com.google.android.exoplayer2.source.SampleQueue.onFormatResult(SampleQueue.java:926) 
        at com.google.android.exoplayer2.source.SampleQueue.peekSampleMetadata(SampleQueue.java:697) 
        at com.google.android.exoplayer2.source.SampleQueue.read(SampleQueue.java:423) 
        at com.google.android.exoplayer2.source.chunk.ChunkSampleStream.readData(ChunkSampleStream.java:392) 
        at com.google.android.exoplayer2.BaseRenderer.readSource(BaseRenderer.java:425) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.readSourceOmittingSampleData(MediaCodecRenderer.java:948) 
        at com.google.android.exoplayer2.mediacodec.MediaCodecRenderer.render(MediaCodecRenderer.java:779) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:998) 
        at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:499) 
        at android.os.Handler.dispatchMessage(Handler.java:98) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.os.HandlerThread.run(HandlerThread.java:61)