168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis/* 268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * Copyright (C) 2010 The Android Open Source Project 368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * 468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * you may not use this file except in compliance with the License. 668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * You may obtain a copy of the License at 768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * 868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * 1068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * Unless required by applicable law or agreed to in writing, software 1168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 1268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * See the License for the specific language governing permissions and 1468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis * limitations under the License. 1568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis */ 1668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 1768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <stdint.h> 1868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <sys/types.h> 1968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 2068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <utils/Errors.h> 2168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <utils/RefBase.h> 2268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <utils/Vector.h> 2368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <utils/Timers.h> 2468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 2568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <binder/Parcel.h> 2668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <binder/IInterface.h> 2768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 2868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis#include <gui/ISurfaceTexture.h> 2968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 3068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennisnamespace android { 3168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis// ---------------------------------------------------------------------------- 3268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 3368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennisenum { 3468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis REQUEST_BUFFER = IBinder::FIRST_CALL_TRANSACTION, 3568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis SET_BUFFER_COUNT, 3668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis DEQUEUE_BUFFER, 3768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis QUEUE_BUFFER, 3868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CANCEL_BUFFER, 3968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis SET_CROP, 4068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis SET_TRANSFORM, 41ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian QUERY, 42402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian SET_SYNCHRONOUS_MODE, 439709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis CONNECT, 449709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis DISCONNECT, 4509d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian SET_SCALING_MODE, 4668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis}; 4768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 4868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 4968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennisclass BpSurfaceTexture : public BpInterface<ISurfaceTexture> 5068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis{ 5168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennispublic: 5268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis BpSurfaceTexture(const sp<IBinder>& impl) 5368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis : BpInterface<ISurfaceTexture>(impl) 5468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis { 5568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 5668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 575ef59bc764d6bcd0ccf0a266d7d9ab792668a3e9Jamie Gennis virtual status_t requestBuffer(int bufferIdx, sp<GraphicBuffer>* buf) { 5868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Parcel data, reply; 5968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 6068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInt32(bufferIdx); 616cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result =remote()->transact(REQUEST_BUFFER, data, &reply); 626cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 636cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 646cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 6568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis bool nonNull = reply.readInt32(); 6668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis if (nonNull) { 675ef59bc764d6bcd0ccf0a266d7d9ab792668a3e9Jamie Gennis *buf = new GraphicBuffer(); 685ef59bc764d6bcd0ccf0a266d7d9ab792668a3e9Jamie Gennis reply.read(**buf); 6968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 706cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 715ef59bc764d6bcd0ccf0a266d7d9ab792668a3e9Jamie Gennis return result; 7268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 7368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 7468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis virtual status_t setBufferCount(int bufferCount) 7568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis { 7668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Parcel data, reply; 7768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 7868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInt32(bufferCount); 796cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result =remote()->transact(SET_BUFFER_COUNT, data, &reply); 806cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 816cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 826cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 836cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 846cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 8568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 8668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 870297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian virtual status_t dequeueBuffer(int *buf, uint32_t w, uint32_t h, 880297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian uint32_t format, uint32_t usage) { 8968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Parcel data, reply; 9068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 910297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian data.writeInt32(w); 920297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian data.writeInt32(h); 930297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian data.writeInt32(format); 940297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian data.writeInt32(usage); 956cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); 966cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 976cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 986cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 9968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis *buf = reply.readInt32(); 1006cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 10168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return result; 10268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 10368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 104f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian virtual status_t queueBuffer(int buf, int64_t timestamp, 105f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { 10668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Parcel data, reply; 10768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 10868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInt32(buf); 109c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala data.writeInt64(timestamp); 1106cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); 1116cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 1126cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 1136cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 114f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian *outWidth = reply.readInt32(); 115f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian *outHeight = reply.readInt32(); 116f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian *outTransform = reply.readInt32(); 1176cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 11868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return result; 11968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 12068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 12168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis virtual void cancelBuffer(int buf) { 12268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Parcel data, reply; 12368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 12468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInt32(buf); 12568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis remote()->transact(CANCEL_BUFFER, data, &reply); 12668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 12768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 12868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis virtual status_t setCrop(const Rect& reg) { 12968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Parcel data, reply; 13068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 13168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeFloat(reg.left); 13268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeFloat(reg.top); 13368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeFloat(reg.right); 13468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeFloat(reg.bottom); 1356cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(SET_CROP, data, &reply); 1366cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 1376cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 1386cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 1396cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 14068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return result; 14168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 14268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 14368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis virtual status_t setTransform(uint32_t transform) { 14468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Parcel data, reply; 14568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 14668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis data.writeInt32(transform); 1476cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(SET_TRANSFORM, data, &reply); 1486cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 1496cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 1506cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 1516cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 15268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return result; 15368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 15483bac216a7ba8493a7916e40b2555e73c3a5cc1aJamie Gennis 15509d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian virtual status_t setScalingMode(int mode) { 15609d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian Parcel data, reply; 15709d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 15809d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian data.writeInt32(mode); 1596cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(SET_SCALING_MODE, data, &reply); 1606cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 1616cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 1626cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 1636cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 16409d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian return result; 16509d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian } 16609d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian 167ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian virtual int query(int what, int* value) { 168ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian Parcel data, reply; 169ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 170ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian data.writeInt32(what); 1716cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(QUERY, data, &reply); 1726cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 1736cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 1746cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 175ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian value[0] = reply.readInt32(); 1766cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 177ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian return result; 178ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian } 179ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian 180402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian virtual status_t setSynchronousMode(bool enabled) { 181402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian Parcel data, reply; 182402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 183402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian data.writeInt32(enabled); 1846cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(SET_SYNCHRONOUS_MODE, data, &reply); 1856cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 1866cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 1876cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 1886cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 189402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian return result; 190402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian } 191402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian 192053b02df2d350466a2226a90709e50fedef54747Mathias Agopian virtual status_t connect(int api, 193053b02df2d350466a2226a90709e50fedef54747Mathias Agopian uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) { 1949709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis Parcel data, reply; 1959709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 1969709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis data.writeInt32(api); 1976cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result = remote()->transact(CONNECT, data, &reply); 1986cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 1996cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 2006cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 201053b02df2d350466a2226a90709e50fedef54747Mathias Agopian *outWidth = reply.readInt32(); 202053b02df2d350466a2226a90709e50fedef54747Mathias Agopian *outHeight = reply.readInt32(); 203053b02df2d350466a2226a90709e50fedef54747Mathias Agopian *outTransform = reply.readInt32(); 2046cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 2059709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis return result; 2069709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis } 207402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian 2089709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis virtual status_t disconnect(int api) { 2099709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis Parcel data, reply; 2109709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor()); 2119709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis data.writeInt32(api); 2126cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis status_t result =remote()->transact(DISCONNECT, data, &reply); 2136cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis if (result != NO_ERROR) { 2146cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis return result; 2156cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis } 2166cb76588d7a26b050ecafec5ba7ee011431091e8Jamie Gennis result = reply.readInt32(); 2179709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis return result; 2189709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis } 21968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis}; 22068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 22168e4a7ac849b681b1fb769857fc04f64262480c4Jamie GennisIMPLEMENT_META_INTERFACE(SurfaceTexture, "android.gui.SurfaceTexture"); 22268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 22368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis// ---------------------------------------------------------------------- 22468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 22568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennisstatus_t BnSurfaceTexture::onTransact( 22668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 22768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis{ 22868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis switch(code) { 22968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis case REQUEST_BUFFER: { 23068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 23168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis int bufferIdx = data.readInt32(); 2325ef59bc764d6bcd0ccf0a266d7d9ab792668a3e9Jamie Gennis sp<GraphicBuffer> buffer; 2335ef59bc764d6bcd0ccf0a266d7d9ab792668a3e9Jamie Gennis int result = requestBuffer(bufferIdx, &buffer); 23468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->writeInt32(buffer != 0); 23568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis if (buffer != 0) { 23668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->write(*buffer); 23768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 2385ef59bc764d6bcd0ccf0a266d7d9ab792668a3e9Jamie Gennis reply->writeInt32(result); 23968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return NO_ERROR; 24068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } break; 24168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis case SET_BUFFER_COUNT: { 24268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 24368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis int bufferCount = data.readInt32(); 24468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis int result = setBufferCount(bufferCount); 24568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->writeInt32(result); 24668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return NO_ERROR; 24768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } break; 24868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis case DEQUEUE_BUFFER: { 24968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 2500297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian uint32_t w = data.readInt32(); 2510297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian uint32_t h = data.readInt32(); 2520297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian uint32_t format = data.readInt32(); 2530297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian uint32_t usage = data.readInt32(); 25468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis int buf; 2550297dcae8fddb18ab9e28ba1858a57a8aec3ef32Mathias Agopian int result = dequeueBuffer(&buf, w, h, format, usage); 25668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->writeInt32(buf); 25768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->writeInt32(result); 25868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return NO_ERROR; 25968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } break; 26068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis case QUEUE_BUFFER: { 26168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 26268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis int buf = data.readInt32(); 263c5f94d8a4779050125145396ca83fbc862c7ed6bEino-Ville Talvala int64_t timestamp = data.readInt64(); 264f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian uint32_t outWidth, outHeight, outTransform; 265f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian status_t result = queueBuffer(buf, timestamp, 266f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian &outWidth, &outHeight, &outTransform); 267f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian reply->writeInt32(outWidth); 268f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian reply->writeInt32(outHeight); 269f07b8a3f691be39083fb5163f9456bcfa566f93fMathias Agopian reply->writeInt32(outTransform); 27068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->writeInt32(result); 27168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return NO_ERROR; 27268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } break; 27368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis case CANCEL_BUFFER: { 27468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 27568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis int buf = data.readInt32(); 27668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis cancelBuffer(buf); 27768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return NO_ERROR; 27868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } break; 27968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis case SET_CROP: { 28068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis Rect reg; 28168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 28268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reg.left = data.readFloat(); 28368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reg.top = data.readFloat(); 28468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reg.right = data.readFloat(); 28568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reg.bottom = data.readFloat(); 28668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis status_t result = setCrop(reg); 28768e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->writeInt32(result); 28868e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return NO_ERROR; 28968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } break; 29068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis case SET_TRANSFORM: { 29168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 29268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis uint32_t transform = data.readInt32(); 29368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis status_t result = setTransform(transform); 29468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis reply->writeInt32(result); 29568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return NO_ERROR; 29668e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } break; 29709d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian case SET_SCALING_MODE: { 29809d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian CHECK_INTERFACE(ISurfaceTexture, data, reply); 29909d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian int mode = data.readInt32(); 30009d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian status_t result = setScalingMode(mode); 30109d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian reply->writeInt32(result); 30209d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian return NO_ERROR; 30309d7ed7b395d66be97c6bcb052039f5c0dce646cMathias Agopian } break; 304ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian case QUERY: { 305ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian CHECK_INTERFACE(ISurfaceTexture, data, reply); 306ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian int value; 307ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian int what = data.readInt32(); 308ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian int res = query(what, &value); 309ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian reply->writeInt32(value); 310ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian reply->writeInt32(res); 311ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian return NO_ERROR; 312ed3894c07a67b3e35d07084c4a8b410908bfedc5Mathias Agopian } break; 313402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian case SET_SYNCHRONOUS_MODE: { 314402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian CHECK_INTERFACE(ISurfaceTexture, data, reply); 315402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian bool enabled = data.readInt32(); 316402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian status_t res = setSynchronousMode(enabled); 317402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian reply->writeInt32(res); 318402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian return NO_ERROR; 319402ff24aa199a2587498b694e2be67ceb1265c69Mathias Agopian } break; 3209709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis case CONNECT: { 3219709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 3229709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis int api = data.readInt32(); 323053b02df2d350466a2226a90709e50fedef54747Mathias Agopian uint32_t outWidth, outHeight, outTransform; 324053b02df2d350466a2226a90709e50fedef54747Mathias Agopian status_t res = connect(api, 325053b02df2d350466a2226a90709e50fedef54747Mathias Agopian &outWidth, &outHeight, &outTransform); 326053b02df2d350466a2226a90709e50fedef54747Mathias Agopian reply->writeInt32(outWidth); 327053b02df2d350466a2226a90709e50fedef54747Mathias Agopian reply->writeInt32(outHeight); 328053b02df2d350466a2226a90709e50fedef54747Mathias Agopian reply->writeInt32(outTransform); 3299709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis reply->writeInt32(res); 3309709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis return NO_ERROR; 3319709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis } break; 3329709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis case DISCONNECT: { 3339709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis CHECK_INTERFACE(ISurfaceTexture, data, reply); 3349709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis int api = data.readInt32(); 335d2734a5daae91869949218a322a35e7423e59a9aMathias Agopian status_t res = disconnect(api); 3369709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis reply->writeInt32(res); 3379709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis return NO_ERROR; 3389709687463dc5f1255f435e57b3d2beed8b70330Jamie Gennis } break; 33968e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis } 34068e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis return BBinder::onTransact(code, data, reply, flags); 34168e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis} 34268e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 34368e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis// ---------------------------------------------------------------------------- 34468e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis 34568e4a7ac849b681b1fb769857fc04f64262480c4Jamie Gennis}; // namespace android 346