1e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber/*
2e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber *
4e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * you may not use this file except in compliance with the License.
6e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * You may obtain a copy of the License at
7e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber *
8e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber *
10e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * Unless required by applicable law or agreed to in writing, software
11e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * See the License for the specific language governing permissions and
14e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber * limitations under the License.
15e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber */
16e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
17e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber//#define LOG_NDEBUG 0
18e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#define LOG_TAG "IStreamSource"
19e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <utils/Log.h>
20e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
21e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/IStreamSource.h>
2214acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h>
23e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
24e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <binder/IMemory.h>
25e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <binder/Parcel.h>
26e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
27e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubernamespace android {
28e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
2932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber// static
3032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huberconst char *const IStreamListener::kKeyResumeAtPTS = "resume-at-PTS";
3132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
3242e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber// static
33bfcc8d8ab7c56bc013bd221a29e1ecf3a6390813Andreas Huberconst char *const IStreamListener::kKeyDiscontinuityMask = "discontinuity-mask";
3442e549e4ab54802d788c43e3a04a85b7a1a95e97Andreas Huber
35a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber// static
36a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huberconst char *const IStreamListener::kKeyMediaTimeUs = "media-time-us";
37a4c5bc0f18fe272146426ab2eccad6215279c9f3Andreas Huber
38d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang// static
39d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangconst char *const IStreamListener::kKeyRecentMediaTimeUs = "recent-media-time-us";
40d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang
41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberenum {
42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamSource
43e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_LISTENER = IBinder::FIRST_CALL_TRANSACTION,
44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_BUFFERS,
45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    ON_BUFFER_AVAILABLE,
46330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber    FLAGS,
47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamListener
49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    QUEUE_BUFFER,
5014acc736e336cbd6026df781d4f411e908831815Andreas Huber    ISSUE_COMMAND,
51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamSource : public BpInterface<IStreamSource> {
54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamSource(const sp<IBinder> &impl)
55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamSource>(impl) {
56e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
57e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setListener(const sp<IStreamListener> &listener) {
59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
6106b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen        data.writeStrongBinder(IInterface::asBinder(listener));
62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_LISTENER, data, &reply);
63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
65e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setBuffers(const Vector<sp<IMemory> > &buffers) {
66e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
67e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
68e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(buffers.size()));
69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        for (size_t i = 0; i < buffers.size(); ++i) {
7006b46062d2f8bc82ca3061a23d197734ae51918bMarco Nelissen            data.writeStrongBinder(IInterface::asBinder(buffers.itemAt(i)));
71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_BUFFERS, data, &reply);
73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
75e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void onBufferAvailable(size_t index) {
76e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
77e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
78e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(index));
79e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(
80e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                ON_BUFFER_AVAILABLE, data, &reply, IBinder::FLAG_ONEWAY);
81e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
82330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber
83330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber    virtual uint32_t flags() const {
84330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        Parcel data, reply;
85330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
86330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        remote()->transact(FLAGS, data, &reply);
87330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber
88330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        return reply.readInt32();
89330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber    }
90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
92e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamSource, "android.hardware.IStreamSource");
93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamSource::onTransact(
95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_LISTENER:
98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setListener(
101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IStreamListener>(data.readStrongBinder()));
102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
105e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_BUFFERS:
106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
108e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t n = static_cast<size_t>(data.readInt64());
109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Vector<sp<IMemory> > buffers;
110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            for (size_t i = 0; i < n; ++i) {
111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                sp<IMemory> mem =
112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IMemory>(data.readStrongBinder());
113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
1142afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                if (mem != NULL) {
1152afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                    buffers.push(mem);
1162afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                } else if (data.dataAvail() == 0) {
1172afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                    break;
1182afac0c7c42560ff5b8f133c6074b7e023279d6dWei Jia                }
119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            }
120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setBuffers(buffers);
121e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
122e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
123e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
124e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case ON_BUFFER_AVAILABLE:
125e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
126e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
127e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            onBufferAvailable(static_cast<size_t>(data.readInt64()));
128e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
129e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
130e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
131330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        case FLAGS:
132330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        {
133330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
134330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber            reply->writeInt32(this->flags());
135330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber            break;
136330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        }
137330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber
138e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
139e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
140e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
141e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
142e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
143e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
144e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
145e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber////////////////////////////////////////////////////////////////////////////////
146e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
147e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamListener : public BpInterface<IStreamListener> {
148e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamListener(const sp<IBinder> &impl)
149e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamListener>(impl) {
150e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
151e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
152e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void queueBuffer(size_t index, size_t size) {
153e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
154e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
155e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(index));
156e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(size));
157e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
158e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(QUEUE_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
159e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
160e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
16114acc736e336cbd6026df781d4f411e908831815Andreas Huber    virtual void issueCommand(
16214acc736e336cbd6026df781d4f411e908831815Andreas Huber            Command cmd, bool synchronous, const sp<AMessage> &msg) {
163e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
164e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
165e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(cmd));
16614acc736e336cbd6026df781d4f411e908831815Andreas Huber        data.writeInt32(static_cast<int32_t>(synchronous));
167e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
16814acc736e336cbd6026df781d4f411e908831815Andreas Huber        if (msg != NULL) {
16914acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(1);
17014acc736e336cbd6026df781d4f411e908831815Andreas Huber            msg->writeToParcel(&data);
17114acc736e336cbd6026df781d4f411e908831815Andreas Huber        } else {
17214acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(0);
17314acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
17414acc736e336cbd6026df781d4f411e908831815Andreas Huber
17514acc736e336cbd6026df781d4f411e908831815Andreas Huber        remote()->transact(ISSUE_COMMAND, data, &reply, IBinder::FLAG_ONEWAY);
176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
177e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
178e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
179e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamListener, "android.hardware.IStreamListener");
180e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
181e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamListener::onTransact(
182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
183e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
184e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case QUEUE_BUFFER:
185e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
186e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
187e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t index = static_cast<size_t>(data.readInt64());
188e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t size = static_cast<size_t>(data.readInt64());
189e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
190e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            queueBuffer(index, size);
191e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
192e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
193e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
19414acc736e336cbd6026df781d4f411e908831815Andreas Huber        case ISSUE_COMMAND:
195e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
196e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
197e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Command cmd = static_cast<Command>(data.readInt32());
198e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
19914acc736e336cbd6026df781d4f411e908831815Andreas Huber            bool synchronous = static_cast<bool>(data.readInt32());
20014acc736e336cbd6026df781d4f411e908831815Andreas Huber
20114acc736e336cbd6026df781d4f411e908831815Andreas Huber            sp<AMessage> msg;
20214acc736e336cbd6026df781d4f411e908831815Andreas Huber
20314acc736e336cbd6026df781d4f411e908831815Andreas Huber            if (data.readInt32()) {
20414acc736e336cbd6026df781d4f411e908831815Andreas Huber                msg = AMessage::FromParcel(data);
20514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
20614acc736e336cbd6026df781d4f411e908831815Andreas Huber
20714acc736e336cbd6026df781d4f411e908831815Andreas Huber            issueCommand(cmd, synchronous, msg);
208e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
209e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
210e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
211e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
212e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
213e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
214e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
215e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
216e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
217e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
218e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}  // namespace android
219