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