1050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen/* 2050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * Copyright (C) 2014 The Android Open Source Project 3050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * 4050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * you may not use this file except in compliance with the License. 6050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * You may obtain a copy of the License at 7050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * 8050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * 10050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * See the License for the specific language governing permissions and 14050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen * limitations under the License. 15050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen */ 16050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 17c7a11b2208aa8f1e6a39eb70a136fbc0dafd3260Marco Nelissen//#define LOG_NDEBUG 0 18050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#define LOG_TAG "NdkMediaCrypto" 19050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 20050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 217e8d4ba5887affda749978d787b898bf31fda729Colin Cross#include <media/NdkMediaCrypto.h> 227e8d4ba5887affda749978d787b898bf31fda729Colin Cross#include <media/NdkMediaCodec.h> 23050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaFormatPriv.h" 24050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 25050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 26a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <cutils/properties.h> 27050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <utils/Log.h> 28050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <utils/StrongPointer.h> 29050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <binder/IServiceManager.h> 30050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <media/ICrypto.h> 31a69729dc76b97c44387088d351480d5d0701517eJeff Tinker#include <media/IMediaDrmService.h> 32050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <android_runtime/AndroidRuntime.h> 33050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <android_util_Binder.h> 34050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 35050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <jni.h> 36050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 37050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenusing namespace android; 38050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 39050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenstatic sp<ICrypto> makeCrypto() { 40050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<IServiceManager> sm = defaultServiceManager(); 413003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker sp<IBinder> binder = sm->getService(String16("media.drm")); 423003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker 433003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker sp<IMediaDrmService> service = interface_cast<IMediaDrmService>(binder); 443003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker if (service == NULL) { 453003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker return NULL; 46050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 47050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 483003807fcfa96c9cbfea18d643f47108aa116cd5Jeff Tinker sp<ICrypto> crypto = service->makeCrypto(); 49050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (crypto == NULL || (crypto->initCheck() != OK && crypto->initCheck() != NO_INIT)) { 50050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return NULL; 51050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 52050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto; 53050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 54050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 55050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenstruct AMediaCrypto { 56050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> mCrypto; 57050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen}; 58050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 59050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 60050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenextern "C" { 61050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 62050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 633425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 64829e097f832b4c4c41733f9b77121888204d993eMarco Nelissenbool AMediaCrypto_isCryptoSchemeSupported(const AMediaUUID uuid) { 65050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> crypto = makeCrypto(); 66050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (crypto == NULL) { 67050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return false; 68050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 69050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto->isCryptoSchemeSupported(uuid); 70050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 71050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 723425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 73050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenbool AMediaCrypto_requiresSecureDecoderComponent(const char *mime) { 74050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> crypto = makeCrypto(); 75050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (crypto == NULL) { 76050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return false; 77050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 78050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto->requiresSecureDecoderComponent(mime); 79050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 80050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 813425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 82050eb3280d7305b84f723d515be2dc9606dc39d1Marco NelissenAMediaCrypto* AMediaCrypto_new(const AMediaUUID uuid, const void *data, size_t datasize) { 83050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 84050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> tmp = makeCrypto(); 85050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (tmp == NULL) { 86050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return NULL; 87050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 88050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 89050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (tmp->createPlugin(uuid, data, datasize) != 0) { 90050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return NULL; 91050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 92050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 93050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen AMediaCrypto *crypto = new AMediaCrypto(); 94050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen crypto->mCrypto = tmp; 95050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 96050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto; 97050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 98050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 993425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 100050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenvoid AMediaCrypto_delete(AMediaCrypto* crypto) { 101050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen delete crypto; 102050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 103050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 104050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 105050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 106050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} // extern "C" 107050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 108