| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| //#define LOG_NDEBUG 0 |
| #define LOG_TAG "NdkMediaCrypto" |
| |
| |
| #include "NdkMediaCrypto.h" |
| #include "NdkMediaCodec.h" |
| #include "NdkMediaFormatPriv.h" |
| |
| |
| #include <cutils/properties.h> |
| #include <utils/Log.h> |
| #include <utils/StrongPointer.h> |
| #include <binder/IServiceManager.h> |
| #include <media/ICrypto.h> |
| #include <media/IMediaDrmService.h> |
| #include <android_runtime/AndroidRuntime.h> |
| #include <android_util_Binder.h> |
| |
| #include <jni.h> |
| |
| using namespace android; |
| |
| static sp<ICrypto> makeCrypto() { |
| sp<IServiceManager> sm = defaultServiceManager(); |
| sp<IBinder> binder = sm->getService(String16("media.drm")); |
| |
| sp<IMediaDrmService> service = interface_cast<IMediaDrmService>(binder); |
| if (service == NULL) { |
| return NULL; |
| } |
| |
| sp<ICrypto> crypto = service->makeCrypto(); |
| if (crypto == NULL || (crypto->initCheck() != OK && crypto->initCheck() != NO_INIT)) { |
| return NULL; |
| } |
| return crypto; |
| } |
| |
| struct AMediaCrypto { |
| sp<ICrypto> mCrypto; |
| }; |
| |
| |
| extern "C" { |
| |
| |
| EXPORT |
| bool AMediaCrypto_isCryptoSchemeSupported(const AMediaUUID uuid) { |
| sp<ICrypto> crypto = makeCrypto(); |
| if (crypto == NULL) { |
| return false; |
| } |
| return crypto->isCryptoSchemeSupported(uuid); |
| } |
| |
| EXPORT |
| bool AMediaCrypto_requiresSecureDecoderComponent(const char *mime) { |
| sp<ICrypto> crypto = makeCrypto(); |
| if (crypto == NULL) { |
| return false; |
| } |
| return crypto->requiresSecureDecoderComponent(mime); |
| } |
| |
| EXPORT |
| AMediaCrypto* AMediaCrypto_new(const AMediaUUID uuid, const void *data, size_t datasize) { |
| |
| sp<ICrypto> tmp = makeCrypto(); |
| if (tmp == NULL) { |
| return NULL; |
| } |
| |
| if (tmp->createPlugin(uuid, data, datasize) != 0) { |
| return NULL; |
| } |
| |
| AMediaCrypto *crypto = new AMediaCrypto(); |
| crypto->mCrypto = tmp; |
| |
| return crypto; |
| } |
| |
| EXPORT |
| void AMediaCrypto_delete(AMediaCrypto* crypto) { |
| delete crypto; |
| } |
| |
| |
| |
| } // extern "C" |
| |