Расшифровать и декодировать зашифрованные данные в SurfaceTexture с помощью MediaCodec

Можно ли расшифровать и декодировать данные с помощью MediaCodec API? Я хочу расшифровать и декодировать данные, которые зашифрованы с помощью Widevine или другого механизма DRM. Основная вещь, которую я хочу попробовать, это то, что я настроил MediaCodec с Surface, который создается из SurfaceTexure.MediaCodec->configure(..????., with mediacrypto instance, ...) Я не уверен, смогу ли я передать SurfaceTexture в этом случае? Или какую-либо безопасную настройку я должен сделать?

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

Пример, который я смог найти, - это непосредственное отображение дешифрованных данных в SurfaceView.

Но я просто хочу получить декодированный буфер или SurfaceTexture, который визуализируется MediaCodec.

Если я не установил никакой безопасной настройки, такой как 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 ответ

Это в некоторой степени зависит от аппаратного обеспечения устройства, но, вообще говоря, видео с защитой DRM может быть отправлено только в SurfaceView. Кроме того, SurfaceView Surface должен быть наложен на оборудование.

Видео с защитой DRM дешифруется аппаратным обеспечением видеодекодера, и декодированные кадры записываются в память, недоступную для программного обеспечения. Даже ядро ​​Linux не может читать с него. Кадры передаются дескриптором Hardware Composer, который сообщает аппаратному обеспечению дисплея, чтобы они отображались в плоскости наложения.

Поскольку память доступна только для видеодекодера и дисплея, она не доступна для графического процессора, что означает, что данные не могут использоваться в качестве внешней текстуры GLES. Кадр не может быть совмещен с GLES, поэтому, если HWC не может выделить оверлей, видео не появится. (Для получения дополнительной информации о HWC и композиции см. Документацию по графике.)

Другие вопросы по тегам