MediaCrypto.java revision 075e9a19ce645752f8282bc19c91b25978a7dc52
1988323c57bd25a58f05dfa492d9b9c8ab62c5153satok/* 2988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Copyright (C) 2012 The Android Open Source Project 3988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 4988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Licensed under the Apache License, Version 2.0 (the "License"); 5988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * you may not use this file except in compliance with the License. 6988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * You may obtain a copy of the License at 7988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 8988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * http://www.apache.org/licenses/LICENSE-2.0 9988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 10988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Unless required by applicable law or agreed to in writing, software 11988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * distributed under the License is distributed on an "AS IS" BASIS, 12988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * See the License for the specific language governing permissions and 14988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * limitations under the License. 15988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 16988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 17988323c57bd25a58f05dfa492d9b9c8ab62c5153satokpackage android.media; 18988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 193f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawaimport android.media.MediaCryptoException; 203f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawaimport java.util.UUID; 213f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawa 22988323c57bd25a58f05dfa492d9b9c8ab62c5153satok/** 23174843afb629c57af19e14ee3ec4a91358061dd9Yohei Yukawa * MediaCrypto class can be used in conjunction with {@link android.media.MediaCodec} 24988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * to decode encrypted media data. 257fa65eef203c4ed3ce00ddef96ccf311d3bfb58cYohei Yukawa * 26988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * Crypto schemes are assigned 16 byte UUIDs, 27988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * the method {@link #isCryptoSchemeSupported} can be used to query if a given 28988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * scheme is supported on the device. 29988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * 303f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawa */ 31fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeypublic final class MediaCrypto { 32988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 3303b2ea1102d9e3e9f189173878706ab04533eea3satok * Query if the given scheme identified by its UUID is supported on 3403b2ea1102d9e3e9f189173878706ab04533eea3satok * this device. 35f0f168066335ac1ec103e575d693a957da714c4eYohei Yukawa * @param uuid The UUID of the crypto scheme. 3608ce18728cbdadbf376d2d1014daa06cf05c295aYohei Yukawa */ 379faa2aeb8a0d40bd834b7a4bf6343fbae3a302e3Yohei Yukawa public static final boolean isCryptoSchemeSupported(UUID uuid) { 38988323c57bd25a58f05dfa492d9b9c8ab62c5153satok return isCryptoSchemeSupportedNative(getByteArrayFromUUID(uuid)); 3900d2d4125e4944ebcabdecd423573ee00f716293Satoshi Kataoka } 40988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 41988323c57bd25a58f05dfa492d9b9c8ab62c5153satok private static final byte[] getByteArrayFromUUID(UUID uuid) { 42988323c57bd25a58f05dfa492d9b9c8ab62c5153satok long msb = uuid.getMostSignificantBits(); 430f0a37ba7def8db2c3e0ff1d7d8a30360e889f3fGuliz Tuncay long lsb = uuid.getLeastSignificantBits(); 44988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 45988323c57bd25a58f05dfa492d9b9c8ab62c5153satok byte[] uuidBytes = new byte[16]; 46988323c57bd25a58f05dfa492d9b9c8ab62c5153satok for (int i = 0; i < 8; ++i) { 4706a2624049f09e1ad68f8ab74fdb525aacd5c1e5Guliz Tuncay uuidBytes[i] = (byte)(msb >>> (8 * (7 - i))); 486be6d7548fb7c29a4d46dc985318ab2adf69f95fsatok uuidBytes[8 + i] = (byte)(lsb >>> (8 * (7 - i))); 495357806980269d846a15c845a6fcc0384fb18860satok } 50988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 51f982e75a262db16e60fd3565638d399315dba761Guliz Tuncay return uuidBytes; 52988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 5300d2d4125e4944ebcabdecd423573ee00f716293Satoshi Kataoka 54095fa371643b1d8e829067ea4ed93c357b39e773Yohei Yukawa private static final native boolean isCryptoSchemeSupportedNative(byte[] uuid); 55988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 56988323c57bd25a58f05dfa492d9b9c8ab62c5153satok /** 575357806980269d846a15c845a6fcc0384fb18860satok * Instantiate a MediaCrypto object using opaque, crypto scheme specific 58988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * data. 5906a2624049f09e1ad68f8ab74fdb525aacd5c1e5Guliz Tuncay * @param uuid The UUID of the crypto scheme. 6005f24700613fb4dce95fb6d5f8fe460d7a30c128satok * @param initData Opaque initialization data specific to the crypto scheme. 6105f24700613fb4dce95fb6d5f8fe460d7a30c128satok */ 62988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public MediaCrypto(UUID uuid, byte[] initData) throws MediaCryptoException { 63ada8c4e6a3da96a795f39a1028d448eb7aebfab3satok native_setup(getByteArrayFromUUID(uuid), initData); 64988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 6571e14da93c8fea512fedf1b5226d28cd2c330238Dianne Hackborn 6603b2ea1102d9e3e9f189173878706ab04533eea3satok /** 6771e14da93c8fea512fedf1b5226d28cd2c330238Dianne Hackborn * Query if the crypto scheme requires the use of a secure decoder 68174843afb629c57af19e14ee3ec4a91358061dd9Yohei Yukawa * to decode data of the given mime type. 69988323c57bd25a58f05dfa492d9b9c8ab62c5153satok * @param mime The mime type of the media data 70988323c57bd25a58f05dfa492d9b9c8ab62c5153satok */ 71988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public final native boolean requiresSecureDecoderComponent(String mime); 72174843afb629c57af19e14ee3ec4a91358061dd9Yohei Yukawa 7371e14da93c8fea512fedf1b5226d28cd2c330238Dianne Hackborn @Override 7473ac947f6ea3cf12f88f48f181e7917d705997ebYohei Yukawa protected void finalize() { 75988323c57bd25a58f05dfa492d9b9c8ab62c5153satok native_finalize(); 76988323c57bd25a58f05dfa492d9b9c8ab62c5153satok } 77988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 78988323c57bd25a58f05dfa492d9b9c8ab62c5153satok public native final void release(); 79988323c57bd25a58f05dfa492d9b9c8ab62c5153satok private static native final void native_init(); 80988323c57bd25a58f05dfa492d9b9c8ab62c5153satok 81988323c57bd25a58f05dfa492d9b9c8ab62c5153satok private native final void native_setup(byte[] uuid, byte[] initData) 8206a2624049f09e1ad68f8ab74fdb525aacd5c1e5Guliz Tuncay throws MediaCryptoException; 83f0f168066335ac1ec103e575d693a957da714c4eYohei Yukawa 84f0f168066335ac1ec103e575d693a957da714c4eYohei Yukawa private native final void native_finalize(); 8510ae385e29a0cc49e59b6ce53f803c938c1ec277Guliz Tuncay 86988323c57bd25a58f05dfa492d9b9c8ab62c5153satok static { 873f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawa System.loadLibrary("media_jni"); 883f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawa native_init(); 893f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawa } 903f8c568883e5df9dd0c44d19c5c4d23edd3756c3Yohei Yukawa 9106a2624049f09e1ad68f8ab74fdb525aacd5c1e5Guliz Tuncay private long mNativeContext; 9206a2624049f09e1ad68f8ab74fdb525aacd5c1e5Guliz Tuncay} 9306a2624049f09e1ad68f8ab74fdb525aacd5c1e5Guliz Tuncay