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