IGraphicBufferProducer.cpp revision 8072711307aa98ee5ee6f7369860ae38c3e19656
1d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang/*
2d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * Copyright (C) 2010 The Android Open Source Project
3d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang *
4d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * Licensed under the Apache License, Version 2.0 (the "License");
5d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * you may not use this file except in compliance with the License.
6d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * You may obtain a copy of the License at
7d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang *
8d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang *      http://www.apache.org/licenses/LICENSE-2.0
9d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang *
10d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * Unless required by applicable law or agreed to in writing, software
11d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * distributed under the License is distributed on an "AS IS" BASIS,
12d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * See the License for the specific language governing permissions and
14d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang * limitations under the License.
15d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang */
16d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang
17d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang#include <stdint.h>
18d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang#include <sys/types.h>
19d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang
20d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang#include <utils/Errors.h>
21d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang#include <utils/RefBase.h>
22d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang#include <utils/Vector.h>
23d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang#include <utils/Timers.h>
24d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang
25d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang#include <binder/Parcel.h>
26d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang#include <binder/IInterface.h>
27d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang
28d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang#include <gui/ISurfaceTexture.h>
29d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang
30d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Changnamespace android {
31d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang// ----------------------------------------------------------------------------
32d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang
33d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Changenum {
34d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang    REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
35d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    SET_BUFFER_COUNT,
36d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    DEQUEUE_BUFFER,
37d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    QUEUE_BUFFER,
38d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    CANCEL_BUFFER,
39d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    SET_CROP,
40d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    SET_TRANSFORM,
41d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    GET_ALLOCATOR,
42d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    QUERY,
43d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang    SET_SYNCHRONOUS_MODE,
44d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang};
45d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang
46d251a10cd6ecb8227e7a644512db467fe9707d59Victor Chang
47d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Changclass BpSurfaceTexture : public BpInterface<ISurfaceTexture>
48d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang{
49d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Changpublic:
50d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang    BpSurfaceTexture(const sp<IBinder>& impl)
51d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang        : BpInterface<ISurfaceTexture>(impl)
52d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang    {
53d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang    }
54d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang
55d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang    virtual sp<GraphicBuffer> requestBuffer(int bufferIdx) {
56d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang        Parcel data, reply;
57d5adf42c5e990382aa5bf76062d7008d2f49ab38Victor Chang        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
58        data.writeInt32(bufferIdx);
59        remote()->transact(REQUEST_BUFFER, data, &reply);
60        sp<GraphicBuffer> buffer;
61        bool nonNull = reply.readInt32();
62        if (nonNull) {
63            buffer = new GraphicBuffer();
64            reply.read(*buffer);
65        }
66        return buffer;
67    }
68
69    virtual status_t setBufferCount(int bufferCount)
70    {
71        Parcel data, reply;
72        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
73        data.writeInt32(bufferCount);
74        remote()->transact(SET_BUFFER_COUNT, data, &reply);
75        status_t err = reply.readInt32();
76        return err;
77    }
78
79    virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h,
80            uint32_t format, uint32_t usage) {
81        Parcel data, reply;
82        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
83        data.writeInt32(w);
84        data.writeInt32(h);
85        data.writeInt32(format);
86        data.writeInt32(usage);
87        remote()->transact(DEQUEUE_BUFFER, data, &reply);
88        *buf = reply.readInt32();
89        int result = reply.readInt32();
90        return result;
91    }
92
93    virtual status_t queueBuffer(int buf, int64_t timestamp) {
94        Parcel data, reply;
95        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
96        data.writeInt32(buf);
97        data.writeInt64(timestamp);
98        remote()->transact(QUEUE_BUFFER, data, &reply);
99        status_t result = reply.readInt32();
100        return result;
101    }
102
103    virtual void cancelBuffer(int buf) {
104        Parcel data, reply;
105        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
106        data.writeInt32(buf);
107        remote()->transact(CANCEL_BUFFER, data, &reply);
108    }
109
110    virtual status_t setCrop(const Rect& reg) {
111        Parcel data, reply;
112        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
113        data.writeFloat(reg.left);
114        data.writeFloat(reg.top);
115        data.writeFloat(reg.right);
116        data.writeFloat(reg.bottom);
117        remote()->transact(SET_CROP, data, &reply);
118        status_t result = reply.readInt32();
119        return result;
120    }
121
122    virtual status_t setTransform(uint32_t transform) {
123        Parcel data, reply;
124        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
125        data.writeInt32(transform);
126        remote()->transact(SET_TRANSFORM, data, &reply);
127        status_t result = reply.readInt32();
128        return result;
129    }
130
131    virtual sp<IBinder> getAllocator() {
132        Parcel data, reply;
133        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
134        remote()->transact(GET_ALLOCATOR, data, &reply);
135        return reply.readStrongBinder();
136    }
137
138    virtual int query(int what, int* value) {
139        Parcel data, reply;
140        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
141        data.writeInt32(what);
142        remote()->transact(QUERY, data, &reply);
143        value[0] = reply.readInt32();
144        status_t result = reply.readInt32();
145        return result;
146    }
147
148    virtual status_t setSynchronousMode(bool enabled) {
149        Parcel data, reply;
150        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
151        data.writeInt32(enabled);
152        remote()->transact(SET_SYNCHRONOUS_MODE, data, &reply);
153        status_t result = reply.readInt32();
154        return result;
155    }
156
157
158};
159
160IMPLEMENT_META_INTERFACE(SurfaceTexture, "android.gui.SurfaceTexture");
161
162// ----------------------------------------------------------------------
163
164status_t BnSurfaceTexture::onTransact(
165    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
166{
167    switch(code) {
168        case REQUEST_BUFFER: {
169            CHECK_INTERFACE(ISurfaceTexture, data, reply);
170            int bufferIdx   = data.readInt32();
171            sp<GraphicBuffer> buffer(requestBuffer(bufferIdx));
172            reply->writeInt32(buffer != 0);
173            if (buffer != 0) {
174                reply->write(*buffer);
175            }
176            return NO_ERROR;
177        } break;
178        case SET_BUFFER_COUNT: {
179            CHECK_INTERFACE(ISurfaceTexture, data, reply);
180            int bufferCount = data.readInt32();
181            int result = setBufferCount(bufferCount);
182            reply->writeInt32(result);
183            return NO_ERROR;
184        } break;
185        case DEQUEUE_BUFFER: {
186            CHECK_INTERFACE(ISurfaceTexture, data, reply);
187            uint32_t w      = data.readInt32();
188            uint32_t h      = data.readInt32();
189            uint32_t format = data.readInt32();
190            uint32_t usage  = data.readInt32();
191            int buf;
192            int result = dequeueBuffer(&buf, w, h, format, usage);
193            reply->writeInt32(buf);
194            reply->writeInt32(result);
195            return NO_ERROR;
196        } break;
197        case QUEUE_BUFFER: {
198            CHECK_INTERFACE(ISurfaceTexture, data, reply);
199            int buf = data.readInt32();
200            int64_t timestamp = data.readInt64();
201            status_t result = queueBuffer(buf, timestamp);
202            reply->writeInt32(result);
203            return NO_ERROR;
204        } break;
205        case CANCEL_BUFFER: {
206            CHECK_INTERFACE(ISurfaceTexture, data, reply);
207            int buf = data.readInt32();
208            cancelBuffer(buf);
209            return NO_ERROR;
210        } break;
211        case SET_CROP: {
212            Rect reg;
213            CHECK_INTERFACE(ISurfaceTexture, data, reply);
214            reg.left = data.readFloat();
215            reg.top = data.readFloat();
216            reg.right = data.readFloat();
217            reg.bottom = data.readFloat();
218            status_t result = setCrop(reg);
219            reply->writeInt32(result);
220            return NO_ERROR;
221        } break;
222        case SET_TRANSFORM: {
223            CHECK_INTERFACE(ISurfaceTexture, data, reply);
224            uint32_t transform = data.readInt32();
225            status_t result = setTransform(transform);
226            reply->writeInt32(result);
227            return NO_ERROR;
228        } break;
229        case GET_ALLOCATOR: {
230            CHECK_INTERFACE(ISurfaceTexture, data, reply);
231            sp<IBinder> result = getAllocator();
232            reply->writeStrongBinder(result);
233            return NO_ERROR;
234        } break;
235        case QUERY: {
236            CHECK_INTERFACE(ISurfaceTexture, data, reply);
237            int value;
238            int what = data.readInt32();
239            int res = query(what, &value);
240            reply->writeInt32(value);
241            reply->writeInt32(res);
242            return NO_ERROR;
243        } break;
244        case SET_SYNCHRONOUS_MODE: {
245            CHECK_INTERFACE(ISurfaceTexture, data, reply);
246            bool enabled = data.readInt32();
247            status_t res = setSynchronousMode(enabled);
248            reply->writeInt32(res);
249            return NO_ERROR;
250        } break;
251    }
252    return BBinder::onTransact(code, data, reply, flags);
253}
254
255// ----------------------------------------------------------------------------
256
257}; // namespace android
258