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> 28e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia#include <media/stagefright/MediaBufferGroup.h> 29b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <media/stagefright/MediaSource.h> 30b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <media/stagefright/MetaData.h> 31b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 32b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissennamespace android { 33b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 34b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenenum { 35b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen START = IBinder::FIRST_CALL_TRANSACTION, 36b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen STOP, 37b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen PAUSE, 38b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen GETFORMAT, 39b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen READ, 401f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia READMULTIPLE, 41b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen RELEASE_BUFFER 42b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen}; 43b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 44b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenenum { 45b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen NULL_BUFFER, 46b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen SHARED_BUFFER, 47b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen INLINE_BUFFER 48b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 49b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 50b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenclass RemoteMediaBufferReleaser : public BBinder { 51b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenpublic: 52e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia RemoteMediaBufferReleaser(MediaBuffer *buf, sp<BnMediaSource> owner) { 53b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf = buf; 54e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia mOwner = owner; 55b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 56b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ~RemoteMediaBufferReleaser() { 57b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (mBuf) { 58b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGW("RemoteMediaBufferReleaser dtor called while still holding buffer"); 59b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf->release(); 60b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 61b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 62b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen virtual status_t onTransact( uint32_t code, 63b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen const Parcel& data, 64b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen Parcel* reply, 65b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen uint32_t flags = 0) { 66b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (code == RELEASE_BUFFER) { 67b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf->release(); 68b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mBuf = NULL; 69b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen return OK; 70b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } else { 71b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen return BBinder::onTransact(code, data, reply, flags); 72b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 73b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 74b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenprivate: 75b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen MediaBuffer *mBuf; 76e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // Keep a ref to ensure MediaBuffer is released before the owner, i.e., BnMediaSource, 77e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // because BnMediaSource needs to delete MediaBufferGroup in its dtor and 78e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // MediaBufferGroup dtor requires all MediaBuffer's have 0 ref count. 79e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia sp<BnMediaSource> mOwner; 80b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 81b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 82b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 83b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenclass RemoteMediaBufferWrapper : public MediaBuffer { 84b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenpublic: 85b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen RemoteMediaBufferWrapper(sp<IMemory> mem, sp<IBinder> source); 86b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenprotected: 87b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen virtual ~RemoteMediaBufferWrapper(); 88b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenprivate: 89b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IMemory> mMemory; 90b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IBinder> mRemoteSource; 91b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 92b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 93b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco NelissenRemoteMediaBufferWrapper::RemoteMediaBufferWrapper(sp<IMemory> mem, sp<IBinder> source) 94b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen: MediaBuffer(mem->pointer(), mem->size()) { 95b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mMemory = mem; 96b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mRemoteSource = source; 97b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen} 98b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 99b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco NelissenRemoteMediaBufferWrapper::~RemoteMediaBufferWrapper() { 100b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mMemory.clear(); 101b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // Explicitly ask the remote side to release the buffer. We could also just clear 102b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // mRemoteSource, but that doesn't immediately release the reference on the remote side. 103b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen Parcel data, reply; 104b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mRemoteSource->transact(RELEASE_BUFFER, data, &reply); 105b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen mRemoteSource.clear(); 106b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen} 107b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 108b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenclass BpMediaSource : public BpInterface<IMediaSource> { 109b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenpublic: 110b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen BpMediaSource(const sp<IBinder>& impl) 111b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen : BpInterface<IMediaSource>(impl) 112b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen { 113b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 114b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 115b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t start(MetaData *params) { 116b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("start"); 117b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 118b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 119b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (params) { 120b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen params->writeToParcel(data); 121b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 122b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(START, data, &reply); 123b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR && params) { 124b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("ignoring potentially modified MetaData from start"); 125b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("input:"); 126b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen params->dumpToLog(); 127b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta = MetaData::createFromParcel(reply); 128b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("output:"); 129b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->dumpToLog(); 130b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 131b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 132b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 133b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 134b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t stop() { 135b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("stop"); 136b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 137b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 138b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return remote()->transact(STOP, data, &reply); 139b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 140b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 141b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual sp<MetaData> getFormat() { 142b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("getFormat"); 143b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 144b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 145b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(GETFORMAT, data, &reply); 146b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR) { 147b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mMetaData = MetaData::createFromParcel(reply); 148b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mMetaData; 149b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 150b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NULL; 151b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 152b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 153b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t read(MediaBuffer **buffer, const ReadOptions *options) { 154b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("read"); 155b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 156b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 157b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (options) { 158b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeByteArray(sizeof(*options), (uint8_t*) options); 159b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 160b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(READ, data, &reply); 161b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret != NO_ERROR) { 162b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 163b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 164b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // wrap the returned data in a MediaBuffer 165b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ret = reply.readInt32(); 166b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen int32_t buftype = reply.readInt32(); 167b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (buftype == SHARED_BUFFER) { 168b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IBinder> remote = reply.readStrongBinder(); 169b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IBinder> binder = reply.readStrongBinder(); 170b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen sp<IMemory> mem = interface_cast<IMemory>(binder); 171b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (mem == NULL) { 172b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGE("received NULL IMemory for shared buffer"); 173b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 174b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen size_t offset = reply.readInt32(); 175b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen size_t length = reply.readInt32(); 176b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen MediaBuffer *buf = new RemoteMediaBufferWrapper(mem, remote); 177b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->set_range(offset, length); 178b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->updateFromParcel(reply); 179b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen *buffer = buf; 180b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } else if (buftype == NULL_BUFFER) { 181b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGV("got status %d and NULL buffer", ret); 182b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *buffer = NULL; 183b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } else { 184b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen int32_t len = reply.readInt32(); 185b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("got status %d and len %d", ret, len); 186b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *buffer = new MediaBuffer(len); 187b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen reply.read((*buffer)->data(), len); 188b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen (*buffer)->meta_data()->updateFromParcel(reply); 189b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 190b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 191b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 192b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 1931f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia virtual status_t readMultiple(Vector<MediaBuffer *> *buffers, uint32_t maxNumBuffers) { 1941f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ALOGV("readMultiple"); 1951f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (buffers == NULL || !buffers->isEmpty()) { 1961f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return BAD_VALUE; 1971f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 1981f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia Parcel data, reply; 1991f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 2001f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia data.writeUint32(maxNumBuffers); 2011f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia status_t ret = remote()->transact(READMULTIPLE, data, &reply); 2021f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (ret != NO_ERROR) { 2031f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return ret; 2041f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 2051f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia // wrap the returned data in a vector of MediaBuffers 2061f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia int32_t bufCount = 0; 2071f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia while (1) { 2081f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (reply.readInt32() == 0) { 2091f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia break; 2101f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 2111f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia int32_t len = reply.readInt32(); 2121f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ALOGV("got len %d", len); 2131f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia MediaBuffer *buf = new MediaBuffer(len); 2141f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia reply.read(buf->data(), len); 2151f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia buf->meta_data()->updateFromParcel(reply); 2161f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia buffers->push_back(buf); 2171f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ++bufCount; 2181f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 2191f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ret = reply.readInt32(); 2201f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ALOGV("got status %d, bufCount %d", ret, bufCount); 2211f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return ret; 2221f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 2231f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia 224b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t pause() { 225b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("pause"); 226b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 227b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 228b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return remote()->transact(PAUSE, data, &reply); 229b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 230b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 231b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t setBuffers(const Vector<MediaBuffer *> & buffers __unused) { 232b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("setBuffers NOT IMPLEMENTED"); 233b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ERROR_UNSUPPORTED; // default 234b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 235b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 236b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenprivate: 237b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // NuPlayer passes pointers-to-metadata around, so we use this to keep the metadata alive 238b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // XXX: could we use this for caching, or does metadata change on the fly? 239b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> mMetaData; 240e7d8e71e45028cbe51839c23f922ba8c506cba82Marco Nelissen 241b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen}; 242b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 243b2487f03f12dcafdb801fc0007c8df8412397f44Marco NelissenIMPLEMENT_META_INTERFACE(MediaSource, "android.media.IMediaSource"); 244b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 245b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#undef LOG_TAG 246b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#define LOG_TAG "BnMediaSource" 247b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 248e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei JiaBnMediaSource::BnMediaSource() 249e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia : mGroup(NULL) { 250e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia} 251e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 252e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei JiaBnMediaSource::~BnMediaSource() { 253e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia delete mGroup; 254e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia mGroup = NULL; 255e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia} 256e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 257b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenstatus_t BnMediaSource::onTransact( 258b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 259b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen{ 260b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen switch (code) { 261b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case START: { 262b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("start"); 263b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 264b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta; 265b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (data.dataAvail()) { 266b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta = MetaData::createFromParcel(data); 267b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 268b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = start(meta.get()); 269b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR && meta != NULL) { 270b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->writeToParcel(*reply); 271b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 272b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 273b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 274b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case STOP: { 275b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("stop"); 276b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 277b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return stop(); 278b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 279b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case PAUSE: { 280b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("pause"); 281b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 282b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return pause(); 283b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 284b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case GETFORMAT: { 285b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("getFormat"); 286b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 287b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta = getFormat(); 288b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (meta != NULL) { 289b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->writeToParcel(*reply); 290b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NO_ERROR; 291b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 292b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return UNKNOWN_ERROR; 293b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 294b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case READ: { 295b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("read"); 296b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 297b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret; 298b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen MediaBuffer *buf = NULL; 299b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ReadOptions opts; 300b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen uint32_t len; 301b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (data.readUint32(&len) == NO_ERROR && 302b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen len == sizeof(opts) && data.read((void*)&opts, len) == NO_ERROR) { 303b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ret = read(&buf, &opts); 304b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } else { 305b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ret = read(&buf, NULL); 306b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 307b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 308b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen reply->writeInt32(ret); 309b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (buf != NULL) { 310b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen size_t usedSize = buf->range_length(); 311b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // even if we're using shared memory, we might not want to use it, since for small 312b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // sizes it's faster to copy data through the Binder transaction 313e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // On the other hand, if the data size is large enough, it's better to use shared 314e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // memory. When data is too large, binder can't handle it. 315e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia if (usedSize >= MediaBuffer::kSharedMemThreshold) { 316e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia ALOGV("use shared memory: %zu", usedSize); 317e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 318e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia MediaBuffer *transferBuf = buf; 319e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia size_t offset = buf->range_offset(); 320e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia if (transferBuf->mMemory == NULL) { 321e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia if (mGroup == NULL) { 322e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia mGroup = new MediaBufferGroup; 323e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia size_t allocateSize = usedSize; 324e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia if (usedSize < SIZE_MAX / 3) { 325e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia allocateSize = usedSize * 3 / 2; 326e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia } 327e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia mGroup->add_buffer(new MediaBuffer(allocateSize)); 328e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia } 329e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 330027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia MediaBuffer *newBuf = NULL; 331e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia ret = mGroup->acquire_buffer( 332027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia &newBuf, false /* nonBlocking */, usedSize); 333027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia if (ret != OK || newBuf == NULL || newBuf->mMemory == NULL) { 334e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia ALOGW("failed to acquire shared memory, ret %d", ret); 335027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia buf->release(); 336027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia if (newBuf != NULL) { 337027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia newBuf->release(); 338027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia } 339e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia reply->writeInt32(NULL_BUFFER); 340e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia return NO_ERROR; 341e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia } 342027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia transferBuf = newBuf; 343e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia memcpy(transferBuf->data(), (uint8_t*)buf->data() + buf->range_offset(), 344e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia buf->range_length()); 345e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia offset = 0; 346e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia } 347e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 348b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(SHARED_BUFFER); 349e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia RemoteMediaBufferReleaser *wrapper = 350e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia new RemoteMediaBufferReleaser(transferBuf, this); 351b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeStrongBinder(wrapper); 352e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia reply->writeStrongBinder(IInterface::asBinder(transferBuf->mMemory)); 353e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia reply->writeInt32(offset); 354b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(usedSize); 355b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->writeToParcel(*reply); 3561d5a306c0b1322168e8f9fcf81876118a355a400Wei Jia if (buf->mMemory == NULL) { 3571d5a306c0b1322168e8f9fcf81876118a355a400Wei Jia buf->release(); 3581d5a306c0b1322168e8f9fcf81876118a355a400Wei Jia } 359b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } else { 360e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // buffer is small: copy it 361b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen if (buf->mMemory != NULL) { 362b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen ALOGV("%zu shared mem available, but only %zu used", buf->mMemory->size(), buf->range_length()); 363b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 364b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(INLINE_BUFFER); 365b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeByteArray(buf->range_length(), (uint8_t*)buf->data() + buf->range_offset()); 366b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->writeToParcel(*reply); 367b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->release(); 368b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 369b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } else { 370b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("ret %d, buf %p", ret, buf); 371b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(NULL_BUFFER); 372b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 373b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NO_ERROR; 374b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 3751f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia case READMULTIPLE: { 3761f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ALOGV("readmultiple"); 3771f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia CHECK_INTERFACE(IMediaSource, data, reply); 3781f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia uint32_t maxNumBuffers; 3791f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia data.readUint32(&maxNumBuffers); 3801f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia status_t ret = NO_ERROR; 3811f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia uint32_t bufferCount = 0; 3821f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (maxNumBuffers > kMaxNumReadMultiple) { 3831f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia maxNumBuffers = kMaxNumReadMultiple; 3841f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 3851f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia while (bufferCount < maxNumBuffers) { 3861f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (reply->dataSize() >= MediaBuffer::kSharedMemThreshold) { 3871f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia break; 3881f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 3891f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia 3901f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia MediaBuffer *buf = NULL; 3911f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ret = read(&buf, NULL); 3921f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (ret != NO_ERROR || buf == NULL) { 3931f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia break; 3941f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 3951f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ++bufferCount; 3961f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia reply->writeInt32(1); // indicate one more MediaBuffer. 3971f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia reply->writeByteArray( 3981f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia buf->range_length(), (uint8_t*)buf->data() + buf->range_offset()); 3991f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia buf->meta_data()->writeToParcel(*reply); 4001f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia buf->release(); 4011f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 4021f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia reply->writeInt32(0); // indicate no more MediaBuffer. 4031f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia reply->writeInt32(ret); 4041f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return NO_ERROR; 4051f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 406b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen default: 407b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return BBinder::onTransact(code, data, reply, flags); 408b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 409b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 410b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 411b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen//////////////////////////////////////////////////////////////////////////////// 412b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 413b2487f03f12dcafdb801fc0007c8df8412397f44Marco NelissenIMediaSource::ReadOptions::ReadOptions() { 414b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen reset(); 415b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 416b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 417b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::reset() { 418b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions = 0; 419b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = 0; 420b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mLatenessUs = 0; 421b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = false; 422b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 423b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 424b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setNonBlocking() { 425b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = true; 426b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 427b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 428b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::clearNonBlocking() { 429b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = false; 430b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 431b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 432b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenbool IMediaSource::ReadOptions::getNonBlocking() const { 433b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mNonBlocking; 434b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 435b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 436b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setSeekTo(int64_t time_us, SeekMode mode) { 437b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions |= kSeekTo_Option; 438b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = time_us; 439b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekMode = mode; 440b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 441b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 442b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::clearSeekTo() { 443b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions &= ~kSeekTo_Option; 444b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = 0; 445b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekMode = SEEK_CLOSEST_SYNC; 446b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 447b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 448b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenbool IMediaSource::ReadOptions::getSeekTo( 449b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen int64_t *time_us, SeekMode *mode) const { 450b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *time_us = mSeekTimeUs; 451b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *mode = mSeekMode; 452b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return (mOptions & kSeekTo_Option) != 0; 453b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 454b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 455b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setLateBy(int64_t lateness_us) { 456b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mLatenessUs = lateness_us; 457b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 458b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 459b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenint64_t IMediaSource::ReadOptions::getLateBy() const { 460b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mLatenessUs; 461b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 462b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 463b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 464b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} // namespace android 465b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 466