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