IGraphicBufferConsumer.cpp revision 3c25621ad7d13f64d3ab95a27fa970fbc9998f73
122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/*
2cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * Copyright (C) 2013 The Android Open Source Project
3cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *
4cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
5cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * you may not use this file except in compliance with the License.
6cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * You may obtain a copy of the License at
7cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *
8cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *      http://www.apache.org/licenses/LICENSE-2.0
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao *
10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines * Unless required by applicable law or agreed to in writing, software
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * distributed under the License is distributed on an "AS IS" BASIS,
12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * See the License for the specific language governing permissions and
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines * limitations under the License.
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines */
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#define EGL_EGLEXT_PROTOTYPES
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <EGL/egl.h>
2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <EGL/eglext.h>
21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <stdint.h>
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <sys/types.h>
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <utils/Errors.h>
27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <binder/Parcel.h>
29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <binder/IInterface.h>
30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <gui/IConsumerListener.h>
32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <gui/IGraphicBufferConsumer.h>
33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <ui/GraphicBuffer.h>
35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <ui/Fence.h>
36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <system/window.h>
38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
39cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaonamespace android {
40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// ---------------------------------------------------------------------------
41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesIGraphicBufferConsumer::BufferItem::BufferItem() :
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    mTransform(0),
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    mScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    mTimestamp(0),
46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    mIsAutoTimestamp(false),
47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    mFrameNumber(0),
48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    mBuf(INVALID_BUFFER_SLOT),
49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    mIsDroppable(false),
50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    mAcquireCalled(false) {
51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    mCrop.makeInvalid();
52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinessize_t IGraphicBufferConsumer::BufferItem::getPodSize() const {
55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    size_t c =  sizeof(mCrop) +
56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mTransform) +
57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mScalingMode) +
58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mTimestamp) +
59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mIsAutoTimestamp) +
60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mFrameNumber) +
61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mBuf) +
62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mIsDroppable) +
63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines            sizeof(mAcquireCalled);
64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    return c;
65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinessize_t IGraphicBufferConsumer::BufferItem::getFlattenedSize() const {
68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    size_t c = 0;
69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    if (mGraphicBuffer != 0) {
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao        c += mGraphicBuffer->getFlattenedSize();
71f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        FlattenableUtils::align<4>(c);
72f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    if (mFence != 0) {
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        c += mFence->getFlattenedSize();
75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines        FlattenableUtils::align<4>(c);
76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    }
7722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    return sizeof(int32_t) + c + getPodSize();
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinessize_t IGraphicBufferConsumer::BufferItem::getFdCount() const {
81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    size_t c = 0;
8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (mGraphicBuffer != 0) {
83cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao        c += mGraphicBuffer->getFdCount();
84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    }
85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    if (mFence != 0) {
86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines        c += mFence->getFdCount();
87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    }
88cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    return c;
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstatus_t IGraphicBufferConsumer::BufferItem::flatten(
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines        void*& buffer, size_t& size, int*& fds, size_t& count) const {
93f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
94f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // make sure we have enough space
95f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    if (count < BufferItem::getFlattenedSize()) {
96f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines        return NO_MEMORY;
97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    }
98f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
99f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // content flags are stored first
100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    uint32_t& flags = *static_cast<uint32_t*>(buffer);
101f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines
102f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    // advance the pointer
103f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines    FlattenableUtils::advance(buffer, size, sizeof(uint32_t));
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    flags = 0;
10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (mGraphicBuffer != 0) {
107cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao        status_t err = mGraphicBuffer->flatten(buffer, size, fds, count);
108cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao        if (err) return err;
109        size -= FlattenableUtils::align<4>(buffer);
110        flags |= 1;
111    }
112    if (mFence != 0) {
113        status_t err = mFence->flatten(buffer, size, fds, count);
114        if (err) return err;
115        size -= FlattenableUtils::align<4>(buffer);
116        flags |= 2;
117    }
118
119    // check we have enough space (in case flattening the fence/graphicbuffer lied to us)
120    if (size < getPodSize()) {
121        return NO_MEMORY;
122    }
123
124    FlattenableUtils::write(buffer, size, mCrop);
125    FlattenableUtils::write(buffer, size, mTransform);
126    FlattenableUtils::write(buffer, size, mScalingMode);
127    FlattenableUtils::write(buffer, size, mTimestamp);
128    FlattenableUtils::write(buffer, size, mIsAutoTimestamp);
129    FlattenableUtils::write(buffer, size, mFrameNumber);
130    FlattenableUtils::write(buffer, size, mBuf);
131    FlattenableUtils::write(buffer, size, mIsDroppable);
132    FlattenableUtils::write(buffer, size, mAcquireCalled);
133
134    return NO_ERROR;
135}
136
137status_t IGraphicBufferConsumer::BufferItem::unflatten(
138        void const*& buffer, size_t& size, int const*& fds, size_t& count) {
139
140    if (size < sizeof(uint32_t))
141        return NO_MEMORY;
142
143    uint32_t flags = 0;
144    FlattenableUtils::read(buffer, size, flags);
145
146    if (flags & 1) {
147        mGraphicBuffer = new GraphicBuffer();
148        status_t err = mGraphicBuffer->unflatten(buffer, size, fds, count);
149        if (err) return err;
150        size -= FlattenableUtils::align<4>(buffer);
151    }
152
153    if (flags & 2) {
154        mFence = new Fence();
155        status_t err = mFence->unflatten(buffer, size, fds, count);
156        if (err) return err;
157        size -= FlattenableUtils::align<4>(buffer);
158    }
159
160    // check we have enough space
161    if (size < getPodSize()) {
162        return NO_MEMORY;
163    }
164
165    FlattenableUtils::read(buffer, size, mCrop);
166    FlattenableUtils::read(buffer, size, mTransform);
167    FlattenableUtils::read(buffer, size, mScalingMode);
168    FlattenableUtils::read(buffer, size, mTimestamp);
169    FlattenableUtils::read(buffer, size, mIsAutoTimestamp);
170    FlattenableUtils::read(buffer, size, mFrameNumber);
171    FlattenableUtils::read(buffer, size, mBuf);
172    FlattenableUtils::read(buffer, size, mIsDroppable);
173    FlattenableUtils::read(buffer, size, mAcquireCalled);
174
175    return NO_ERROR;
176}
177
178// ---------------------------------------------------------------------------
179
180enum {
181    ACQUIRE_BUFFER = IBinder::FIRST_CALL_TRANSACTION,
182    RELEASE_BUFFER,
183    CONSUMER_CONNECT,
184    CONSUMER_DISCONNECT,
185    GET_RELEASED_BUFFERS,
186    SET_DEFAULT_BUFFER_SIZE,
187    SET_DEFAULT_MAX_BUFFER_COUNT,
188    DISABLE_ASYNC_BUFFER,
189    SET_MAX_ACQUIRED_BUFFER_COUNT,
190    SET_CONSUMER_NAME,
191    SET_DEFAULT_BUFFER_FORMAT,
192    SET_CONSUMER_USAGE_BITS,
193    SET_TRANSFORM_HINT,
194    DUMP,
195};
196
197
198class BpGraphicBufferConsumer : public BpInterface<IGraphicBufferConsumer>
199{
200public:
201    BpGraphicBufferConsumer(const sp<IBinder>& impl)
202        : BpInterface<IGraphicBufferConsumer>(impl)
203    {
204    }
205
206    virtual status_t acquireBuffer(BufferItem *buffer, nsecs_t presentWhen) {
207        Parcel data, reply;
208        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
209        data.writeInt64(presentWhen);
210        status_t result = remote()->transact(ACQUIRE_BUFFER, data, &reply);
211        if (result != NO_ERROR) {
212            return result;
213        }
214        result = reply.read(*buffer);
215        if (result != NO_ERROR) {
216            return result;
217        }
218        return reply.readInt32();
219    }
220
221    virtual status_t releaseBuffer(int buf, uint64_t frameNumber,
222            EGLDisplay display, EGLSyncKHR fence,
223            const sp<Fence>& releaseFence) {
224        Parcel data, reply;
225        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
226        data.writeInt32(buf);
227        data.writeInt64(frameNumber);
228        data.write(*releaseFence);
229        status_t result = remote()->transact(RELEASE_BUFFER, data, &reply);
230        if (result != NO_ERROR) {
231            return result;
232        }
233        return reply.readInt32();
234    }
235
236    virtual status_t consumerConnect(const sp<IConsumerListener>& consumer, bool controlledByApp) {
237        Parcel data, reply;
238        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
239        data.writeStrongBinder(consumer->asBinder());
240        data.writeInt32(controlledByApp);
241        status_t result = remote()->transact(CONSUMER_CONNECT, data, &reply);
242        if (result != NO_ERROR) {
243            return result;
244        }
245        return reply.readInt32();
246    }
247
248    virtual status_t consumerDisconnect() {
249        Parcel data, reply;
250        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
251        status_t result = remote()->transact(CONSUMER_DISCONNECT, data, &reply);
252        if (result != NO_ERROR) {
253            return result;
254        }
255        return reply.readInt32();
256    }
257
258    virtual status_t getReleasedBuffers(uint32_t* slotMask) {
259        Parcel data, reply;
260        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
261        status_t result = remote()->transact(GET_RELEASED_BUFFERS, data, &reply);
262        if (result != NO_ERROR) {
263            return result;
264        }
265        *slotMask = reply.readInt32();
266        return reply.readInt32();
267    }
268
269    virtual status_t setDefaultBufferSize(uint32_t w, uint32_t h) {
270        Parcel data, reply;
271        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
272        data.writeInt32(w);
273        data.writeInt32(h);
274        status_t result = remote()->transact(SET_DEFAULT_BUFFER_SIZE, data, &reply);
275        if (result != NO_ERROR) {
276            return result;
277        }
278        return reply.readInt32();
279    }
280
281    virtual status_t setDefaultMaxBufferCount(int bufferCount) {
282        Parcel data, reply;
283        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
284        data.writeInt32(bufferCount);
285        status_t result = remote()->transact(SET_DEFAULT_MAX_BUFFER_COUNT, data, &reply);
286        if (result != NO_ERROR) {
287            return result;
288        }
289        return reply.readInt32();
290    }
291
292    virtual status_t disableAsyncBuffer() {
293        Parcel data, reply;
294        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
295        status_t result = remote()->transact(DISABLE_ASYNC_BUFFER, data, &reply);
296        if (result != NO_ERROR) {
297            return result;
298        }
299        return reply.readInt32();
300    }
301
302    virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) {
303        Parcel data, reply;
304        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
305        data.writeInt32(maxAcquiredBuffers);
306        status_t result = remote()->transact(SET_MAX_ACQUIRED_BUFFER_COUNT, data, &reply);
307        if (result != NO_ERROR) {
308            return result;
309        }
310        return reply.readInt32();
311    }
312
313    virtual void setConsumerName(const String8& name) {
314        Parcel data, reply;
315        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
316        data.writeString8(name);
317        remote()->transact(SET_CONSUMER_NAME, data, &reply);
318    }
319
320    virtual status_t setDefaultBufferFormat(uint32_t defaultFormat) {
321        Parcel data, reply;
322        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
323        data.writeInt32(defaultFormat);
324        status_t result = remote()->transact(SET_DEFAULT_BUFFER_FORMAT, data, &reply);
325        if (result != NO_ERROR) {
326            return result;
327        }
328        return reply.readInt32();
329    }
330
331    virtual status_t setConsumerUsageBits(uint32_t usage) {
332        Parcel data, reply;
333        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
334        data.writeInt32(usage);
335        status_t result = remote()->transact(SET_CONSUMER_USAGE_BITS, data, &reply);
336        if (result != NO_ERROR) {
337            return result;
338        }
339        return reply.readInt32();
340    }
341
342    virtual status_t setTransformHint(uint32_t hint) {
343        Parcel data, reply;
344        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
345        data.writeInt32(hint);
346        status_t result = remote()->transact(SET_TRANSFORM_HINT, data, &reply);
347        if (result != NO_ERROR) {
348            return result;
349        }
350        return reply.readInt32();
351    }
352
353    virtual void dump(String8& result, const char* prefix) const {
354        Parcel data, reply;
355        data.writeInterfaceToken(IGraphicBufferConsumer::getInterfaceDescriptor());
356        data.writeString8(result);
357        data.writeString8(String8(prefix ? prefix : ""));
358        remote()->transact(DUMP, data, &reply);
359        reply.readString8();
360    }
361};
362
363IMPLEMENT_META_INTERFACE(GraphicBufferConsumer, "android.gui.IGraphicBufferConsumer");
364
365// ----------------------------------------------------------------------
366
367status_t BnGraphicBufferConsumer::onTransact(
368        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
369{
370    switch(code) {
371        case ACQUIRE_BUFFER: {
372            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
373            BufferItem item;
374            int64_t presentWhen = data.readInt64();
375            status_t result = acquireBuffer(&item, presentWhen);
376            status_t err = reply->write(item);
377            if (err) return err;
378            reply->writeInt32(result);
379            return NO_ERROR;
380        } break;
381        case RELEASE_BUFFER: {
382            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
383            int buf = data.readInt32();
384            uint64_t frameNumber = data.readInt64();
385            sp<Fence> releaseFence = new Fence();
386            status_t err = data.read(*releaseFence);
387            if (err) return err;
388            status_t result = releaseBuffer(buf, frameNumber,
389                    EGL_NO_DISPLAY, EGL_NO_SYNC_KHR, releaseFence);
390            reply->writeInt32(result);
391            return NO_ERROR;
392        } break;
393        case CONSUMER_CONNECT: {
394            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
395            sp<IConsumerListener> consumer = IConsumerListener::asInterface( data.readStrongBinder() );
396            bool controlledByApp = data.readInt32();
397            status_t result = consumerConnect(consumer, controlledByApp);
398            reply->writeInt32(result);
399            return NO_ERROR;
400        } break;
401        case CONSUMER_DISCONNECT: {
402            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
403            status_t result = consumerDisconnect();
404            reply->writeInt32(result);
405            return NO_ERROR;
406        } break;
407        case GET_RELEASED_BUFFERS: {
408            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
409            uint32_t slotMask;
410            status_t result = getReleasedBuffers(&slotMask);
411            reply->writeInt32(slotMask);
412            reply->writeInt32(result);
413            return NO_ERROR;
414        } break;
415        case SET_DEFAULT_BUFFER_SIZE: {
416            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
417            uint32_t w = data.readInt32();
418            uint32_t h = data.readInt32();
419            status_t result = setDefaultBufferSize(w, h);
420            reply->writeInt32(result);
421            return NO_ERROR;
422        } break;
423        case SET_DEFAULT_MAX_BUFFER_COUNT: {
424            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
425            uint32_t bufferCount = data.readInt32();
426            status_t result = setDefaultMaxBufferCount(bufferCount);
427            reply->writeInt32(result);
428            return NO_ERROR;
429        } break;
430        case DISABLE_ASYNC_BUFFER: {
431            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
432            status_t result = disableAsyncBuffer();
433            reply->writeInt32(result);
434            return NO_ERROR;
435        } break;
436        case SET_MAX_ACQUIRED_BUFFER_COUNT: {
437            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
438            uint32_t maxAcquiredBuffers = data.readInt32();
439            status_t result = setMaxAcquiredBufferCount(maxAcquiredBuffers);
440            reply->writeInt32(result);
441            return NO_ERROR;
442        } break;
443        case SET_CONSUMER_NAME: {
444            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
445            setConsumerName( data.readString8() );
446            return NO_ERROR;
447        } break;
448        case SET_DEFAULT_BUFFER_FORMAT: {
449            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
450            uint32_t defaultFormat = data.readInt32();
451            status_t result = setDefaultBufferFormat(defaultFormat);
452            reply->writeInt32(result);
453            return NO_ERROR;
454        } break;
455        case SET_CONSUMER_USAGE_BITS: {
456            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
457            uint32_t usage = data.readInt32();
458            status_t result = setConsumerUsageBits(usage);
459            reply->writeInt32(result);
460            return NO_ERROR;
461        } break;
462        case SET_TRANSFORM_HINT: {
463            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
464            uint32_t hint = data.readInt32();
465            status_t result = setTransformHint(hint);
466            reply->writeInt32(result);
467            return NO_ERROR;
468        } break;
469        case DUMP: {
470            CHECK_INTERFACE(IGraphicBufferConsumer, data, reply);
471            String8 result = data.readString8();
472            String8 prefix = data.readString8();
473            static_cast<IGraphicBufferConsumer*>(this)->dump(result, prefix);
474            reply->writeString8(result);
475            return NO_ERROR;
476        }
477    }
478    return BBinder::onTransact(code, data, reply, flags);
479}
480
481}; // namespace android
482