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