Расшифровать и декодировать зашифрованные данные в 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 и композиции см. Документацию по графике.)