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