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
38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberenum {
39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamSource
40e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_LISTENER = IBinder::FIRST_CALL_TRANSACTION,
41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_BUFFERS,
42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    ON_BUFFER_AVAILABLE,
43330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber    FLAGS,
44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamListener
46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    QUEUE_BUFFER,
4714acc736e336cbd6026df781d4f411e908831815Andreas Huber    ISSUE_COMMAND,
48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamSource : public BpInterface<IStreamSource> {
51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamSource(const sp<IBinder> &impl)
52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamSource>(impl) {
53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setListener(const sp<IStreamListener> &listener) {
56e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
57e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeStrongBinder(listener->asBinder());
59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_LISTENER, data, &reply);
60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setBuffers(const Vector<sp<IMemory> > &buffers) {
63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
65e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(buffers.size()));
66e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        for (size_t i = 0; i < buffers.size(); ++i) {
67e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            data.writeStrongBinder(buffers.itemAt(i)->asBinder());
68e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_BUFFERS, data, &reply);
70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void onBufferAvailable(size_t index) {
73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
75e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(index));
76e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(
77e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                ON_BUFFER_AVAILABLE, data, &reply, IBinder::FLAG_ONEWAY);
78e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
79330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber
80330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber    virtual uint32_t flags() const {
81330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        Parcel data, reply;
82330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
83330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        remote()->transact(FLAGS, data, &reply);
84330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber
85330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        return reply.readInt32();
86330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber    }
87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
89e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamSource, "android.hardware.IStreamSource");
90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamSource::onTransact(
92e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_LISTENER:
95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setListener(
98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IStreamListener>(data.readStrongBinder()));
99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_BUFFERS:
103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
105e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t n = static_cast<size_t>(data.readInt64());
106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Vector<sp<IMemory> > buffers;
107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            for (size_t i = 0; i < n; ++i) {
108e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                sp<IMemory> mem =
109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IMemory>(data.readStrongBinder());
110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                buffers.push(mem);
112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            }
113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setBuffers(buffers);
114e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
117e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case ON_BUFFER_AVAILABLE:
118e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
120e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            onBufferAvailable(static_cast<size_t>(data.readInt64()));
121e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
122e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
123e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
124330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        case FLAGS:
125330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        {
126330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
127330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber            reply->writeInt32(this->flags());
128330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber            break;
129330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber        }
130330accb419ebfb1d8b9d7dcc3b616f56f737f29aAndreas Huber
131e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
132e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
133e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
134e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
135e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
136e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
137e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
138e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber////////////////////////////////////////////////////////////////////////////////
139e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
140e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamListener : public BpInterface<IStreamListener> {
141e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamListener(const sp<IBinder> &impl)
142e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamListener>(impl) {
143e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
144e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
145e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void queueBuffer(size_t index, size_t size) {
146e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
147e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
148e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(index));
149e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten        data.writeInt64(static_cast<int64_t>(size));
150e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
151e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(QUEUE_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
152e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
153e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
15414acc736e336cbd6026df781d4f411e908831815Andreas Huber    virtual void issueCommand(
15514acc736e336cbd6026df781d4f411e908831815Andreas Huber            Command cmd, bool synchronous, const sp<AMessage> &msg) {
156e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
157e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
158e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(cmd));
15914acc736e336cbd6026df781d4f411e908831815Andreas Huber        data.writeInt32(static_cast<int32_t>(synchronous));
160e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
16114acc736e336cbd6026df781d4f411e908831815Andreas Huber        if (msg != NULL) {
16214acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(1);
16314acc736e336cbd6026df781d4f411e908831815Andreas Huber            msg->writeToParcel(&data);
16414acc736e336cbd6026df781d4f411e908831815Andreas Huber        } else {
16514acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(0);
16614acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
16714acc736e336cbd6026df781d4f411e908831815Andreas Huber
16814acc736e336cbd6026df781d4f411e908831815Andreas Huber        remote()->transact(ISSUE_COMMAND, data, &reply, IBinder::FLAG_ONEWAY);
169e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
170e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
171e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
172e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamListener, "android.hardware.IStreamListener");
173e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
174e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamListener::onTransact(
175e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
177e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case QUEUE_BUFFER:
178e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
179e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
180e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t index = static_cast<size_t>(data.readInt64());
181e03dd22716e688faa56467561827d9b1ea0c4214Glenn Kasten            size_t size = static_cast<size_t>(data.readInt64());
182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
183e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            queueBuffer(index, size);
184e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
185e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
186e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
18714acc736e336cbd6026df781d4f411e908831815Andreas Huber        case ISSUE_COMMAND:
188e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
189e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
190e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Command cmd = static_cast<Command>(data.readInt32());
191e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
19214acc736e336cbd6026df781d4f411e908831815Andreas Huber            bool synchronous = static_cast<bool>(data.readInt32());
19314acc736e336cbd6026df781d4f411e908831815Andreas Huber
19414acc736e336cbd6026df781d4f411e908831815Andreas Huber            sp<AMessage> msg;
19514acc736e336cbd6026df781d4f411e908831815Andreas Huber
19614acc736e336cbd6026df781d4f411e908831815Andreas Huber            if (data.readInt32()) {
19714acc736e336cbd6026df781d4f411e908831815Andreas Huber                msg = AMessage::FromParcel(data);
19814acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
19914acc736e336cbd6026df781d4f411e908831815Andreas Huber
20014acc736e336cbd6026df781d4f411e908831815Andreas Huber            issueCommand(cmd, synchronous, msg);
201e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
202e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
203e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
204e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
205e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
206e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
207e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
208e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
209e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
210e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
211e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}  // namespace android
212