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, 39f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // READ, deprecated 401f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia READMULTIPLE, 41cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung RELEASE_BUFFER, 42cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung SUPPORT_NONBLOCKING_READ, 43b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen}; 44b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 45b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenenum { 46b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen NULL_BUFFER, 47b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen SHARED_BUFFER, 48f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung INLINE_BUFFER, 49f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung SHARED_BUFFER_INDEX, 50b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 51b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 52f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hungclass RemoteMediaBufferWrapper : public MediaBuffer { 53b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenpublic: 54f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung RemoteMediaBufferWrapper(const sp<IMemory> &mem) 55f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung : MediaBuffer(mem) { 56f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("RemoteMediaBufferWrapper: creating %p", this); 57b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 58b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 59b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissenprotected: 60f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung virtual ~RemoteMediaBufferWrapper() { 619bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung // Release our interest in the MediaBuffer's shared memory. 629bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung int32_t old = addRemoteRefcount(-1); 639bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung ALOGV("RemoteMediaBufferWrapper: releasing %p, refcount %d", this, old - 1); 64f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mMemory.clear(); // don't set the dead object flag. 65f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 66b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen}; 67b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 68b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenclass BpMediaSource : public BpInterface<IMediaSource> { 69b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenpublic: 7064a2870d8515fd914638c60803db86dbd92f5b06Chih-Hung Hsieh explicit BpMediaSource(const sp<IBinder>& impl) 71f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung : BpInterface<IMediaSource>(impl), mBuffersSinceStop(0) 72b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen { 73b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 74b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 75b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t start(MetaData *params) { 76b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("start"); 77b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 78b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 79b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (params) { 80b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen params->writeToParcel(data); 81b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 82b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(START, data, &reply); 83b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR && params) { 84b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("ignoring potentially modified MetaData from start"); 85b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("input:"); 86b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen params->dumpToLog(); 87b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta = MetaData::createFromParcel(reply); 88b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGW("output:"); 89b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->dumpToLog(); 90b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 91b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 92b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 93b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 94b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t stop() { 95b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("stop"); 96b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 97b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 98f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung status_t status = remote()->transact(STOP, data, &reply); 99f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mMemoryCache.reset(); 100f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mBuffersSinceStop = 0; 101f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung return status; 102b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 103b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 104b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual sp<MetaData> getFormat() { 105b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("getFormat"); 106b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 107b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 108b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = remote()->transact(GETFORMAT, data, &reply); 109b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR) { 110b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mMetaData = MetaData::createFromParcel(reply); 111b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mMetaData; 112b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 113b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NULL; 114b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 115b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 116b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t read(MediaBuffer **buffer, const ReadOptions *options) { 117f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung Vector<MediaBuffer *> buffers; 118f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung status_t ret = readMultiple(&buffers, 1 /* maxNumBuffers */, options); 119f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung *buffer = buffers.size() == 0 ? nullptr : buffers[0]; 120f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("read status %d, bufferCount %u, sinceStop %u", 121f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ret, *buffer != nullptr, mBuffersSinceStop); 122b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 123b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 124b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 125f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung virtual status_t readMultiple( 126f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung Vector<MediaBuffer *> *buffers, uint32_t maxNumBuffers, const ReadOptions *options) { 1271f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ALOGV("readMultiple"); 1281f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (buffers == NULL || !buffers->isEmpty()) { 1291f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return BAD_VALUE; 1301f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 1311f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia Parcel data, reply; 1321f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 1331f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia data.writeUint32(maxNumBuffers); 134f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (options != nullptr) { 135f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung data.writeByteArray(sizeof(*options), (uint8_t*) options); 136f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 1371f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia status_t ret = remote()->transact(READMULTIPLE, data, &reply); 138f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mMemoryCache.gc(); 1391f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia if (ret != NO_ERROR) { 1401f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return ret; 1411f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 1421f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia // wrap the returned data in a vector of MediaBuffers 143f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung int32_t buftype; 144f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung uint32_t bufferCount = 0; 145f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung while ((buftype = reply.readInt32()) != NULL_BUFFER) { 146f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung LOG_ALWAYS_FATAL_IF(bufferCount >= maxNumBuffers, 147f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung "Received %u+ buffers and requested %u buffers", 148f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung bufferCount + 1, maxNumBuffers); 149f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung MediaBuffer *buf; 150f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (buftype == SHARED_BUFFER || buftype == SHARED_BUFFER_INDEX) { 151f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung uint64_t index = reply.readUint64(); 152f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("Received %s index %llu", 153f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung buftype == SHARED_BUFFER ? "SHARED_BUFFER" : "SHARED_BUFFER_INDEX", 154f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung (unsigned long long) index); 155f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung sp<IMemory> mem; 156f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (buftype == SHARED_BUFFER) { 157f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung sp<IBinder> binder = reply.readStrongBinder(); 158f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mem = interface_cast<IMemory>(binder); 159f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung LOG_ALWAYS_FATAL_IF(mem.get() == nullptr, 160f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung "Received NULL IMemory for shared buffer"); 161f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mMemoryCache.insert(index, mem); 162f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } else { 163f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mem = mMemoryCache.lookup(index); 164f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung LOG_ALWAYS_FATAL_IF(mem.get() == nullptr, 165f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung "Received invalid IMemory index for shared buffer: %llu", 166f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung (unsigned long long)index); 167f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 168f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung size_t offset = reply.readInt32(); 169f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung size_t length = reply.readInt32(); 170f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung buf = new RemoteMediaBufferWrapper(mem); 171f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung buf->set_range(offset, length); 172f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung buf->meta_data()->updateFromParcel(reply); 173f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } else { // INLINE_BUFFER 174f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung int32_t len = reply.readInt32(); 175f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("INLINE_BUFFER status %d and len %d", ret, len); 176f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung buf = new MediaBuffer(len); 177f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply.read(buf->data(), len); 178f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung buf->meta_data()->updateFromParcel(reply); 1791f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 1801f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia buffers->push_back(buf); 181f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ++bufferCount; 182f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ++mBuffersSinceStop; 1831f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 1841f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia ret = reply.readInt32(); 185f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("readMultiple status %d, bufferCount %u, sinceStop %u", 186f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ret, bufferCount, mBuffersSinceStop); 1871f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return ret; 1881f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 1891f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia 190cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung // Binder proxy adds readMultiple support. 191cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung virtual bool supportReadMultiple() { 192d3f4e14d4c6ea02c49a50ad7c5fd08dd13b518e1Wei Jia return true; 193d3f4e14d4c6ea02c49a50ad7c5fd08dd13b518e1Wei Jia } 194d3f4e14d4c6ea02c49a50ad7c5fd08dd13b518e1Wei Jia 195cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung virtual bool supportNonblockingRead() { 196cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung ALOGV("supportNonblockingRead"); 197cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung Parcel data, reply; 198cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 199cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung status_t ret = remote()->transact(SUPPORT_NONBLOCKING_READ, data, &reply); 200cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung if (ret == NO_ERROR) { 201cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung return reply.readInt32() != 0; 202cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung } 203cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung return false; 204cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung } 205cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung 206b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t pause() { 207b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("pause"); 208b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen Parcel data, reply; 209b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor()); 210b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return remote()->transact(PAUSE, data, &reply); 211b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 212b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 213b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen virtual status_t setBuffers(const Vector<MediaBuffer *> & buffers __unused) { 214b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("setBuffers NOT IMPLEMENTED"); 215b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ERROR_UNSUPPORTED; // default 216b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 217b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 218b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenprivate: 219f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 220f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung uint32_t mBuffersSinceStop; // Buffer tracking variable 221f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 222b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // NuPlayer passes pointers-to-metadata around, so we use this to keep the metadata alive 223b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen // XXX: could we use this for caching, or does metadata change on the fly? 224b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> mMetaData; 225e7d8e71e45028cbe51839c23f922ba8c506cba82Marco Nelissen 226f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // Cache all IMemory objects received from MediaExtractor. 227f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // We gc IMemory objects that are no longer active (referenced by a MediaBuffer). 228f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 229f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung struct MemoryCache { 230f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung sp<IMemory> lookup(uint64_t index) { 231f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung auto p = mIndexToMemory.find(index); 232f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (p == mIndexToMemory.end()) { 233f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGE("cannot find index!"); 234f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung return nullptr; 235f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 236f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung return p->second; 237f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 238f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 239f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung void insert(uint64_t index, const sp<IMemory> &mem) { 240f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (mIndexToMemory.find(index) != mIndexToMemory.end()) { 241f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGE("index %llu already present", (unsigned long long)index); 242f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung return; 243f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 244f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung (void)mIndexToMemory.emplace(index, mem); 245f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 246f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 247f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung void reset() { 248f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mIndexToMemory.clear(); 249f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 250f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 251f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung void gc() { 252f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung for (auto it = mIndexToMemory.begin(); it != mIndexToMemory.end(); ) { 253f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (MediaBuffer::isDeadObject(it->second)) { 254f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung it = mIndexToMemory.erase(it); 255f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } else { 256f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ++it; 257f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 258f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 259f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 260f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung private: 261f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // C++14 unordered_map erase on iterator is stable; C++11 has no guarantee. 262f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung std::map<uint64_t, sp<IMemory>> mIndexToMemory; 263f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } mMemoryCache; 264b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen}; 265b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 266b2487f03f12dcafdb801fc0007c8df8412397f44Marco NelissenIMPLEMENT_META_INTERFACE(MediaSource, "android.media.IMediaSource"); 267b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 268b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#undef LOG_TAG 269b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#define LOG_TAG "BnMediaSource" 270b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 271e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei JiaBnMediaSource::BnMediaSource() 272f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung : mBuffersSinceStop(0) 273f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung , mGroup(new MediaBufferGroup(kBinderMediaBuffers /* growthLimit */)) { 274e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia} 275e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 276e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei JiaBnMediaSource::~BnMediaSource() { 277e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia} 278e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia 279b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenstatus_t BnMediaSource::onTransact( 280b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 281b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen{ 282b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen switch (code) { 283b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case START: { 284b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("start"); 285b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 286b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta; 287b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (data.dataAvail()) { 288b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta = MetaData::createFromParcel(data); 289b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 290b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen status_t ret = start(meta.get()); 291b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (ret == NO_ERROR && meta != NULL) { 292b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->writeToParcel(*reply); 293b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 294b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return ret; 295b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 296b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case STOP: { 297b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("stop"); 298b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 2999bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung mGroup->signalBufferReturned(nullptr); 300f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung status_t status = stop(); 301f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mIndexCache.reset(); 302f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mBuffersSinceStop = 0; 303f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung return status; 304b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 305b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case PAUSE: { 306b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("pause"); 307b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 3089bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung mGroup->signalBufferReturned(nullptr); 309b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return pause(); 310b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 311b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen case GETFORMAT: { 312b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ALOGV("getFormat"); 313b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 314b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen sp<MetaData> meta = getFormat(); 315b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen if (meta != NULL) { 316b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen meta->writeToParcel(*reply); 317b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return NO_ERROR; 318b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 319b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return UNKNOWN_ERROR; 320b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 321f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung case READMULTIPLE: { 322f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("readMultiple"); 323b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen CHECK_INTERFACE(IMediaSource, data, reply); 324f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 325f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // Get max number of buffers to read. 326f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung uint32_t maxNumBuffers; 327f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung data.readUint32(&maxNumBuffers); 328f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (maxNumBuffers > kMaxNumReadMultiple) { 329f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung maxNumBuffers = kMaxNumReadMultiple; 330f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 331f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 332f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // Get read options, if any. 333b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen ReadOptions opts; 334b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen uint32_t len; 335f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung const bool useOptions = 336f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung data.readUint32(&len) == NO_ERROR 337f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung && len == sizeof(opts) 338f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung && data.read((void *)&opts, len) == NO_ERROR; 339b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen 3409bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung mGroup->signalBufferReturned(nullptr); 341f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mIndexCache.gc(); 342cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung size_t inlineTransferSize = 0; 343f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung status_t ret = NO_ERROR; 344f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung uint32_t bufferCount = 0; 345f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung for (; bufferCount < maxNumBuffers; ++bufferCount, ++mBuffersSinceStop) { 346f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung MediaBuffer *buf = nullptr; 347f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ret = read(&buf, useOptions ? &opts : nullptr); 348f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung opts.clearNonPersistent(); // Remove options that only apply to first buffer. 349f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (ret != NO_ERROR || buf == nullptr) { 350f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung break; 351f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 352f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung 353f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // Even if we're using shared memory, we might not want to use it, since for small 354b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen // sizes it's faster to copy data through the Binder transaction 355e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // On the other hand, if the data size is large enough, it's better to use shared 356e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia // memory. When data is too large, binder can't handle it. 357f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // 358f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // TODO: reduce MediaBuffer::kSharedMemThreshold 359f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung MediaBuffer *transferBuf = nullptr; 360f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung const size_t length = buf->range_length(); 361f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung size_t offset = buf->range_offset(); 362cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung if (length >= (supportNonblockingRead() && buf->mMemory != nullptr ? 363cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung kTransferSharedAsSharedThreshold : kTransferInlineAsSharedThreshold)) { 364f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (buf->mMemory != nullptr) { 365f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("Use shared memory: %zu", length); 366f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung transferBuf = buf; 367f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } else { 368f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGD("Large buffer %zu without IMemory!", length); 369e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia ret = mGroup->acquire_buffer( 370f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung &transferBuf, false /* nonBlocking */, length); 371f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (ret != OK 372f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung || transferBuf == nullptr 373f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung || transferBuf->mMemory == nullptr) { 374f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGW("Failed to acquire shared memory, size %zu, ret %d", 375f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung length, ret); 376f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (transferBuf != nullptr) { 377f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung transferBuf->release(); 378f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung transferBuf = nullptr; 379027b81154c4296f3d0caa861d43b19a5f57797cdWei Jia } 380f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // Current buffer transmit inline; no more additional buffers. 381f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung maxNumBuffers = 0; 382f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } else { 383f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung memcpy(transferBuf->data(), (uint8_t*)buf->data() + offset, length); 384f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung offset = 0; 385cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung if (!mGroup->has_buffers()) { 386cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung maxNumBuffers = 0; // No more MediaBuffers, stop readMultiple. 387cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung } 388e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia } 389e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia } 390f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 391f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (transferBuf != nullptr) { // Using shared buffers. 39288454e41f034404d0745fded18b5a3a736135369yuedl if (!transferBuf->isObserved() && transferBuf != buf) { 393f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung // Transfer buffer must be part of a MediaBufferGroup. 394f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("adding shared memory buffer %p to local group", transferBuf); 395f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung mGroup->add_buffer(transferBuf); 396f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung transferBuf->add_ref(); // We have already acquired buffer. 397f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 398f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung uint64_t index = mIndexCache.lookup(transferBuf->mMemory); 399f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung if (index == 0) { 400f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung index = mIndexCache.insert(transferBuf->mMemory); 401f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeInt32(SHARED_BUFFER); 402f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeUint64(index); 403f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeStrongBinder(IInterface::asBinder(transferBuf->mMemory)); 404f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("SHARED_BUFFER(%p) %llu", 405f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung transferBuf, (unsigned long long)index); 406f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } else { 407f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeInt32(SHARED_BUFFER_INDEX); 408f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeUint64(index); 409f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("SHARED_BUFFER_INDEX(%p) %llu", 410f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung transferBuf, (unsigned long long)index); 411f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung } 412e9a5b96e7927fd4e38623e17ac73e8e4e25877eeWei Jia reply->writeInt32(offset); 413f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeInt32(length); 414b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->writeToParcel(*reply); 4159996d9d39618b89d0f85c98b8036f003290f0d7eAndy Hung transferBuf->addRemoteRefcount(1); 4169996d9d39618b89d0f85c98b8036f003290f0d7eAndy Hung if (transferBuf != buf) { 4179996d9d39618b89d0f85c98b8036f003290f0d7eAndy Hung transferBuf->release(); // release local ref 4189996d9d39618b89d0f85c98b8036f003290f0d7eAndy Hung } else if (!supportNonblockingRead()) { 4199996d9d39618b89d0f85c98b8036f003290f0d7eAndy Hung maxNumBuffers = 0; // stop readMultiple with one shared buffer. 4201d5a306c0b1322168e8f9fcf81876118a355a400Wei Jia } 421b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } else { 422f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV_IF(buf->mMemory != nullptr, 423f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung "INLINE(%p) %zu shared mem available, but only %zu used", 424f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung buf, buf->mMemory->size(), length); 425b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen reply->writeInt32(INLINE_BUFFER); 426f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeByteArray(length, (uint8_t*)buf->data() + offset); 427b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen buf->meta_data()->writeToParcel(*reply); 428cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung inlineTransferSize += length; 429cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung if (inlineTransferSize > kInlineMaxTransfer) { 430cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung maxNumBuffers = 0; // stop readMultiple if inline transfer is too large. 431cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung } 432b65990f4a0cf01db0b9f21c68fcf8824ae03a178Marco Nelissen } 4339bd3c9b0e894c9f6c48a2cfa7c5f21d384b1c596Andy Hung buf->release(); 4341f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 435f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung reply->writeInt32(NULL_BUFFER); // Indicate no more MediaBuffers. 4361f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia reply->writeInt32(ret); 437f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ALOGV("readMultiple status %d, bufferCount %u, sinceStop %u", 438f59c0bafebcd795b20141bf928a5cab8ac46e882Andy Hung ret, bufferCount, mBuffersSinceStop); 4391f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia return NO_ERROR; 4401f1fc459ddb67d1162f2dbb10d14e57f42841da2Wei Jia } 441cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung case SUPPORT_NONBLOCKING_READ: { 442cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung ALOGV("supportNonblockingRead"); 443cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung CHECK_INTERFACE(IMediaSource, data, reply); 444cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung reply->writeInt32((int32_t)supportNonblockingRead()); 445cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung return NO_ERROR; 446cdeb6603d862cec4adac7c39f3b8b240f2b645dcAndy Hung } 447b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen default: 448b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return BBinder::onTransact(code, data, reply, flags); 449b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen } 450b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 451b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 452b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen//////////////////////////////////////////////////////////////////////////////// 453b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 454b2487f03f12dcafdb801fc0007c8df8412397f44Marco NelissenIMediaSource::ReadOptions::ReadOptions() { 455b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen reset(); 456b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 457b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 458b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::reset() { 459b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions = 0; 460b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = 0; 461b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mLatenessUs = 0; 462b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = false; 463b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 464b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 465b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setNonBlocking() { 466b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = true; 467b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 468b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 469b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::clearNonBlocking() { 470b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mNonBlocking = false; 471b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 472b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 473b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenbool IMediaSource::ReadOptions::getNonBlocking() const { 474b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mNonBlocking; 475b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 476b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 477b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setSeekTo(int64_t time_us, SeekMode mode) { 478b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions |= kSeekTo_Option; 479b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = time_us; 480b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekMode = mode; 481b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 482b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 483b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::clearSeekTo() { 484b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mOptions &= ~kSeekTo_Option; 485b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekTimeUs = 0; 486b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mSeekMode = SEEK_CLOSEST_SYNC; 487b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 488b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 489b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenbool IMediaSource::ReadOptions::getSeekTo( 490b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen int64_t *time_us, SeekMode *mode) const { 491b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *time_us = mSeekTimeUs; 492b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen *mode = mSeekMode; 493b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return (mOptions & kSeekTo_Option) != 0; 494b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 495b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 496b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenvoid IMediaSource::ReadOptions::setLateBy(int64_t lateness_us) { 497b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen mLatenessUs = lateness_us; 498b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 499b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 500b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissenint64_t IMediaSource::ReadOptions::getLateBy() const { 501b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen return mLatenessUs; 502b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} 503b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 504b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 505b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen} // namespace android 506b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen 507