107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber/* 207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Copyright (C) 2012 The Android Open Source Project 307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * 407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * you may not use this file except in compliance with the License. 607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * You may obtain a copy of the License at 707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * 807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * 1007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Unless required by applicable law or agreed to in writing, software 1107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * See the License for the specific language governing permissions and 1407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * limitations under the License. 1507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber */ 1607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 1707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberpackage android.media; 1807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 1960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberimport android.media.MediaCryptoException; 2060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberimport java.util.UUID; 2160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 2207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber/** 2307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * MediaCrypto class can be used in conjunction with {@link android.media.MediaCodec} 2407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * to decode encrypted media data. 2507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * 2607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Crypto schemes are assigned 16 byte UUIDs, 2707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * the method {@link #isCryptoSchemeSupported} can be used to query if a given 2807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * scheme is supported on the device. 2907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * 3060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber */ 3107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberpublic final class MediaCrypto { 3260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /** 3360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * Query if the given scheme identified by its UUID is supported on 3460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * this device. 3560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * @param uuid The UUID of the crypto scheme. 3660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber */ 3760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber public static final boolean isCryptoSchemeSupported(UUID uuid) { 3860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber return isCryptoSchemeSupportedNative(getByteArrayFromUUID(uuid)); 3960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber } 4060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 4160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber private static final byte[] getByteArrayFromUUID(UUID uuid) { 4260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber long msb = uuid.getMostSignificantBits(); 4360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber long lsb = uuid.getLeastSignificantBits(); 4460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 4560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber byte[] uuidBytes = new byte[16]; 4660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber for (int i = 0; i < 8; ++i) { 4760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber uuidBytes[i] = (byte)(msb >>> (8 * (7 - i))); 4860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber uuidBytes[8 + i] = (byte)(lsb >>> (8 * (7 - i))); 4960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber } 5007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 5160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber return uuidBytes; 5207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 5307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 5460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber private static final native boolean isCryptoSchemeSupportedNative(byte[] uuid); 5560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 5660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /** 5760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * Instantiate a MediaCrypto object using opaque, crypto scheme specific 5860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * data. 5960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * @param uuid The UUID of the crypto scheme. 6060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * @param initData Opaque initialization data specific to the crypto scheme. 6160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber */ 6260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber public MediaCrypto(UUID uuid, byte[] initData) throws MediaCryptoException { 6360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber native_setup(getByteArrayFromUUID(uuid), initData); 6460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber } 6560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 6660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber /** 6760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * Query if the crypto scheme requires the use of a secure decoder 6860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * to decode data of the given mime type. 6960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * @param mime The mime type of the media data 7060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber */ 7107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber public final native boolean requiresSecureDecoderComponent(String mime); 7207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 7307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber @Override 7407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber protected void finalize() { 7507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber native_finalize(); 7607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 7707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 7807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber public native final void release(); 7907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber private static native final void native_init(); 8060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 8160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber private native final void native_setup(byte[] uuid, byte[] initData) 8260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber throws MediaCryptoException; 8360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber 8407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber private native final void native_finalize(); 8507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 8607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber static { 8707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber System.loadLibrary("media_jni"); 8807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber native_init(); 8907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 9007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 91075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat private long mNativeContext; 9207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber} 93