diff options
| -rw-r--r-- | media/java/android/media/MediaDescrambler.java | 95 |
1 files changed, 16 insertions, 79 deletions
diff --git a/media/java/android/media/MediaDescrambler.java b/media/java/android/media/MediaDescrambler.java index b4bdf93db3ab..46c3a1752b3f 100644 --- a/media/java/android/media/MediaDescrambler.java +++ b/media/java/android/media/MediaDescrambler.java @@ -17,24 +17,15 @@ package android.media; import android.annotation.NonNull; -import android.hardware.cas.DestinationBuffer; import android.hardware.cas.IDescrambler; import android.hardware.cas.ScramblingControl; -import android.hardware.cas.SharedBuffer; -import android.hardware.cas.SubSample; import android.hardware.cas.V1_0.IDescramblerBase; -import android.hardware.common.Ashmem; -import android.hardware.common.NativeHandle; import android.media.MediaCasException.UnsupportedCasException; import android.os.IHwBinder; -import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.ServiceSpecificException; -import android.os.SharedMemory; -import android.system.ErrnoException; import android.util.Log; -import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -52,6 +43,7 @@ import java.util.ArrayList; public final class MediaDescrambler implements AutoCloseable { private static final String TAG = "MediaDescrambler"; private DescramblerWrapper mIDescrambler; + private boolean mIsAidlHal; private interface DescramblerWrapper { @@ -68,43 +60,7 @@ public final class MediaDescrambler implements AutoCloseable { void setMediaCasSession(byte[] sessionId) throws RemoteException; void release() throws RemoteException; - } - ; - - private long getSubsampleInfo( - int numSubSamples, - int[] numBytesOfClearData, - int[] numBytesOfEncryptedData, - SubSample[] subSamples) { - long totalSize = 0; - - for (int i = 0; i < numSubSamples; i++) { - totalSize += numBytesOfClearData[i]; - subSamples[i].numBytesOfClearData = numBytesOfClearData[i]; - totalSize += numBytesOfEncryptedData[i]; - subSamples[i].numBytesOfEncryptedData = numBytesOfEncryptedData[i]; - } - return totalSize; - } - - private ParcelFileDescriptor createSharedMemory(ByteBuffer buffer, String name) - throws RemoteException { - byte[] source = buffer.array(); - if (source.length == 0) { - return null; - } - ParcelFileDescriptor fd = null; - try { - SharedMemory ashmem = SharedMemory.create(name == null ? "" : name, source.length); - ByteBuffer ptr = ashmem.mapReadWrite(); - ptr.put(buffer); - ashmem.unmap(ptr); - fd = ashmem.getFdDup(); - return fd; - } catch (ErrnoException | IOException e) { - throw new RemoteException(e); - } - } + }; private class AidlDescrambler implements DescramblerWrapper { @@ -125,47 +81,17 @@ public final class MediaDescrambler implements AutoCloseable { @NonNull ByteBuffer dst, @NonNull MediaCodec.CryptoInfo cryptoInfo) throws RemoteException { - SubSample[] subSamples = new SubSample[cryptoInfo.numSubSamples]; - long totalLength = - getSubsampleInfo( - cryptoInfo.numSubSamples, - cryptoInfo.numBytesOfClearData, - cryptoInfo.numBytesOfEncryptedData, - subSamples); - SharedBuffer srcBuffer = new SharedBuffer(); - DestinationBuffer dstBuffer; - srcBuffer.heapBase = new Ashmem(); - srcBuffer.heapBase.fd = createSharedMemory(src, "Descrambler Source Buffer"); - srcBuffer.heapBase.size = src.array().length; - if (dst == null) { - dstBuffer = DestinationBuffer.nonsecureMemory(srcBuffer); - } else { - ParcelFileDescriptor pfd = - createSharedMemory(dst, "Descrambler Destination Buffer"); - NativeHandle nh = new NativeHandle(); - nh.fds = new ParcelFileDescriptor[] {pfd}; - nh.ints = new int[] {1}; // Mark 1 since source buffer also uses it? - dstBuffer = DestinationBuffer.secureMemory(nh); - } - @ScramblingControl int control = cryptoInfo.key[0]; - - return mAidlDescrambler.descramble( - (byte) control, - subSamples, - srcBuffer, - src.position(), - dstBuffer, - dst.position()); + throw new RemoteException("Not supported"); } @Override public boolean requiresSecureDecoderComponent(@NonNull String mime) throws RemoteException { - return mAidlDescrambler.requiresSecureDecoderComponent(mime); + throw new RemoteException("Not supported"); } @Override public void setMediaCasSession(byte[] sessionId) throws RemoteException { - mAidlDescrambler.setMediaCasSession(sessionId); + throw new RemoteException("Not supported"); } @Override @@ -267,10 +193,12 @@ public final class MediaDescrambler implements AutoCloseable { if (MediaCas.getService() != null) { mIDescrambler = new AidlDescrambler(MediaCas.getService().createDescrambler(CA_system_id)); + mIsAidlHal = true; } else if (MediaCas.getServiceHidl() != null) { mIDescrambler = new HidlDescrambler( MediaCas.getServiceHidl().createDescrambler(CA_system_id)); + mIsAidlHal = false; } } catch(Exception e) { Log.e(TAG, "Failed to create descrambler: " + e); @@ -282,6 +210,15 @@ public final class MediaDescrambler implements AutoCloseable { } } + /** + * Check if the underlying HAL is AIDL. Used only for CTS. + * + * @hide + */ + public boolean isAidlHal() { + return mIsAidlHal; + } + IHwBinder getBinder() { validateInternalStates(); |