19dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang/* 29dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * Copyright (C) 2017 The Android Open Source Project 39dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * 49dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 59dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * you may not use this file except in compliance with the License. 69dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * You may obtain a copy of the License at 79dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * 89dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * http://www.apache.org/licenses/LICENSE-2.0 99dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * 109dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * Unless required by applicable law or agreed to in writing, software 119dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 129dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * See the License for the specific language governing permissions and 149dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang * limitations under the License. 159dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang */ 169dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang//#define LOG_NDEBUG 0 179dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#define LOG_TAG "MediaCas" 189dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 199dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <media/MediaCasDefs.h> 209dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <utils/Log.h> 219dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang#include <binder/IMemory.h> 229dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 239dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangnamespace android { 249dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangnamespace media { 259dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 269dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang/////////////////////////////////////////////////////////////////////////////// 279dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangnamespace MediaCas { 289dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 299dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatus_t ParcelableCasData::readFromParcel(const Parcel* parcel) { 309dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return parcel->readByteVector(this); 319dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} 329dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 339dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatus_t ParcelableCasData::writeToParcel(Parcel* parcel) const { 349dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return parcel->writeByteVector(*this); 359dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} 369dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 379dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang/////////////////////////////////////////////////////////////////////////////// 389dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 399dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatus_t ParcelableCasPluginDescriptor::readFromParcel(const Parcel* /*parcel*/) { 409dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang ALOGE("CAPluginDescriptor::readFromParcel() shouldn't be called"); 419dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return INVALID_OPERATION; 429dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} 439dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 449dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatus_t ParcelableCasPluginDescriptor::writeToParcel(Parcel* parcel) const { 459dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang status_t err = parcel->writeInt32(mCASystemId); 469dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != NO_ERROR) { 479dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 489dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 499dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return parcel->writeString16(mName); 509dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} 519dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 529dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} // namespace MediaCas 539dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang/////////////////////////////////////////////////////////////////////////////// 549dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 559dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangnamespace MediaDescrambler { 569dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 579dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangDescrambleInfo::DescrambleInfo() {} 589dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 599dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong ZhangDescrambleInfo::~DescrambleInfo() {} 609dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 619dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatus_t DescrambleInfo::readFromParcel(const Parcel* parcel) { 629dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang status_t err = parcel->readInt32((int32_t*)&dstType); 639dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 649dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 659dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 669dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (dstType != kDestinationTypeNativeHandle 679dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang && dstType != kDestinationTypeVmPointer) { 689dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return BAD_VALUE; 699dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 709dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 719dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->readInt32((int32_t*)&scramblingControl); 729dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 739dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 749dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 759dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 769dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->readUint32((uint32_t*)&numSubSamples); 779dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 789dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 799dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 809dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (numSubSamples > 0xffff) { 819dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return BAD_VALUE; 829dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 839dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 849dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang subSamples = new DescramblerPlugin::SubSample[numSubSamples]; 859dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (subSamples == NULL) { 869dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return NO_MEMORY; 879dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 889dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 899dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang for (size_t i = 0; i < numSubSamples; i++) { 909dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->readUint32(&subSamples[i].mNumBytesOfClearData); 919dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 929dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 939dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 949dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->readUint32(&subSamples[i].mNumBytesOfEncryptedData); 959dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 969dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 979dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 989dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 999dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1009dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang srcMem = interface_cast<IMemory>(parcel->readStrongBinder()); 1019dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (srcMem == NULL) { 1029dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return BAD_VALUE; 1039dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1049dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1059dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->readInt32(&srcOffset); 1069dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1079dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1089dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1099dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1109dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang native_handle_t *nativeHandle = NULL; 1119dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (dstType == kDestinationTypeNativeHandle) { 1129dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang nativeHandle = parcel->readNativeHandle(); 1139dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang dstPtr = static_cast<void *>(nativeHandle); 1149dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } else { 1159dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang dstPtr = NULL; 1169dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1179dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1189dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->readInt32(&dstOffset); 1199dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1209dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1219dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1229dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1239dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return OK; 1249dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} 1259dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1269dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhangstatus_t DescrambleInfo::writeToParcel(Parcel* parcel) const { 1279dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (dstType != kDestinationTypeNativeHandle 1289dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang && dstType != kDestinationTypeVmPointer) { 1299dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return BAD_VALUE; 1309dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1319dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1329dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang status_t err = parcel->writeInt32((int32_t)dstType); 1339dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1349dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1359dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1369dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1379dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->writeInt32(scramblingControl); 1389dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1399dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1409dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1419dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1429dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->writeUint32(numSubSamples); 1439dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1449dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1459dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1469dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1479dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang for (size_t i = 0; i < numSubSamples; i++) { 1489dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->writeUint32(subSamples[i].mNumBytesOfClearData); 1499dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1509dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1519dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1529dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->writeUint32(subSamples[i].mNumBytesOfEncryptedData); 1539dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1549dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1559dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1569dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1579dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1589dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->writeStrongBinder(IInterface::asBinder(srcMem)); 1599dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1609dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1619dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1629dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1639dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->writeInt32(srcOffset); 1649dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1659dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1669dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1679dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1689dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (dstType == kDestinationTypeNativeHandle) { 1699dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang parcel->writeNativeHandle(static_cast<native_handle_t *>(dstPtr)); 1709dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1719dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1729dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang err = parcel->writeInt32(dstOffset); 1739dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang if (err != OK) { 1749dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return err; 1759dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang } 1769dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1779dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang return OK; 1789dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} 1799dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1809dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} // namespace MediaDescrambler 1819dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 1829dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} // namespace media 1839dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang} // namespace android 1849dbe9a57bf0ae2494ec312d6c1b06feec20e9ec9Chong Zhang 185