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