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