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