2016-05-17 20 views
0

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

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) 

ответ

3

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

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

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

+0

Возможно ли преобразование из SurfaceView в SurfaceTexture? – user588477

+0

Или можно использовать MediaCodec-> Configure (без поверхности?) – user588477

+0

Даже если вам удастся настроить MediaCodec, механизм «доверенного пути» не позволит вам получить доступ к данным пикселя. Например, попробуйте повернуть устройство во время воспроизведения фильма, защищенного DRM, из Play Маркета. Обычно структура захватывает экран и использует его для анимации вращения, но видеопроигрыватель просто черным ... даже SurfaceFlinger не может читать пиксели. Приложение может устанавливать положение, размер и ориентацию SurfaceView, но об этом. – fadden

Смежные вопросы