19dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
29dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang/*
39dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * Copyright (C) 2017 The Android Open Source Project
49dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang *
59dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License");
69dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * you may not use this file except in compliance with the License.
79dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * You may obtain a copy of the License at
89dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang *
99dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang *      http://www.apache.org/licenses/LICENSE-2.0
109dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang *
119dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * Unless required by applicable law or agreed to in writing, software
129dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS,
139dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * See the License for the specific language governing permissions and
159dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * limitations under the License.
169dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang */
179dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang//#define LOG_NDEBUG 0
189dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#define LOG_TAG "DescramblerImpl"
199dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
209dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <media/cas/DescramblerAPI.h>
219dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <media/DescramblerImpl.h>
229dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <media/SharedLibrary.h>
239dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <utils/Log.h>
249dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <binder/IMemory.h>
259dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
269dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangnamespace android {
279dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
289dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatic Status getBinderStatus(status_t err) {
299dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    if (err == OK) {
309dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        return Status::ok();
319dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    }
329dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    if (err == BAD_VALUE) {
339dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
349dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    }
359dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    if (err == INVALID_OPERATION) {
369dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        return Status::fromExceptionCode(Status::EX_ILLEGAL_STATE);
379dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    }
389dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    return Status::fromServiceSpecificError(err);
399dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
409dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
419dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatic String8 sessionIdToString(const CasSessionId &sessionId) {
429dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    String8 result;
439dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    for (size_t i = 0; i < sessionId.size(); i++) {
449dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        result.appendFormat("%02x ", sessionId[i]);
459dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    }
469dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    if (result.isEmpty()) {
479dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        result.append("(null)");
489dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    }
499dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    return result;
509dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
519dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
529dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangDescramblerImpl::DescramblerImpl(
539dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        const sp<SharedLibrary>& library, DescramblerPlugin *plugin) :
549dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        mLibrary(library), mPlugin(plugin) {
559dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    ALOGV("CTOR: mPlugin=%p", mPlugin);
569dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
579dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
589dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangDescramblerImpl::~DescramblerImpl() {
599dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    ALOGV("DTOR: mPlugin=%p", mPlugin);
609dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    release();
619dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
629dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
639dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangStatus DescramblerImpl::setMediaCasSession(const CasSessionId& sessionId) {
649dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    ALOGV("setMediaCasSession: sessionId=%s",
659dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            sessionIdToString(sessionId).string());
669dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
679dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    return getBinderStatus(mPlugin->setMediaCasSession(sessionId));
689dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
699dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
709dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangStatus DescramblerImpl::requiresSecureDecoderComponent(
719dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        const String16& mime, bool *result) {
729dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    *result = mPlugin->requiresSecureDecoderComponent(String8(mime));
739dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
749dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    return getBinderStatus(OK);
759dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
769dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
779dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangStatus DescramblerImpl::descramble(
789dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        const DescrambleInfo& info, int32_t *result) {
799dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    ALOGV("descramble");
809dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
819dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    *result = mPlugin->descramble(
829dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.dstType != DescrambleInfo::kDestinationTypeVmPointer,
839dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.scramblingControl,
849dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.numSubSamples,
859dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.subSamples,
869dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.srcMem->pointer(),
879dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.srcOffset,
889dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.dstType == DescrambleInfo::kDestinationTypeVmPointer ?
899dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang                    info.srcMem->pointer() : info.dstPtr,
909dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            info.dstOffset,
919dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang            NULL);
929dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
939dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    return getBinderStatus(*result >= 0 ? OK : *result);
949dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
959dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
969dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangStatus DescramblerImpl::release() {
979dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    ALOGV("release: mPlugin=%p", mPlugin);
989dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
999dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    if (mPlugin != NULL) {
1009dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        delete mPlugin;
1019dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang        mPlugin = NULL;
1029dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    }
1039dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang    return Status::ok();
1049dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang}
1059dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
1069dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} // namespace android
1079dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang
108