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
35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberenum {
36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamSource
37e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_LISTENER = IBinder::FIRST_CALL_TRANSACTION,
38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_BUFFERS,
39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    ON_BUFFER_AVAILABLE,
40da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber    FLAGS,
41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamListener
43e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    QUEUE_BUFFER,
4414acc736e336cbd6026df781d4f411e908831815Andreas Huber    ISSUE_COMMAND,
45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamSource : public BpInterface<IStreamSource> {
48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamSource(const sp<IBinder> &impl)
49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamSource>(impl) {
50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setListener(const sp<IStreamListener> &listener) {
53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeStrongBinder(listener->asBinder());
56e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_LISTENER, data, &reply);
57e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setBuffers(const Vector<sp<IMemory> > &buffers) {
60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(buffers.size()));
63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        for (size_t i = 0; i < buffers.size(); ++i) {
64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            data.writeStrongBinder(buffers.itemAt(i)->asBinder());
65e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
66e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_BUFFERS, data, &reply);
67e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
68e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void onBufferAvailable(size_t index) {
70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(index));
73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(
74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                ON_BUFFER_AVAILABLE, data, &reply, IBinder::FLAG_ONEWAY);
75e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
76da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber
77da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber    virtual uint32_t flags() const {
78da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber        Parcel data, reply;
79da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
80da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber        remote()->transact(FLAGS, data, &reply);
81da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber
82da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber        return reply.readInt32();
83da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber    }
84e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
85e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
86e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamSource, "android.hardware.IStreamSource");
87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamSource::onTransact(
89e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_LISTENER:
92e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setListener(
95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IStreamListener>(data.readStrongBinder()));
96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_BUFFERS:
100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            size_t n = static_cast<size_t>(data.readInt32());
103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Vector<sp<IMemory> > buffers;
104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            for (size_t i = 0; i < n; ++i) {
105e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                sp<IMemory> mem =
106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IMemory>(data.readStrongBinder());
107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
108e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                buffers.push(mem);
109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            }
110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setBuffers(buffers);
111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
114e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case ON_BUFFER_AVAILABLE:
115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
117e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            onBufferAvailable(static_cast<size_t>(data.readInt32()));
118e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
121da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber        case FLAGS:
122da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber        {
123da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
124da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber            reply->writeInt32(this->flags());
125da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber            break;
126da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber        }
127da7ff5321539ac07ec76d0d03bd1b9b09a1823bfAndreas Huber
128e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
129e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
130e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
131e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
132e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
133e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
134e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
135e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber////////////////////////////////////////////////////////////////////////////////
136e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
137e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamListener : public BpInterface<IStreamListener> {
138e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamListener(const sp<IBinder> &impl)
139e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamListener>(impl) {
140e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
141e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
142e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void queueBuffer(size_t index, size_t size) {
143e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
144e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
145e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(index));
146e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(size));
147e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
148e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(QUEUE_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
149e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
150e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
15114acc736e336cbd6026df781d4f411e908831815Andreas Huber    virtual void issueCommand(
15214acc736e336cbd6026df781d4f411e908831815Andreas Huber            Command cmd, bool synchronous, const sp<AMessage> &msg) {
153e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
154e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
155e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(cmd));
15614acc736e336cbd6026df781d4f411e908831815Andreas Huber        data.writeInt32(static_cast<int32_t>(synchronous));
157e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
15814acc736e336cbd6026df781d4f411e908831815Andreas Huber        if (msg != NULL) {
15914acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(1);
16014acc736e336cbd6026df781d4f411e908831815Andreas Huber            msg->writeToParcel(&data);
16114acc736e336cbd6026df781d4f411e908831815Andreas Huber        } else {
16214acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(0);
16314acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
16414acc736e336cbd6026df781d4f411e908831815Andreas Huber
16514acc736e336cbd6026df781d4f411e908831815Andreas Huber        remote()->transact(ISSUE_COMMAND, data, &reply, IBinder::FLAG_ONEWAY);
166e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
167e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
168e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
169e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamListener, "android.hardware.IStreamListener");
170e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
171e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamListener::onTransact(
172e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
173e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
174e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case QUEUE_BUFFER:
175e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
176e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
177e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            size_t index = static_cast<size_t>(data.readInt32());
178e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            size_t size = static_cast<size_t>(data.readInt32());
179e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
180e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            queueBuffer(index, size);
181e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
183e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
18414acc736e336cbd6026df781d4f411e908831815Andreas Huber        case ISSUE_COMMAND:
185e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
186e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
187e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Command cmd = static_cast<Command>(data.readInt32());
188e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
18914acc736e336cbd6026df781d4f411e908831815Andreas Huber            bool synchronous = static_cast<bool>(data.readInt32());
19014acc736e336cbd6026df781d4f411e908831815Andreas Huber
19114acc736e336cbd6026df781d4f411e908831815Andreas Huber            sp<AMessage> msg;
19214acc736e336cbd6026df781d4f411e908831815Andreas Huber
19314acc736e336cbd6026df781d4f411e908831815Andreas Huber            if (data.readInt32()) {
19414acc736e336cbd6026df781d4f411e908831815Andreas Huber                msg = AMessage::FromParcel(data);
19514acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
19614acc736e336cbd6026df781d4f411e908831815Andreas Huber
19714acc736e336cbd6026df781d4f411e908831815Andreas Huber            issueCommand(cmd, synchronous, msg);
198e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
199e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
200e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
201e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
202e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
203e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
204e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
205e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
206e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
207e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
208e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}  // namespace android
209