解密&使用MediaCodec将加密数据解码为SurfaceTexture

时间:2016-05-17 17:08:40

标签: android mediacodec drm widevine

是否可以使用MediaCodec API解密和解码数据? 我想解密和解码由broadvine或其他DRM机制加密的数据。 我想要尝试的基本事情是 我使用SurfaceTexure创建的Surface配置MediaCodec。 MediaCodec->configure(..????., with mediacrypto instance, ...)我不确定在这种情况下是否可以通过SurfaceTexture? 或者我应该做的任何安全配置?

MediaCodec->start()
MediaCodec->queuesecureinputbuffer(...,with cryptoinfo,...)
MediaCodec->dequeoutputbuffer() to get the decoded data back....

我能找到的样本是直接将解密数据渲染到SurfaceView上。

但我只想获得解码缓冲区或由MediaCodec渲染的SurfaceTexture。

如果我没有设置任何安全配置,例如MediaFormat->SetFeatureEnabled("secure-playback", true);使用OMX.qcom.video.decoder.avc创建解码器。 我会得到这样的错误,

E/OMX-VDEC-1080P(23290): 
E/OMX-VDEC-1080P(23290): ERROR: Sending OMX_EventError to Client
E/        (23290): not in avi mode
E/ACodec  ( 1930): [OMX.qcom.video.decoder.avc] ERROR(0x80001009)
E/ACodec  ( 1930): signalError(omxError 0x80001009, internalError -2147483648)
E/MediaCodec( 1930): Codec reported err 0x80001009, actionCode 0, while in state 6
W/System.err( 1930): java.lang.IllegalStateException
W/System.err( 1930):  at android.media.MediaCodec.native_dequeueOutputBuffer(Native Method)
W/System.err( 1930):  at android.media.MediaCodec.dequeueOutputBuffer(MediaCodec.java:1033)

设置安全配置并使用MediaCodec :: CreateByCodecName(附加“.secure”)后 我会遇到这种错误...

E/ACodec: native window could not be authenticated
E/ACodec: Failed to allocate buffers after transitioning to IDLE state (error 0xffffffff)
E/ACodec: signalError(omxError 0x80001001, internalError -1)

1 个答案:

答案 0 :(得分:3)

这在某种程度上取决于设备的硬件,但一般而言,受DRM保护的视频只能发送到SurfaceView。此外,SurfaceView的Surface必须位于硬件覆盖层上。

受DRM保护的视频由视频解码器硬件解密,并且解码的帧被写入软件无法访问的存储器。甚至Linux内核也无法读取它。这些帧通过句柄传递给硬件编写器,硬件编写器告诉显示硬件在覆盖平面上显示它们。

由于存储器只能由视频解码器和显示器访问,因此GPU无法访问它,这意味着数据不能用作GLES外部纹理。帧无法与GLES合成,因此如果HWC无法分配叠加层,则视频将不会出现。 (有关HWC和组合的更多信息,请参阅graphics arch doc。)