blob: fcea8ec70121b7c332808699660a9215b05bdac9 [file] [log] [blame]
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mathias Agopian076b1cc2009-04-10 14:24:30 -070017#define LOG_TAG "ISurface"
18
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080019#include <stdio.h>
20#include <stdint.h>
21#include <sys/types.h>
22
23#include <utils/Parcel.h>
24#include <utils/IMemory.h>
25
26#include <ui/ISurface.h>
27#include <ui/Overlay.h>
Mathias Agopian076b1cc2009-04-10 14:24:30 -070028#include <ui/Surface.h>
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080029
30
31namespace android {
32
Mathias Agopian076b1cc2009-04-10 14:24:30 -070033// ----------------------------------------------------------------------
34
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080035ISurface::BufferHeap::BufferHeap()
36 : w(0), h(0), hor_stride(0), ver_stride(0), format(0),
37 transform(0), flags(0)
38{
39}
40
41ISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
42 int32_t hor_stride, int32_t ver_stride,
43 PixelFormat format, const sp<IMemoryHeap>& heap)
44 : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
45 format(format), transform(0), flags(0), heap(heap)
46{
47}
48
49ISurface::BufferHeap::BufferHeap(uint32_t w, uint32_t h,
50 int32_t hor_stride, int32_t ver_stride,
51 PixelFormat format, uint32_t transform, uint32_t flags,
52 const sp<IMemoryHeap>& heap)
53 : w(w), h(h), hor_stride(hor_stride), ver_stride(ver_stride),
54 format(format), transform(transform), flags(flags), heap(heap)
55{
56}
57
58
59ISurface::BufferHeap::~BufferHeap()
60{
61}
62
Mathias Agopian076b1cc2009-04-10 14:24:30 -070063// ----------------------------------------------------------------------
64
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080065class BpSurface : public BpInterface<ISurface>
66{
67public:
68 BpSurface(const sp<IBinder>& impl)
69 : BpInterface<ISurface>(impl)
70 {
71 }
72
Mathias Agopian076b1cc2009-04-10 14:24:30 -070073 virtual sp<SurfaceBuffer> getBuffer()
74 {
75 Parcel data, reply;
76 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
77 remote()->transact(GET_BUFFER, data, &reply);
78 sp<SurfaceBuffer> buffer = new SurfaceBuffer(reply);
79 return buffer;
80 }
81
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -080082 virtual status_t registerBuffers(const BufferHeap& buffers)
83 {
84 Parcel data, reply;
85 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
86 data.writeInt32(buffers.w);
87 data.writeInt32(buffers.h);
88 data.writeInt32(buffers.hor_stride);
89 data.writeInt32(buffers.ver_stride);
90 data.writeInt32(buffers.format);
91 data.writeInt32(buffers.transform);
92 data.writeInt32(buffers.flags);
93 data.writeStrongBinder(buffers.heap->asBinder());
94 remote()->transact(REGISTER_BUFFERS, data, &reply);
95 status_t result = reply.readInt32();
96 return result;
97 }
98
99 virtual void postBuffer(ssize_t offset)
100 {
101 Parcel data, reply;
102 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
103 data.writeInt32(offset);
104 remote()->transact(POST_BUFFER, data, &reply, IBinder::FLAG_ONEWAY);
105 }
106
107 virtual void unregisterBuffers()
108 {
109 Parcel data, reply;
110 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
111 remote()->transact(UNREGISTER_BUFFERS, data, &reply);
112 }
113
114 virtual sp<OverlayRef> createOverlay(
115 uint32_t w, uint32_t h, int32_t format)
116 {
117 Parcel data, reply;
118 data.writeInterfaceToken(ISurface::getInterfaceDescriptor());
119 data.writeInt32(w);
120 data.writeInt32(h);
121 data.writeInt32(format);
122 remote()->transact(CREATE_OVERLAY, data, &reply);
123 return OverlayRef::readFromParcel(reply);
124 }
125};
126
127IMPLEMENT_META_INTERFACE(Surface, "android.ui.ISurface");
128
129// ----------------------------------------------------------------------
130
131#define CHECK_INTERFACE(interface, data, reply) \
132 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
133 LOGW("Call incorrectly routed to " #interface); \
134 return PERMISSION_DENIED; \
135 } } while (0)
136
137status_t BnSurface::onTransact(
138 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
139{
140 switch(code) {
Mathias Agopian076b1cc2009-04-10 14:24:30 -0700141 case GET_BUFFER: {
142 CHECK_INTERFACE(ISurface, data, reply);
143 sp<SurfaceBuffer> buffer(getBuffer());
144 return SurfaceBuffer::writeToParcel(reply, buffer.get());
145 }
The Android Open Source Projectedbf3b62009-03-03 19:31:44 -0800146 case REGISTER_BUFFERS: {
147 CHECK_INTERFACE(ISurface, data, reply);
148 BufferHeap buffer;
149 buffer.w = data.readInt32();
150 buffer.h = data.readInt32();
151 buffer.hor_stride = data.readInt32();
152 buffer.ver_stride= data.readInt32();
153 buffer.format = data.readInt32();
154 buffer.transform = data.readInt32();
155 buffer.flags = data.readInt32();
156 buffer.heap = interface_cast<IMemoryHeap>(data.readStrongBinder());
157 status_t err = registerBuffers(buffer);
158 reply->writeInt32(err);
159 return NO_ERROR;
160 } break;
161 case UNREGISTER_BUFFERS: {
162 CHECK_INTERFACE(ISurface, data, reply);
163 unregisterBuffers();
164 return NO_ERROR;
165 } break;
166 case POST_BUFFER: {
167 CHECK_INTERFACE(ISurface, data, reply);
168 ssize_t offset = data.readInt32();
169 postBuffer(offset);
170 return NO_ERROR;
171 } break;
172 case CREATE_OVERLAY: {
173 CHECK_INTERFACE(ISurface, data, reply);
174 int w = data.readInt32();
175 int h = data.readInt32();
176 int f = data.readInt32();
177 sp<OverlayRef> o = createOverlay(w, h, f);
178 return OverlayRef::writeToParcel(reply, o);
179 } break;
180 default:
181 return BBinder::onTransact(code, data, reply, flags);
182 }
183}
184
185}; // namespace android