Exoplayer: ASUS k010 (Android 4.4) would not play widevine video

Created on 6 Mar 2016  路  19Comments  路  Source: google/ExoPlayer

Hi,

I have an issue with my asus tablet that would not play dash with widevine. If I wait long enough (1 minute of buffering) the stream would start to play but audio only, while video remains black screen. Once that is happening I can see Audio, Video and Logging buttons on top. Attaching log:

02-04 16:59:02.978 11510-11510/com.google.android.exoplayer.demo I/dalvikvm: Could not find method com.google.android.exoplayer.demo.PlayerActivity.requestPermissions, referenced from method com.google.android.exoplayer.demo.PlayerActivity.maybeRequestPermission
02-04 16:59:02.978 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve virtual method 1428: Lcom/google/android/exoplayer/demo/PlayerActivity;.requestPermissions ([Ljava/lang/String;I)V
02-04 16:59:02.978 11510-11510/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0010
02-04 16:59:02.988 11510-11510/com.google.android.exoplayer.demo I/dalvikvm: Could not find method com.google.android.exoplayer.demo.PlayerActivity.checkSelfPermission, referenced from method com.google.android.exoplayer.demo.PlayerActivity.requiresPermission
02-04 16:59:02.988 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve virtual method 1395: Lcom/google/android/exoplayer/demo/PlayerActivity;.checkSelfPermission (Ljava/lang/String;)I
02-04 16:59:02.988 11510-11510/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x6e at 0x000e
02-04 16:59:03.008 11510-11510/com.google.android.exoplayer.demo I/dalvikvm: Could not find method android.view.accessibility.CaptioningManager$CaptionStyle.hasForegroundColor, referenced from method com.google.android.exoplayer.text.CaptionStyleCompat.createFromCaptionStyleV21
02-04 16:59:03.008 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve virtual method 286: Landroid/view/accessibility/CaptioningManager$CaptionStyle;.hasForegroundColor ()Z
02-04 16:59:03.008 11510-11510/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002
02-04 16:59:03.008 11510-11510/com.google.android.exoplayer.demo D/dalvikvm: DexOpt: couldn't find field Landroid/view/accessibility/CaptioningManager$CaptionStyle;.windowColor
02-04 16:59:03.008 11510-11510/com.google.android.exoplayer.demo I/dalvikvm: DexOpt: unable to optimize instance field ref 0x002c at 0x18 in Lcom/google/android/exoplayer/text/CaptionStyleCompat;.createFromCaptionStyleV21
02-04 16:59:03.098 11510-11510/com.google.android.exoplayer.demo I/ExoPlayerImpl: Init 1.5.3
02-04 16:59:03.108 11510-11510/com.google.android.exoplayer.demo D/EventLogger: start [0]
02-04 16:59:03.108 11510-11510/com.google.android.exoplayer.demo D/EventLogger: state [0.00, false, P]
02-04 16:59:03.118 11510-11510/com.google.android.exoplayer.demo D/EventLogger: state [0.01, true, P]
02-04 16:59:04.058 11510-11510/com.google.android.exoplayer.demo I/dalvikvm: Could not find method android.media.MediaCodec.releaseOutputBuffer, referenced from method com.google.android.exoplayer.MediaCodecVideoTrackRenderer.renderOutputBufferV21
02-04 16:59:04.058 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve virtual method 82: Landroid/media/MediaCodec;.releaseOutputBuffer (IJ)V
02-04 16:59:04.058 11510-11510/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0008
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo E/dalvikvm: Could not find class 'android.media.PlaybackParams', referenced from method com.google.android.exoplayer.MediaCodecAudioTrackRenderer.handleMessage
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve check-cast 50 (Landroid/media/PlaybackParams;) in Lcom/google/android/exoplayer/MediaCodecAudioTrackRenderer;
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x1f at 0x0015
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo I/dalvikvm: Could not find method android.media.AudioTrack.write, referenced from method com.google.android.exoplayer.audio.AudioTrack.writeNonBlockingV21
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve virtual method 65: Landroid/media/AudioTrack;.write (Ljava/nio/ByteBuffer;II)I
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0001
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/media/PlaybackParams;)
02-04 16:59:04.068 11510-11510/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/media/PlaybackParams;)
02-04 16:59:04.078 11510-12193/com.google.android.exoplayer.demo I/dalvikvm: Could not find method android.view.Display.getMode, referenced from method com.google.android.exoplayer.chunk.VideoFormatSelectorUtil.getDisplaySizeV23
02-04 16:59:04.078 11510-12193/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve virtual method 252: Landroid/view/Display;.getMode ()Landroid/view/Display$Mode;
02-04 16:59:04.078 11510-12193/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0000
02-04 16:59:04.078 11510-12193/com.google.android.exoplayer.demo I/dalvikvm: Could not find method android.media.MediaCodecInfo$CodecCapabilities.getVideoCapabilities, referenced from method com.google.android.exoplayer.MediaCodecUtil.isSizeAndRateSupportedV21
02-04 16:59:04.078 11510-12193/com.google.android.exoplayer.demo W/dalvikvm: VFY: unable to resolve virtual method 87: Landroid/media/MediaCodecInfo$CodecCapabilities;.getVideoCapabilities ()Landroid/media/MediaCodecInfo$VideoCapabilities;
02-04 16:59:04.078 11510-12193/com.google.android.exoplayer.demo D/dalvikvm: VFY: replacing opcode 0x6e at 0x0019
02-04 16:59:04.088 11510-12193/com.google.android.exoplayer.demo I/OMXClient: Using client-side OMX mux.
02-04 16:59:04.118 11510-12193/com.google.android.exoplayer.demo I/OMXClient: Using client-side OMX mux.
02-04 16:59:04.128 11510-11510/com.google.android.exoplayer.demo D/EventLogger: availableRange [true, 0, 214000000]
02-04 16:59:04.128 11510-11510/com.google.android.exoplayer.demo D/EventLogger: availableRange [true, 0, 213994666]
02-04 16:59:04.148 11510-11510/com.google.android.exoplayer.demo D/EventLogger: state [1.04, true, B]
02-04 16:59:04.218 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [1.12, 877, 0.02, 318909]
02-04 16:59:04.238 11510-11510/com.google.android.exoplayer.demo D/EventLogger: videoFormat [1.13, 4, 1]
02-04 16:59:04.258 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [1.15, 804, 0.01, 318909]
02-04 16:59:04.438 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [1.33, 515752, 0.16, 26280356]
02-04 16:59:04.468 11510-12236/com.google.android.exoplayer.demo I/OMXClient: Using client-side OMX mux.
02-04 16:59:04.468 11510-12236/com.google.android.exoplayer.demo E/ACodec: [OMX.Intel.hw_vd.h264.secure] storeMetaDataInBuffers failed w/ err -2147483648
02-04 16:59:04.488 11510-11510/com.google.android.exoplayer.demo D/EventLogger: decoderInitialized [1.38, OMX.Intel.hw_vd.h264.secure]
02-04 16:59:04.508 11510-11510/com.google.android.exoplayer.demo D/EventLogger: audioFormat [1.40, 9, 2]
02-04 16:59:04.508 11510-12240/com.google.android.exoplayer.demo I/OMXClient: Using client-side OMX mux.
02-04 16:59:04.528 11510-11510/com.google.android.exoplayer.demo D/EventLogger: decoderInitialized [1.42, OMX.Intel.aac.decoder]
02-04 16:59:04.588 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [1.48, 52061, 0.06, 26280356]
02-04 16:59:04.878 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [1.78, 280660, 0.23, 9636394]
02-04 16:59:04.938 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [1.84, 264659, 0.06, 26280356]
02-04 16:59:05.168 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [2.07, 43366, 0.13, 26280356]
02-04 16:59:05.208 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [2.11, 9554, 0.04, 9636394]
02-04 16:59:05.638 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [2.53, 289131, 0.31, 9636394]
02-04 16:59:06.228 11510-11510/com.google.android.exoplayer.demo D/EventLogger: videoFormat [3.12, 7, 3]
02-04 16:59:07.858 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [4.76, 2925771, 2.23, 10514900]
02-04 16:59:08.128 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [5.02, 215766, 0.22, 10514900]
02-04 16:59:10.318 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [7.21, 2980501, 2.19, 10897627]
02-04 16:59:10.648 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [7.54, 316642, 0.27, 10897627]
02-04 16:59:12.698 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [9.59, 2891759, 2.05, 11290420]
02-04 16:59:12.888 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [9.78, 126783, 0.13, 11290420]
02-04 16:59:15.088 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [11.98, 3250092, 2.20, 11818516]
02-04 16:59:15.208 11510-12224/com.google.android.exoplayer.demo D/dalvikvm: GC_FOR_ALLOC freed 1340K, 16% free 7294K/8676K, paused 6ms, total 6ms
02-04 16:59:15.458 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [12.35, 294254, 0.30, 11818516]
02-04 16:59:17.528 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [14.42, 3132374, 2.07, 12088273]
02-04 16:59:17.778 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [14.67, 207320, 0.19, 12088273]
02-04 16:59:20.068 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [16.96, 3072703, 2.29, 10724966]
02-04 16:59:20.428 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [17.32, 282848, 0.28, 10724966]
02-04 16:59:22.558 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [19.45, 3124062, 2.13, 11744593]
02-04 16:59:22.778 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [19.67, 190471, 0.16, 11744593]
02-04 16:59:24.998 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [21.89, 3232519, 2.22, 11669743]
02-04 16:59:25.238 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [22.13, 265115, 0.17, 11669743]
02-04 16:59:27.288 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [24.18, 3115925, 2.05, 12165641]
02-04 16:59:27.718 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [24.61, 88341, 0.16, 12165641]
02-04 16:59:29.958 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [26.85, 3505323, 2.24, 12524602]
02-04 16:59:30.478 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [27.37, 220394, 0.21, 12524602]
02-04 16:59:32.668 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [29.56, 3083390, 2.18, 11289299]
02-04 16:59:33.068 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [29.96, 52188, 0.16, 11289299]
02-04 16:59:35.358 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [32.25, 2999782, 2.29, 10484166]
02-04 16:59:35.708 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [32.60, 127426, 0.13, 10484166]
02-04 16:59:38.178 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [35.07, 3051765, 2.48, 9860306]
02-04 16:59:38.878 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [35.77, 275980, 0.43, 9860306]
02-04 16:59:40.948 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [37.85, 2896881, 2.07, 11179473]
02-04 16:59:41.368 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [38.26, 180880, 0.17, 11179473]
02-04 16:59:43.508 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [40.40, 3335442, 2.14, 12480606]
02-04 16:59:43.878 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [40.77, 88685, 0.11, 12480606]
02-04 16:59:46.098 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [42.99, 3692134, 2.22, 13275088]
02-04 16:59:46.588 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [43.48, 88884, 0.23, 13275088]
02-04 16:59:49.138 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [46.03, 4089121, 2.57, 12748623]
02-04 16:59:49.748 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [46.65, 321360, 0.30, 12748623]
02-04 16:59:51.888 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [48.78, 3644382, 2.14, 13630227]
02-04 16:59:52.428 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [49.32, 250208, 0.25, 13630227]
02-04 16:59:54.608 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [51.51, 3627506, 2.19, 13257216]
02-04 16:59:55.018 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [51.92, 240072, 0.17, 13257216]
02-04 16:59:57.158 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [54.05, 3545800, 2.13, 13292596]
02-04 16:59:57.768 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [54.66, 380003, 0.33, 13292596]
02-04 16:59:59.988 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [56.88, 3617406, 2.22, 13012251]
02-04 17:00:00.308 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [57.20, 87437, 0.11, 13012251]
02-04 17:00:02.558 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [59.45, 3763223, 2.25, 13380348]
02-04 17:00:02.868 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [59.76, 52182, 0.10, 13380348]
02-04 17:00:05.048 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [61.94, 3549151, 2.17, 13060353]
02-04 17:00:05.438 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [62.33, 173622, 0.15, 13060353]
02-04 17:00:07.668 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [64.57, 3372984, 2.24, 12057136]
02-04 17:00:08.228 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [65.13, 259341, 0.23, 12057136]
02-04 17:00:10.358 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [67.25, 3404419, 2.12, 12828710]
02-04 17:00:11.188 11510-12224/com.google.android.exoplayer.demo D/dalvikvm: GC_FOR_ALLOC freed 3223K, 29% free 8095K/11364K, paused 7ms, total 7ms
02-04 17:00:11.248 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [68.14, 303423, 0.29, 12828710]
02-04 17:00:13.348 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [70.25, 3671830, 2.10, 13961330]
02-04 17:00:13.688 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [70.58, 52023, 0.07, 13961330]
02-04 17:00:15.948 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [72.85, 3628277, 2.25, 12923515]
02-04 17:00:16.598 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [73.49, 314946, 0.21, 12923515]
02-04 17:00:18.818 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [75.71, 3160710, 2.22, 11384817]
02-04 17:00:19.278 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [76.16, 217227, 0.20, 11384817]
02-04 17:00:21.408 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [78.30, 3186597, 2.14, 11912512]
02-04 17:00:22.028 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [78.92, 282804, 0.31, 11912512]
02-04 17:00:24.058 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [80.95, 2995156, 2.03, 11809387]
02-04 17:00:24.408 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [81.30, 84500, 0.09, 11809387]
02-04 17:00:26.758 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [83.65, 2990597, 2.35, 10180755]
02-04 17:00:27.438 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [84.33, 302256, 0.39, 10180755]
02-04 17:00:29.498 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [86.39, 2973123, 2.06, 11529318]
02-04 17:00:29.878 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [86.77, 82737, 0.10, 11529318]
02-04 17:00:32.018 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [88.91, 3264488, 2.14, 12192298]
02-04 17:00:33.878 11510-11510/com.google.android.exoplayer.demo D/EventLogger: bandwidth [90.77, 2368241, 1.61, 11753057]
02-04 17:00:33.918 11510-11510/com.google.android.exoplayer.demo D/EventLogger: state [90.81, true, R]

The stream I am having issues with can be found here http://teststreams.livesport-massive.com/out/u/190116010_EN_PERFORM_CAVSREAX_POSTGSW_IV_1_1453370357431_2224_1453381760177-encrypted.mpd , its widevine protected.

There is a clear version of it (no DRM) that can be found here http://teststreams.livesport-massive.com/out/u/190116010_EN_PERFORM_CAVSREAX_POSTGSW_IV_1_1453370357431_2224_1453381760177.mpd , There is no problem to play this one.

There are no issues with the widevine protection as I can see other devices playing it correctly.

Thanks for any ideas.

bug device specific in platform drm

Most helpful comment

Thanks! The line of most interest is:

requiresSecureDecoder=true, securityLevel=L1, mimeType=video/avc

This indicates that the device has a Widevine L1 integration and that the L1 implementation indicates that it requires a secure output path for H264. What you're observing when you force use of the non-secure decoder is that the L1 implementation does actually work using a non-secure output path in the case that the license doesn't indicate that one is required. There is however no guarantee that an implementation will support this, and it's for this reason that your workaround is unsafe. In practice implementations that I've seen do work when you do what you're doing, but there are no firm guarantees.

A better workaround is probably to force Widevine L3 rather than L1. You can do this by calling:

drmSessionManager.setPropertyString("securityLevel", "L3");

immediately after you create the StreamingDrmSessionManager instance. You should then see requiresSecureDecoder=false, and the non-secure decoder will be selected for use without you having to force anything in MediaCodecUtil. Please give this a try and see what you discover! If this works, and if L1 Widevine is just flat out broken on this device, we could consider forcing L3 for this device as a workaround in the library. We'll have to take a look / have a think about that though!

Note: I'd advise implementing the workaround only for devices that you know to be affected. Don't just do it on all devices!

All 19 comments

Unfortunately, I have just now been able to get to this. When I tried to play the streams I got a 400 for the media, in both encrypted and otherwise. The manifest is downloaded successfully, but not me media. Can you solve this?

hi Aquiles, I will provide new sources right after I have them hopefully within a couple of days, should I notify you anyhow then?

Just post them here. If you don't want them to be public, you can send them to dev.[email protected], but still post here as that address is not the best way to get prompt responses.

hello guys,

I was able to fix this by a little tweak in MediaCodecUtil class, getMediaCodecInfoInternal method.

This is what I changed:

if(!secureDecodersExplicit) 
{
    codecs.put(key.secure?new MediaCodecUtil.CodecKey(mimeType, false):key,   Pair.create(codecName, capabilities));
     if(secure)
     {
           codecs.put(key.secure?key:new MediaCodecUtil.CodecKey(mimeType, true),    Pair.create(codecName, capabilities));
     }
}
else
{
    codecs.put(key.secure == secure?key:new MediaCodecUtil.CodecKey(mimeType, secure),      Pair.create(**codecName**, capabilities)); //instead if Pair.create(**codecName + ".secure"**,  capabilities)
}

Basically I enforce the usage of insecure codec (I think it was OMX.Nvidia.h264.decode) instead of it's secure one.

Enforcing usage of insecure codecs in general solved my problems with other devices as well.

My questions:
Is it this device specific issue?
Is this workaround secure enough?
Should I expect ExoPlayer to handle with such situations in the future and choose codecs smartly?

Thanks!

  • Yes, this sounds like a device specific issue with the secure decode path. You should report it to the device manufacturer.
  • It's not possible to bypass security by changing a bit of code ;). The approach you're using wont work if the content license indicates that a secure decode path is required. The fact that it does work indicates that the license is not configured to require one. Whether a non-secure output path is secure enough for your needs is something you need to decide, but it should be configured in the license, not in the client software.
  • In general, the approach you're using isn't guaranteed to work even in the case where a secure decode path is not required, however there will be a safe fix or workaround that you can use instead. In order for us to tell you what this is, please could you remove your workaround and modify StreamingDrmSessionManager.requiresSecureDecoderComponent to include the following logging:
Log.e("DRM", "fingerprint=" + android.os.Build.FINGERPRINT);
Log.e("DRM", 
    "requiresSecureDecoder=" + mediaCrypto.requiresSecureDecoderComponent(mimeType)
    + ", securityLevel=" + getPropertyString("securityLevel")
    + ", mimeType=" + mimeType);
  • If you let us know what the output of this logging is when you try and play one of the affected pieces of content, we can tell you what the correct solution is (and possibly just implement it directly in the library).

Thank you for the quick reply. All that make sense.
Here are the logs:

03-31 10:14:56.731 8219-10075/com.test  E/DRM: fingerprint=asus/WW_K010/K010:4.4.2/KOT49H/WW_user_2.2.33.143_20150806:user/release-keys
03-31 10:14:56.731 8219-10075/com.test E/DRM: requiresSecureDecoder=true, securityLevel=L1, mimeType=video/avc
03-31 10:14:56.751 8219-10303/com.test I/OMXClient: Using client-side OMX mux.
03-31 10:14:56.781 8219-10303/com.test E/ACodec: [OMX.Intel.hw_vd.h264.secure] storeMetaDataInBuffers failed w/ err -2147483648
03-31 10:14:56.851 8219-8219/com.test D/VideoPlugin.Notificator: {"value":{"decoderName":"OMX.Intel.hw_vd.h264.secure","initializationDurationMs":90,"elapsedRealtimeMs":613179},"type":"onDecoderInitialized"}
03-31 10:14:58.291 8219-10075/com.test E/DRM: fingerprint=asus/WW_K010/K010:4.4.2/KOT49H/WW_user_2.2.33.143_20150806:user/release-keys
03-31 10:14:58.291 8219-10075/com.test E/DRM: requiresSecureDecoder=false, securityLevel=L1, mimeType=audio/mp4a-latm
03-31 10:14:58.291 8219-10329/com.test I/OMXClient: Using client-side OMX mux.

Thanks! The line of most interest is:

requiresSecureDecoder=true, securityLevel=L1, mimeType=video/avc

This indicates that the device has a Widevine L1 integration and that the L1 implementation indicates that it requires a secure output path for H264. What you're observing when you force use of the non-secure decoder is that the L1 implementation does actually work using a non-secure output path in the case that the license doesn't indicate that one is required. There is however no guarantee that an implementation will support this, and it's for this reason that your workaround is unsafe. In practice implementations that I've seen do work when you do what you're doing, but there are no firm guarantees.

A better workaround is probably to force Widevine L3 rather than L1. You can do this by calling:

drmSessionManager.setPropertyString("securityLevel", "L3");

immediately after you create the StreamingDrmSessionManager instance. You should then see requiresSecureDecoder=false, and the non-secure decoder will be selected for use without you having to force anything in MediaCodecUtil. Please give this a try and see what you discover! If this works, and if L1 Widevine is just flat out broken on this device, we could consider forcing L3 for this device as a workaround in the library. We'll have to take a look / have a think about that though!

Note: I'd advise implementing the workaround only for devices that you know to be affected. Don't just do it on all devices!

As suggested I'm using
drmSessionManager.setPropertyString("securityLevel", "L3");
For now I had to force L3 Widevine for Asus and Nexus Player.
I will keep an eye on this and have it in my mind.

Thanks for the hins!

Thanks everyone for an investigation. We have a working solution in place now consisting of a custom piece of code on our side for a specific list of devices.
Do you want me to close this issue now, or do you want to implement such fix directly in exoplayer lib and so close this only after its in place?

Please leave the issue open so that we can follow up with the device manufacturers. We may or may not decide to put a workaround directly in the library. To assist with both efforts, could you provide the list of devices that you're enabling the workaround on? Thanks!

The two devices with the workaround are:

  • ASUS Transformer Pad K010 Android 4.4.2
  • Nexus Player Model:500l (AndoidTV)

@jozefchutka

How have you applied the encryption ? Are you using the latest version of the CENC spec?

I have already highlighted in another issue that many devices (especially Intel based) do not seem to be compatible with the latest version..

See - https://github.com/google/ExoPlayer/issues/1318

The only answer I have is "We developed against the Widevine_Modular_DRM_Encryption_API_1.3 and ISO_IEC_23001-7;2012(E)-Character specs" is that what we are looking for?

following up with Asus contact offline.

Hello guys,

I had to enforce the L3 Security Level for Lenovo Yoga Tab 3 8.0 as well.
As a result I can play video content but the playback is not smooth, playback is stuttery. In logs I can see that there are dropped frames. Might this be the issue for the stuttery playback and why there are frames dropped in first place during playback?

This is only happening for Widevine protected streams!

Thank you in advanced!

@dobrusev yes when using L3, software only decrypt, that will put a large load on the device and you may experience dropped frames and stuttering especially at higher quality streams.

The Sony Z3 compact Android 5.1 also shows the same issue. The device manufacturer has been informed and they fixed it in Android 6.x.

@bwidtmann thanks for the update.

As there is nothing we can do in the player/stack I will close this but please to reopen and add to it if other devices are found to be problematic.

Was this page helpful?
0 / 5 - 0 ratings