blob: 44c78cadb038924e70d97eb061dcf2e0e571ba66 [file] [log] [blame]
Jamie Gennis8ba32fa2010-12-20 11:27:26 -08001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdint.h>
18#include <sys/types.h>
19
20#include <utils/Errors.h>
21#include <utils/RefBase.h>
22#include <utils/Vector.h>
23#include <utils/Timers.h>
24
25#include <binder/Parcel.h>
26#include <binder/IInterface.h>
27
28#include <gui/ISurfaceTexture.h>
29
30namespace android {
31// ----------------------------------------------------------------------------
32
33enum {
34 REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
35 SET_BUFFER_COUNT,
36 DEQUEUE_BUFFER,
37 QUEUE_BUFFER,
38 CANCEL_BUFFER,
39 SET_CROP,
40 SET_TRANSFORM,
Jamie Gennis1b20cde2011-02-02 15:31:47 -080041 GET_ALLOCATOR,
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080042};
43
44
45class BpSurfaceTexture : public BpInterface<ISurfaceTexture>
46{
47public:
48 BpSurfaceTexture(const sp<IBinder>& impl)
49 : BpInterface<ISurfaceTexture>(impl)
50 {
51 }
52
Mathias Agopianc04f1532011-04-25 20:22:14 -070053 virtual sp<GraphicBuffer> requestBuffer(int bufferIdx) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080054 Parcel data, reply;
55 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
56 data.writeInt32(bufferIdx);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080057 remote()->transact(REQUEST_BUFFER, data, &reply);
58 sp<GraphicBuffer> buffer;
59 bool nonNull = reply.readInt32();
60 if (nonNull) {
61 buffer = new GraphicBuffer();
62 reply.read(*buffer);
63 }
64 return buffer;
65 }
66
67 virtual status_t setBufferCount(int bufferCount)
68 {
69 Parcel data, reply;
70 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
71 data.writeInt32(bufferCount);
72 remote()->transact(SET_BUFFER_COUNT, data, &reply);
73 status_t err = reply.readInt32();
74 return err;
75 }
76
Mathias Agopianc04f1532011-04-25 20:22:14 -070077 virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h,
78 uint32_t format, uint32_t usage) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080079 Parcel data, reply;
80 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
Mathias Agopianc04f1532011-04-25 20:22:14 -070081 data.writeInt32(w);
82 data.writeInt32(h);
83 data.writeInt32(format);
84 data.writeInt32(usage);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080085 remote()->transact(DEQUEUE_BUFFER, data, &reply);
86 *buf = reply.readInt32();
87 int result = reply.readInt32();
88 return result;
89 }
90
Eino-Ville Talvala1d01a122011-02-18 11:02:42 -080091 virtual status_t queueBuffer(int buf, int64_t timestamp) {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080092 Parcel data, reply;
93 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
94 data.writeInt32(buf);
Eino-Ville Talvala1d01a122011-02-18 11:02:42 -080095 data.writeInt64(timestamp);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -080096 remote()->transact(QUEUE_BUFFER, data, &reply);
97 status_t result = reply.readInt32();
98 return result;
99 }
100
101 virtual void cancelBuffer(int buf) {
102 Parcel data, reply;
103 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
104 data.writeInt32(buf);
105 remote()->transact(CANCEL_BUFFER, data, &reply);
106 }
107
108 virtual status_t setCrop(const Rect& reg) {
109 Parcel data, reply;
110 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
111 data.writeFloat(reg.left);
112 data.writeFloat(reg.top);
113 data.writeFloat(reg.right);
114 data.writeFloat(reg.bottom);
115 remote()->transact(SET_CROP, data, &reply);
116 status_t result = reply.readInt32();
117 return result;
118 }
119
120 virtual status_t setTransform(uint32_t transform) {
121 Parcel data, reply;
122 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
123 data.writeInt32(transform);
124 remote()->transact(SET_TRANSFORM, data, &reply);
125 status_t result = reply.readInt32();
126 return result;
127 }
Jamie Gennis1b20cde2011-02-02 15:31:47 -0800128
129 virtual sp<IBinder> getAllocator() {
130 Parcel data, reply;
131 data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
132 remote()->transact(GET_ALLOCATOR, data, &reply);
133 return reply.readStrongBinder();
134 }
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800135};
136
137IMPLEMENT_META_INTERFACE(SurfaceTexture, "android.gui.SurfaceTexture");
138
139// ----------------------------------------------------------------------
140
141status_t BnSurfaceTexture::onTransact(
142 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
143{
144 switch(code) {
145 case REQUEST_BUFFER: {
146 CHECK_INTERFACE(ISurfaceTexture, data, reply);
147 int bufferIdx = data.readInt32();
Mathias Agopianc04f1532011-04-25 20:22:14 -0700148 sp<GraphicBuffer> buffer(requestBuffer(bufferIdx));
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800149 reply->writeInt32(buffer != 0);
150 if (buffer != 0) {
151 reply->write(*buffer);
152 }
153 return NO_ERROR;
154 } break;
155 case SET_BUFFER_COUNT: {
156 CHECK_INTERFACE(ISurfaceTexture, data, reply);
157 int bufferCount = data.readInt32();
158 int result = setBufferCount(bufferCount);
159 reply->writeInt32(result);
160 return NO_ERROR;
161 } break;
162 case DEQUEUE_BUFFER: {
163 CHECK_INTERFACE(ISurfaceTexture, data, reply);
Mathias Agopianc04f1532011-04-25 20:22:14 -0700164 uint32_t w = data.readInt32();
165 uint32_t h = data.readInt32();
166 uint32_t format = data.readInt32();
167 uint32_t usage = data.readInt32();
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800168 int buf;
Mathias Agopianc04f1532011-04-25 20:22:14 -0700169 int result = dequeueBuffer(&buf, w, h, format, usage);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800170 reply->writeInt32(buf);
171 reply->writeInt32(result);
172 return NO_ERROR;
173 } break;
174 case QUEUE_BUFFER: {
175 CHECK_INTERFACE(ISurfaceTexture, data, reply);
176 int buf = data.readInt32();
Eino-Ville Talvala1d01a122011-02-18 11:02:42 -0800177 int64_t timestamp = data.readInt64();
178 status_t result = queueBuffer(buf, timestamp);
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800179 reply->writeInt32(result);
180 return NO_ERROR;
181 } break;
182 case CANCEL_BUFFER: {
183 CHECK_INTERFACE(ISurfaceTexture, data, reply);
184 int buf = data.readInt32();
185 cancelBuffer(buf);
186 return NO_ERROR;
187 } break;
188 case SET_CROP: {
189 Rect reg;
190 CHECK_INTERFACE(ISurfaceTexture, data, reply);
191 reg.left = data.readFloat();
192 reg.top = data.readFloat();
193 reg.right = data.readFloat();
194 reg.bottom = data.readFloat();
195 status_t result = setCrop(reg);
196 reply->writeInt32(result);
197 return NO_ERROR;
198 } break;
199 case SET_TRANSFORM: {
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800200 CHECK_INTERFACE(ISurfaceTexture, data, reply);
201 uint32_t transform = data.readInt32();
202 status_t result = setTransform(transform);
203 reply->writeInt32(result);
204 return NO_ERROR;
205 } break;
Jamie Gennis1b20cde2011-02-02 15:31:47 -0800206 case GET_ALLOCATOR: {
207 CHECK_INTERFACE(ISurfaceTexture, data, reply);
208 sp<IBinder> result = getAllocator();
209 reply->writeStrongBinder(result);
210 return NO_ERROR;
211 } break;
Jamie Gennis8ba32fa2010-12-20 11:27:26 -0800212 }
213 return BBinder::onTransact(code, data, reply, flags);
214}
215
216// ----------------------------------------------------------------------------
217
218}; // namespace android