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 21050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaCrypto.h" 22050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaCodec.h" 23050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include "NdkMediaFormatPriv.h" 24050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 25050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 26050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <utils/Log.h> 27050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <utils/StrongPointer.h> 28050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <binder/IServiceManager.h> 29050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <media/ICrypto.h> 30050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <media/IMediaPlayerService.h> 31050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <android_runtime/AndroidRuntime.h> 32050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <android_util_Binder.h> 33050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 34050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen#include <jni.h> 35050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 36050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenusing namespace android; 37050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 38e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissenstatic media_status_t translate_error(status_t err) { 39050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (err == OK) { 40e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen return AMEDIA_OK; 41050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 42050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen ALOGE("sf error code: %d", err); 43e419d7cd5c62b4b5866a45d59c5770bb470193c1Marco Nelissen return AMEDIA_ERROR_UNKNOWN; 44050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 45050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 46050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 47050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenstatic sp<ICrypto> makeCrypto() { 48050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<IServiceManager> sm = defaultServiceManager(); 49050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 50050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<IBinder> binder = 51050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sm->getService(String16("media.player")); 52050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 53050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<IMediaPlayerService> service = 54050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen interface_cast<IMediaPlayerService>(binder); 55050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 56050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (service == NULL) { 57050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return NULL; 58050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 59050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 60050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> crypto = service->makeCrypto(); 61050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 62050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (crypto == NULL || (crypto->initCheck() != OK && crypto->initCheck() != NO_INIT)) { 63050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return NULL; 64050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 65050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 66050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto; 67050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 68050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 69050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenstruct AMediaCrypto { 70050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> mCrypto; 71050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen}; 72050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 73050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 74050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenextern "C" { 75050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 76050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 773425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 78829e097f832b4c4c41733f9b77121888204d993eMarco Nelissenbool AMediaCrypto_isCryptoSchemeSupported(const AMediaUUID uuid) { 79050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> crypto = makeCrypto(); 80050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (crypto == NULL) { 81050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return false; 82050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 83050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto->isCryptoSchemeSupported(uuid); 84050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 85050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 863425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 87050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenbool AMediaCrypto_requiresSecureDecoderComponent(const char *mime) { 88050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> crypto = makeCrypto(); 89050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (crypto == NULL) { 90050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return false; 91050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 92050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto->requiresSecureDecoderComponent(mime); 93050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 94050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 953425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 96050eb3280d7305b84f723d515be2dc9606dc39d1Marco NelissenAMediaCrypto* AMediaCrypto_new(const AMediaUUID uuid, const void *data, size_t datasize) { 97050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 98050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen sp<ICrypto> tmp = makeCrypto(); 99050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (tmp == NULL) { 100050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return NULL; 101050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 102050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 103050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen if (tmp->createPlugin(uuid, data, datasize) != 0) { 104050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return NULL; 105050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen } 106050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 107050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen AMediaCrypto *crypto = new AMediaCrypto(); 108050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen crypto->mCrypto = tmp; 109050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 110050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen return crypto; 111050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 112050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 1133425fd5a55dd31e261d2f2a9590c762d6d0a6b79Marco NelissenEXPORT 114050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissenvoid AMediaCrypto_delete(AMediaCrypto* crypto) { 115050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen delete crypto; 116050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} 117050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 118050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 119050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 120050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen} // extern "C" 121050eb3280d7305b84f723d515be2dc9606dc39d1Marco Nelissen 122