IMediaSource.cpp revision b65990f4a0cf01db0b9f21c68fcf8824ae03a178
1b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen/* 2b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Copyright (C) 2009 The Android Open Source Project 3b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * 4b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Licensed under the Apache License, Version 2.0 (the "License"); 5b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * you may not use this file except in compliance with the License. 6b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * You may obtain a copy of the License at 7b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * 8b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * http://www.apache.org/licenses/LICENSE-2.0 9b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * 10b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * Unless required by applicable law or agreed to in writing, software 11b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * distributed under the License is distributed on an "AS IS" BASIS, 12b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * See the License for the specific language governing permissions and 14b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen * limitations under the License. 15b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen */ 16b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 17b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen//#define LOG_NDEBUG 0 18b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#define LOG_TAG "BpMediaSource" 19b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <utils/Log.h> 20b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 21b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen#include <inttypes.h> 22b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <stdint.h> 23b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <sys/types.h> 24b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 25b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <binder/Parcel.h> 26b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <media/IMediaSource.h> 27b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <media/stagefright/MediaBuffer.h> 28b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <media/stagefright/MediaSource.h> 29b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <media/stagefright/MetaData.h> 30b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 31b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissennamespace android { 32b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 33b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenenum { 34b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen START = IBinder::FIRST_CALL_TRANSACTION, 35b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen STOP, 36b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen PAUSE, 37b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen GETFORMAT, 38b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen READ, 39b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen RELEASE_BUFFER 40b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen}; 41b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 42b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenenum { 43b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen NULL_BUFFER, 44b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen SHARED_BUFFER, 45b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen INLINE_BUFFER 46b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 47b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 48b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenclass RemoteMediaBufferReleaser : public BBinder { 49b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenpublic: 50b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen RemoteMediaBufferReleaser(MediaBuffer *buf) { 51b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf = buf; 52b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 53b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ~RemoteMediaBufferReleaser() { 54b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (mBuf) { 55b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGW("RemoteMediaBufferReleaser dtor called while still holding buffer"); 56b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf->release(); 57b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 58b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 59b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen virtual status_t onTransact( uint32_t code, 60b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen const Parcel& data, 61b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen Parcel* reply, 62b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen uint32_t flags = 0) { 63b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (code == RELEASE_BUFFER) { 64b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf->release(); 65b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf = NULL; 66b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen return OK; 67b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } else { 68b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen return BBinder::onTransact(code, data, reply, flags); 69b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 70b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 71b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenprivate: 72b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen MediaBuffer *mBuf; 73b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 74b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 75b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 76b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenclass RemoteMediaBufferWrapper : public MediaBuffer { 77b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenpublic: 78b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen RemoteMediaBufferWrapper(sp<IMemory> mem, sp<IBinder> source); 79b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenprotected: 80b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen virtual ~RemoteMediaBufferWrapper(); 81b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenprivate: 82b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IMemory> mMemory; 83b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IBinder> mRemoteSource; 84b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 85b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 86b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco NelissenRemoteMediaBufferWrapper::RemoteMediaBufferWrapper(sp<IMemory> mem, sp<IBinder> source) 87b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen: MediaBuffer(mem->pointer(), mem->size()) { 88b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mMemory = mem; 89b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mRemoteSource = source; 90b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen} 91b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 92b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco NelissenRemoteMediaBufferWrapper::~RemoteMediaBufferWrapper() { 93b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mMemory.clear(); 94b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // Explicitly ask the remote side to release the buffer. We could also just clear 95b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // mRemoteSource, but that doesn't immediately release the reference on the remote side. 96b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen Parcel data, reply; 97b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mRemoteSource->transact(RELEASE_BUFFER, data, &reply); 98b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mRemoteSource.clear(); 99b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen} 100b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 101b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenclass BpMediaSource : public BpInterface<IMediaSource> { 102b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenpublic: 103b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen BpMediaSource(const sp<IBinder>& impl) 104b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen : BpInterface<IMediaSource>(impl) 105b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen { 106b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 107b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 108b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t start(MetaData *params) { 109b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("start"); 110b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 111b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 112b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (params) { 113b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen params->writeToParcel(data); 114b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 115b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(START, data, &reply); 116b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR && params) { 117b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("ignoring potentially modified MetaData from start"); 118b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("input:"); 119b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen params->dumpToLog(); 120b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta = MetaData::createFromParcel(reply); 121b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("output:"); 122b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->dumpToLog(); 123b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 124b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 125b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 126b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 127b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t stop() { 128b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("stop"); 129b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 130b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 131b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return remote()->transact(STOP, data, &reply); 132b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 133b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 134b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual sp<MetaData> getFormat() { 135b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("getFormat"); 136b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 137b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 138b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(GETFORMAT, data, &reply); 139b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR) { 140b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mMetaData = MetaData::createFromParcel(reply); 141b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mMetaData; 142b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 143b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NULL; 144b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 145b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 146b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t read(MediaBuffer **buffer, const ReadOptions *options) { 147b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("read"); 148b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 149b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 150b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (options) { 151b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeByteArray(sizeof(*options), (uint8_t*) options); 152b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 153b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(READ, data, &reply); 154b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret != NO_ERROR) { 155b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 156b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 157b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // wrap the returned data in a MediaBuffer 158b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ret = reply.readInt32(); 159b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen int32_t buftype = reply.readInt32(); 160b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (buftype == SHARED_BUFFER) { 161b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IBinder> remote = reply.readStrongBinder(); 162b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IBinder> binder = reply.readStrongBinder(); 163b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IMemory> mem = interface_cast<IMemory>(binder); 164b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (mem == NULL) { 165b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGE("received NULL IMemory for shared buffer"); 166b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 167b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen size_t offset = reply.readInt32(); 168b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen size_t length = reply.readInt32(); 169b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen MediaBuffer *buf = new RemoteMediaBufferWrapper(mem, remote); 170b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->set_range(offset, length); 171b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->updateFromParcel(reply); 172b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen *buffer = buf; 173b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } else if (buftype == NULL_BUFFER) { 174b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGV("got status %d and NULL buffer", ret); 175b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *buffer = NULL; 176b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } else { 177b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen int32_t len = reply.readInt32(); 178b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("got status %d and len %d", ret, len); 179b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *buffer = new MediaBuffer(len); 180b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen reply.read((*buffer)->data(), len); 181b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen (*buffer)->meta_data()->updateFromParcel(reply); 182b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 183b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 184b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 185b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 186b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t pause() { 187b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("pause"); 188b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 189b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 190b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return remote()->transact(PAUSE, data, &reply); 191b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 192b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 193b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t setBuffers(const Vector<MediaBuffer *> & buffers __unused) { 194b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("setBuffers NOT IMPLEMENTED"); 195b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ERROR_UNSUPPORTED; // default 196b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 197b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 198b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenprivate: 199b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // NuPlayer passes pointers-to-metadata around, so we use this to keep the metadata alive 200b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // XXX: could we use this for caching, or does metadata change on the fly? 201b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> mMetaData; 202b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 203b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen}; 204b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 205b2487f03f12dcafdb801fc0007c8df8412397f44Marco NelissenIMPLEMENT_META_INTERFACE(MediaSource, "android.media.IMediaSource"); 206b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 207b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#undef LOG_TAG 208b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#define LOG_TAG "BnMediaSource" 209b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 210b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenstatus_t BnMediaSource::onTransact( 211b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 212b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen{ 213b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen switch (code) { 214b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case START: { 215b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("start"); 216b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 217b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta; 218b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (data.dataAvail()) { 219b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta = MetaData::createFromParcel(data); 220b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 221b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = start(meta.get()); 222b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR && meta != NULL) { 223b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->writeToParcel(*reply); 224b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 225b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 226b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 227b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case STOP: { 228b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("stop"); 229b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 230b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return stop(); 231b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 232b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case PAUSE: { 233b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("pause"); 234b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 235b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return pause(); 236b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 237b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case GETFORMAT: { 238b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("getFormat"); 239b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 240b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta = getFormat(); 241b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (meta != NULL) { 242b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->writeToParcel(*reply); 243b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NO_ERROR; 244b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 245b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return UNKNOWN_ERROR; 246b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 247b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case READ: { 248b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("read"); 249b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 250b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret; 251b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen MediaBuffer *buf = NULL; 252b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ReadOptions opts; 253b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen uint32_t len; 254b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (data.readUint32(&len) == NO_ERROR && 255b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen len == sizeof(opts) && data.read((void*)&opts, len) == NO_ERROR) { 256b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ret = read(&buf, &opts); 257b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } else { 258b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ret = read(&buf, NULL); 259b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 260b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 261b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen reply->writeInt32(ret); 262b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (buf != NULL) { 263b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen size_t usedSize = buf->range_length(); 264b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // even if we're using shared memory, we might not want to use it, since for small 265b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // sizes it's faster to copy data through the Binder transaction 266b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (buf->mMemory != NULL && usedSize >= 64 * 1024) { 267b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGV("buffer is using shared memory: %zu", usedSize); 268b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(SHARED_BUFFER); 269b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen RemoteMediaBufferReleaser *wrapper = new RemoteMediaBufferReleaser(buf); 270b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeStrongBinder(wrapper); 271b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeStrongBinder(IInterface::asBinder(buf->mMemory)); 272b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(buf->range_offset()); 273b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(usedSize); 274b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->writeToParcel(*reply); 275b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } else { 276b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // buffer is not in shared memory, or is small: copy it 277b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (buf->mMemory != NULL) { 278b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGV("%zu shared mem available, but only %zu used", buf->mMemory->size(), buf->range_length()); 279b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 280b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(INLINE_BUFFER); 281b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeByteArray(buf->range_length(), (uint8_t*)buf->data() + buf->range_offset()); 282b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->writeToParcel(*reply); 283b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->release(); 284b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 285b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } else { 286b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("ret %d, buf %p", ret, buf); 287b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(NULL_BUFFER); 288b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 289b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NO_ERROR; 290b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 291b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen default: 292b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return BBinder::onTransact(code, data, reply, flags); 293b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 294b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 295b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 296b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen//////////////////////////////////////////////////////////////////////////////// 297b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 298b2487f03f12dcafdb801fc0007c8df8412397f44Marco NelissenIMediaSource::ReadOptions::ReadOptions() { 299b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen reset(); 300b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 301b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 302b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::reset() { 303b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions = 0; 304b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = 0; 305b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mLatenessUs = 0; 306b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = false; 307b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 308b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 309b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setNonBlocking() { 310b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = true; 311b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 312b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 313b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::clearNonBlocking() { 314b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = false; 315b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 316b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 317b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenbool IMediaSource::ReadOptions::getNonBlocking() const { 318b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mNonBlocking; 319b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 320b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 321b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setSeekTo(int64_t time_us, SeekMode mode) { 322b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions |= kSeekTo_Option; 323b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = time_us; 324b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekMode = mode; 325b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 326b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 327b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::clearSeekTo() { 328b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions &= ~kSeekTo_Option; 329b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = 0; 330b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekMode = SEEK_CLOSEST_SYNC; 331b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 332b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 333b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenbool IMediaSource::ReadOptions::getSeekTo( 334b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen int64_t *time_us, SeekMode *mode) const { 335b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *time_us = mSeekTimeUs; 336b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *mode = mSeekMode; 337b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return (mOptions & kSeekTo_Option) != 0; 338b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 339b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 340b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setLateBy(int64_t lateness_us) { 341b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mLatenessUs = lateness_us; 342b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 343b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 344b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenint64_t IMediaSource::ReadOptions::getLateBy() const { 345b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mLatenessUs; 346b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 347b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 348b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 349b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} // namespace android 350b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 351