199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins/*
299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * Copyright 2015 The Android Open Source Project
399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *
499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * Licensed under the Apache License, Version 2.0 (the "License");
599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * you may not use this file except in compliance with the License.
699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * You may obtain a copy of the License at
799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *
899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *      http://www.apache.org/licenses/LICENSE-2.0
999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins *
1099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * Unless required by applicable law or agreed to in writing, software
1199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * distributed under the License is distributed on an "AS IS" BASIS,
1299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * See the License for the specific language governing permissions and
1499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins * limitations under the License.
1599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins */
1699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
1799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins//#define LOG_NDEBUG 0
1899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#define LOG_TAG "IDataSource"
1999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <utils/Log.h>
2099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <utils/Timers.h>
2199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/IDataSource.h>
2399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <binder/IMemory.h>
2599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <binder/Parcel.h>
2683d9698ce5825566a8621f93c58721d0745fd55fWei Jia#include <drm/drm_framework_common.h>
2799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins#include <media/stagefright/foundation/ADebug.h>
2899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
2999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsnamespace android {
3099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
3199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsenum {
3299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    GET_IMEMORY = IBinder::FIRST_CALL_TRANSACTION,
3399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    READ_AT,
3499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    GET_SIZE,
3599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    CLOSE,
3610551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia    GET_FLAGS,
3769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    TO_STRING,
3883d9698ce5825566a8621f93c58721d0745fd55fWei Jia    DRM_INITIALIZATION,
3999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins};
4099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
4199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsstruct BpDataSource : public BpInterface<IDataSource> {
4299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    BpDataSource(const sp<IBinder>& impl) : BpInterface<IDataSource>(impl) {}
4399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
4499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual sp<IMemory> getIMemory() {
4599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
4699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
4799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(GET_IMEMORY, data, &reply);
4899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        sp<IBinder> binder = reply.readStrongBinder();
4999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return interface_cast<IMemory>(binder);
5099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
5199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
5299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual ssize_t readAt(off64_t offset, size_t size) {
5399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
5499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
5599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInt64(offset);
5699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInt64(size);
5799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(READ_AT, data, &reply);
5899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return reply.readInt64();
5999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
6099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
6199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual status_t getSize(off64_t* size) {
6299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
6399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
6499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(GET_SIZE, data, &reply);
6599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        status_t err = reply.readInt32();
6699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        *size = reply.readInt64();
6799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        return err;
6899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
6999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
7099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    virtual void close() {
7199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        Parcel data, reply;
7299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
7399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        remote()->transact(CLOSE, data, &reply);
7499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
7510551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia
7610551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia    virtual uint32_t getFlags() {
7710551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia        Parcel data, reply;
7810551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia        data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
7910551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia        remote()->transact(GET_FLAGS, data, &reply);
8010551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia        return reply.readUint32();
8110551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia    }
8269d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen
8369d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    virtual String8 toString() {
8469d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        Parcel data, reply;
8569d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
8669d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        remote()->transact(TO_STRING, data, &reply);
8769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        return reply.readString8();
8869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    }
8983d9698ce5825566a8621f93c58721d0745fd55fWei Jia
9083d9698ce5825566a8621f93c58721d0745fd55fWei Jia    virtual sp<DecryptHandle> DrmInitialization(const char *mime) {
9183d9698ce5825566a8621f93c58721d0745fd55fWei Jia        Parcel data, reply;
9283d9698ce5825566a8621f93c58721d0745fd55fWei Jia        data.writeInterfaceToken(IDataSource::getInterfaceDescriptor());
9383d9698ce5825566a8621f93c58721d0745fd55fWei Jia        if (mime == NULL) {
9483d9698ce5825566a8621f93c58721d0745fd55fWei Jia            data.writeInt32(0);
9583d9698ce5825566a8621f93c58721d0745fd55fWei Jia        } else {
9683d9698ce5825566a8621f93c58721d0745fd55fWei Jia            data.writeInt32(1);
9783d9698ce5825566a8621f93c58721d0745fd55fWei Jia            data.writeCString(mime);
9883d9698ce5825566a8621f93c58721d0745fd55fWei Jia        }
9983d9698ce5825566a8621f93c58721d0745fd55fWei Jia        remote()->transact(DRM_INITIALIZATION, data, &reply);
10083d9698ce5825566a8621f93c58721d0745fd55fWei Jia        sp<DecryptHandle> handle;
10183d9698ce5825566a8621f93c58721d0745fd55fWei Jia        if (reply.dataAvail() != 0) {
10283d9698ce5825566a8621f93c58721d0745fd55fWei Jia            handle = new DecryptHandle();
10383d9698ce5825566a8621f93c58721d0745fd55fWei Jia            handle->decryptId = reply.readInt32();
10483d9698ce5825566a8621f93c58721d0745fd55fWei Jia            handle->mimeType = reply.readString8();
10583d9698ce5825566a8621f93c58721d0745fd55fWei Jia            handle->decryptApiType = reply.readInt32();
10683d9698ce5825566a8621f93c58721d0745fd55fWei Jia            handle->status = reply.readInt32();
10783d9698ce5825566a8621f93c58721d0745fd55fWei Jia
10883d9698ce5825566a8621f93c58721d0745fd55fWei Jia            const int bufferLength = data.readInt32();
10983d9698ce5825566a8621f93c58721d0745fd55fWei Jia            if (bufferLength != -1) {
11083d9698ce5825566a8621f93c58721d0745fd55fWei Jia                handle->decryptInfo = new DecryptInfo();
11183d9698ce5825566a8621f93c58721d0745fd55fWei Jia                handle->decryptInfo->decryptBufferLength = bufferLength;
11283d9698ce5825566a8621f93c58721d0745fd55fWei Jia            }
11383d9698ce5825566a8621f93c58721d0745fd55fWei Jia
11483d9698ce5825566a8621f93c58721d0745fd55fWei Jia            size_t size = data.readInt32();
11583d9698ce5825566a8621f93c58721d0745fd55fWei Jia            for (size_t i = 0; i < size; ++i) {
11683d9698ce5825566a8621f93c58721d0745fd55fWei Jia                DrmCopyControl key = (DrmCopyControl)data.readInt32();
11783d9698ce5825566a8621f93c58721d0745fd55fWei Jia                int value = data.readInt32();
11883d9698ce5825566a8621f93c58721d0745fd55fWei Jia                handle->copyControlVector.add(key, value);
11983d9698ce5825566a8621f93c58721d0745fd55fWei Jia            }
12083d9698ce5825566a8621f93c58721d0745fd55fWei Jia
12183d9698ce5825566a8621f93c58721d0745fd55fWei Jia            size = data.readInt32();
12283d9698ce5825566a8621f93c58721d0745fd55fWei Jia            for (size_t i = 0; i < size; ++i) {
12383d9698ce5825566a8621f93c58721d0745fd55fWei Jia                String8 key = data.readString8();
12483d9698ce5825566a8621f93c58721d0745fd55fWei Jia                String8 value = data.readString8();
12583d9698ce5825566a8621f93c58721d0745fd55fWei Jia                handle->extendedData.add(key, value);
12683d9698ce5825566a8621f93c58721d0745fd55fWei Jia            }
12783d9698ce5825566a8621f93c58721d0745fd55fWei Jia        }
12883d9698ce5825566a8621f93c58721d0745fd55fWei Jia        return handle;
12983d9698ce5825566a8621f93c58721d0745fd55fWei Jia    }
13099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins};
13199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
13299f31604136d66ae10e20669fb6b5716f342bde0Chris WatkinsIMPLEMENT_META_INTERFACE(DataSource, "android.media.IDataSource");
13399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
13499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsstatus_t BnDataSource::onTransact(
13599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
13699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    switch (code) {
13799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case GET_IMEMORY: {
13899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IDataSource, data, reply);
13999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            reply->writeStrongBinder(IInterface::asBinder(getIMemory()));
14099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
14199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        } break;
14299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case READ_AT: {
14399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IDataSource, data, reply);
14499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            off64_t offset = (off64_t) data.readInt64();
14599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            size_t size = (size_t) data.readInt64();
14699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            reply->writeInt64(readAt(offset, size));
14799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
14899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        } break;
14999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case GET_SIZE: {
15099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IDataSource, data, reply);
15199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            off64_t size;
15299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            status_t err = getSize(&size);
15399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            reply->writeInt32(err);
15499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            reply->writeInt64(size);
15599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
15699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        } break;
15799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        case CLOSE: {
15899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            CHECK_INTERFACE(IDataSource, data, reply);
15999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            close();
16099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return NO_ERROR;
16199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        } break;
16210551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia        case GET_FLAGS: {
16310551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia            CHECK_INTERFACE(IDataSource, data, reply);
16410551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia            reply->writeUint32(getFlags());
16510551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia            return NO_ERROR;
16610551fcd58b3807fc7351d88e6127ec227b993d1Wei Jia        } break;
16769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        case TO_STRING: {
16869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen            CHECK_INTERFACE(IDataSource, data, reply);
16969d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen            reply->writeString8(toString());
17069d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen            return NO_ERROR;
17169d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        } break;
17283d9698ce5825566a8621f93c58721d0745fd55fWei Jia        case DRM_INITIALIZATION: {
17383d9698ce5825566a8621f93c58721d0745fd55fWei Jia            CHECK_INTERFACE(IDataSource, data, reply);
17483d9698ce5825566a8621f93c58721d0745fd55fWei Jia            const char *mime = NULL;
17583d9698ce5825566a8621f93c58721d0745fd55fWei Jia            const int32_t flag = data.readInt32();
17683d9698ce5825566a8621f93c58721d0745fd55fWei Jia            if (flag != 0) {
17783d9698ce5825566a8621f93c58721d0745fd55fWei Jia                mime = data.readCString();
17883d9698ce5825566a8621f93c58721d0745fd55fWei Jia            }
17983d9698ce5825566a8621f93c58721d0745fd55fWei Jia            sp<DecryptHandle> handle = DrmInitialization(mime);
18083d9698ce5825566a8621f93c58721d0745fd55fWei Jia            if (handle != NULL) {
18183d9698ce5825566a8621f93c58721d0745fd55fWei Jia                reply->writeInt32(handle->decryptId);
18283d9698ce5825566a8621f93c58721d0745fd55fWei Jia                reply->writeString8(handle->mimeType);
18383d9698ce5825566a8621f93c58721d0745fd55fWei Jia                reply->writeInt32(handle->decryptApiType);
18483d9698ce5825566a8621f93c58721d0745fd55fWei Jia                reply->writeInt32(handle->status);
18583d9698ce5825566a8621f93c58721d0745fd55fWei Jia
18683d9698ce5825566a8621f93c58721d0745fd55fWei Jia                if (handle->decryptInfo != NULL) {
18783d9698ce5825566a8621f93c58721d0745fd55fWei Jia                    reply->writeInt32(handle->decryptInfo->decryptBufferLength);
18883d9698ce5825566a8621f93c58721d0745fd55fWei Jia                } else {
18983d9698ce5825566a8621f93c58721d0745fd55fWei Jia                    reply->writeInt32(-1);
19083d9698ce5825566a8621f93c58721d0745fd55fWei Jia                }
19183d9698ce5825566a8621f93c58721d0745fd55fWei Jia
19283d9698ce5825566a8621f93c58721d0745fd55fWei Jia                size_t size = handle->copyControlVector.size();
19383d9698ce5825566a8621f93c58721d0745fd55fWei Jia                reply->writeInt32(size);
19483d9698ce5825566a8621f93c58721d0745fd55fWei Jia                for (size_t i = 0; i < size; ++i) {
19583d9698ce5825566a8621f93c58721d0745fd55fWei Jia                    reply->writeInt32(handle->copyControlVector.keyAt(i));
19683d9698ce5825566a8621f93c58721d0745fd55fWei Jia                    reply->writeInt32(handle->copyControlVector.valueAt(i));
19783d9698ce5825566a8621f93c58721d0745fd55fWei Jia                }
19883d9698ce5825566a8621f93c58721d0745fd55fWei Jia
19983d9698ce5825566a8621f93c58721d0745fd55fWei Jia                size = handle->extendedData.size();
20083d9698ce5825566a8621f93c58721d0745fd55fWei Jia                reply->writeInt32(size);
20183d9698ce5825566a8621f93c58721d0745fd55fWei Jia                for (size_t i = 0; i < size; ++i) {
20283d9698ce5825566a8621f93c58721d0745fd55fWei Jia                    reply->writeString8(handle->extendedData.keyAt(i));
20383d9698ce5825566a8621f93c58721d0745fd55fWei Jia                    reply->writeString8(handle->extendedData.valueAt(i));
20483d9698ce5825566a8621f93c58721d0745fd55fWei Jia                }
20583d9698ce5825566a8621f93c58721d0745fd55fWei Jia            }
20683d9698ce5825566a8621f93c58721d0745fd55fWei Jia            return NO_ERROR;
20783d9698ce5825566a8621f93c58721d0745fd55fWei Jia        } break;
20869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen
20999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins        default:
21099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins            return BBinder::onTransact(code, data, reply, flags);
21199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins    }
21299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}
21399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins
21499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins}  // namespace android
215