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