IStreamSource.cpp revision 32f3cefa373cd55e63deda36ca9d07c7fe22eaaf
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
32e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberenum {
33e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamSource
34e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_LISTENER = IBinder::FIRST_CALL_TRANSACTION,
35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    SET_BUFFERS,
36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    ON_BUFFER_AVAILABLE,
37e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    // IStreamListener
39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    QUEUE_BUFFER,
4014acc736e336cbd6026df781d4f411e908831815Andreas Huber    ISSUE_COMMAND,
41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
43e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamSource : public BpInterface<IStreamSource> {
44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamSource(const sp<IBinder> &impl)
45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamSource>(impl) {
46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setListener(const sp<IStreamListener> &listener) {
49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeStrongBinder(listener->asBinder());
52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_LISTENER, data, &reply);
53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void setBuffers(const Vector<sp<IMemory> > &buffers) {
56e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
57e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(buffers.size()));
59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        for (size_t i = 0; i < buffers.size(); ++i) {
60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            data.writeStrongBinder(buffers.itemAt(i)->asBinder());
61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(SET_BUFFERS, data, &reply);
63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
65e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void onBufferAvailable(size_t index) {
66e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
67e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());
68e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(index));
69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(
70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                ON_BUFFER_AVAILABLE, data, &reply, IBinder::FLAG_ONEWAY);
71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
74e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamSource, "android.hardware.IStreamSource");
75e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
76e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamSource::onTransact(
77e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
78e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
79e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_LISTENER:
80e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
81e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
82e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setListener(
83e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IStreamListener>(data.readStrongBinder()));
84e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
85e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
86e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case SET_BUFFERS:
88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
89e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
90e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            size_t n = static_cast<size_t>(data.readInt32());
91e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Vector<sp<IMemory> > buffers;
92e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            for (size_t i = 0; i < n; ++i) {
93e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                sp<IMemory> mem =
94e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                    interface_cast<IMemory>(data.readStrongBinder());
95e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
96e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                buffers.push(mem);
97e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            }
98e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            setBuffers(buffers);
99e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
100e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
101e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
102e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case ON_BUFFER_AVAILABLE:
103e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
104e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamSource, data, reply);
105e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            onBufferAvailable(static_cast<size_t>(data.readInt32()));
106e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
107e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
108e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
109e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
114e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber////////////////////////////////////////////////////////////////////////////////
117e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
118e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstruct BpStreamListener : public BpInterface<IStreamListener> {
119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    BpStreamListener(const sp<IBinder> &impl)
120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        : BpInterface<IStreamListener>(impl) {
121e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
122e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
123e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    virtual void queueBuffer(size_t index, size_t size) {
124e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
125e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
126e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(index));
127e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(size));
128e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
129e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        remote()->transact(QUEUE_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
130e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
131e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
13214acc736e336cbd6026df781d4f411e908831815Andreas Huber    virtual void issueCommand(
13314acc736e336cbd6026df781d4f411e908831815Andreas Huber            Command cmd, bool synchronous, const sp<AMessage> &msg) {
134e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        Parcel data, reply;
135e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInterfaceToken(IStreamListener::getInterfaceDescriptor());
136e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        data.writeInt32(static_cast<int32_t>(cmd));
13714acc736e336cbd6026df781d4f411e908831815Andreas Huber        data.writeInt32(static_cast<int32_t>(synchronous));
138e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
13914acc736e336cbd6026df781d4f411e908831815Andreas Huber        if (msg != NULL) {
14014acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(1);
14114acc736e336cbd6026df781d4f411e908831815Andreas Huber            msg->writeToParcel(&data);
14214acc736e336cbd6026df781d4f411e908831815Andreas Huber        } else {
14314acc736e336cbd6026df781d4f411e908831815Andreas Huber            data.writeInt32(0);
14414acc736e336cbd6026df781d4f411e908831815Andreas Huber        }
14514acc736e336cbd6026df781d4f411e908831815Andreas Huber
14614acc736e336cbd6026df781d4f411e908831815Andreas Huber        remote()->transact(ISSUE_COMMAND, data, &reply, IBinder::FLAG_ONEWAY);
147e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
148e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber};
149e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
150e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberIMPLEMENT_META_INTERFACE(StreamListener, "android.hardware.IStreamListener");
151e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
152e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t BnStreamListener::onTransact(
153e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
154e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch (code) {
155e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case QUEUE_BUFFER:
156e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
157e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
158e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            size_t index = static_cast<size_t>(data.readInt32());
159e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            size_t size = static_cast<size_t>(data.readInt32());
160e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
161e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            queueBuffer(index, size);
162e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
163e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
164e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
16514acc736e336cbd6026df781d4f411e908831815Andreas Huber        case ISSUE_COMMAND:
166e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        {
167e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            CHECK_INTERFACE(IStreamListener, data, reply);
168e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            Command cmd = static_cast<Command>(data.readInt32());
169e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
17014acc736e336cbd6026df781d4f411e908831815Andreas Huber            bool synchronous = static_cast<bool>(data.readInt32());
17114acc736e336cbd6026df781d4f411e908831815Andreas Huber
17214acc736e336cbd6026df781d4f411e908831815Andreas Huber            sp<AMessage> msg;
17314acc736e336cbd6026df781d4f411e908831815Andreas Huber
17414acc736e336cbd6026df781d4f411e908831815Andreas Huber            if (data.readInt32()) {
17514acc736e336cbd6026df781d4f411e908831815Andreas Huber                msg = AMessage::FromParcel(data);
17614acc736e336cbd6026df781d4f411e908831815Andreas Huber            }
17714acc736e336cbd6026df781d4f411e908831815Andreas Huber
17814acc736e336cbd6026df781d4f411e908831815Andreas Huber            issueCommand(cmd, synchronous, msg);
179e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
180e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
181e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
183e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            return BBinder::onTransact(code, data, reply, flags);
184e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
185e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
186e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return OK;
187e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
188e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
189e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}  // namespace android
190