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