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