blob: f187bf553954c9976eeefb85380faa4be36ee2f3 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 **
3 ** Copyright 2008, HTC Inc.
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 ** http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17
18//#define LOG_NDEBUG 0
19#define LOG_TAG "IMediaRecorder"
20#include <utils/Log.h>
21#include <utils/Parcel.h>
22#include <ui/ISurface.h>
23#include <ui/ICamera.h>
24#include <media/IMediaPlayerClient.h>
25#include <media/IMediaRecorder.h>
26
27namespace android {
28
29enum {
30 RELEASE = IBinder::FIRST_CALL_TRANSACTION,
31 INIT,
32 CLOSE,
33 RESET,
34 STOP,
35 START,
36 PREPARE,
37 GET_MAX_AMPLITUDE,
38 SET_VIDEO_SOURCE,
39 SET_AUDIO_SOURCE,
40 SET_OUTPUT_FORMAT,
41 SET_VIDEO_ENCODER,
42 SET_AUDIO_ENCODER,
43 SET_OUTPUT_FILE_PATH,
44 SET_OUTPUT_FILE_FD,
45 SET_VIDEO_SIZE,
46 SET_VIDEO_FRAMERATE,
47 SET_PREVIEW_SURFACE,
48 SET_CAMERA,
49 SET_LISTENER
50};
51
52class BpMediaRecorder: public BpInterface<IMediaRecorder>
53{
54public:
55 BpMediaRecorder(const sp<IBinder>& impl)
56 : BpInterface<IMediaRecorder>(impl)
57 {
58 }
59
60 status_t setCamera(const sp<ICamera>& camera)
61 {
62 LOGV("setCamera(%p)", camera.get());
63 Parcel data, reply;
64 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
65 data.writeStrongBinder(camera->asBinder());
66 remote()->transact(SET_CAMERA, data, &reply);
67 return reply.readInt32();
68 }
69
70 status_t setPreviewSurface(const sp<ISurface>& surface)
71 {
72 LOGV("setPreviewSurface(%p)", surface.get());
73 Parcel data, reply;
74 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
75 data.writeStrongBinder(surface->asBinder());
76 remote()->transact(SET_PREVIEW_SURFACE, data, &reply);
77 return reply.readInt32();
78 }
79
80 status_t init()
81 {
82 LOGV("init");
83 Parcel data, reply;
84 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
85 remote()->transact(INIT, data, &reply);
86 return reply.readInt32();
87 }
88
89 status_t setVideoSource(int vs)
90 {
91 LOGV("setVideoSource(%d)", vs);
92 Parcel data, reply;
93 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
94 data.writeInt32(vs);
95 remote()->transact(SET_VIDEO_SOURCE, data, &reply);
96 return reply.readInt32();
97 }
98
99 status_t setAudioSource(int as)
100 {
101 LOGV("setAudioSource(%d)", as);
102 Parcel data, reply;
103 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
104 data.writeInt32(as);
105 remote()->transact(SET_AUDIO_SOURCE, data, &reply);
106 return reply.readInt32();
107 }
108
109 status_t setOutputFormat(int of)
110 {
111 LOGV("setOutputFormat(%d)", of);
112 Parcel data, reply;
113 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
114 data.writeInt32(of);
115 remote()->transact(SET_OUTPUT_FORMAT, data, &reply);
116 return reply.readInt32();
117 }
118
119 status_t setVideoEncoder(int ve)
120 {
121 LOGV("setVideoEncoder(%d)", ve);
122 Parcel data, reply;
123 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
124 data.writeInt32(ve);
125 remote()->transact(SET_VIDEO_ENCODER, data, &reply);
126 return reply.readInt32();
127 }
128
129 status_t setAudioEncoder(int ae)
130 {
131 LOGV("setAudioEncoder(%d)", ae);
132 Parcel data, reply;
133 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
134 data.writeInt32(ae);
135 remote()->transact(SET_AUDIO_ENCODER, data, &reply);
136 return reply.readInt32();
137 }
138
139 status_t setOutputFile(const char* path)
140 {
141 LOGV("setOutputFile(%s)", path);
142 Parcel data, reply;
143 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
144 data.writeCString(path);
145 remote()->transact(SET_OUTPUT_FILE_PATH, data, &reply);
146 return reply.readInt32();
147 }
148
149 status_t setOutputFile(int fd, int64_t offset, int64_t length) {
150 LOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
151 Parcel data, reply;
152 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
153 data.writeFileDescriptor(fd);
154 data.writeInt64(offset);
155 data.writeInt64(length);
156 remote()->transact(SET_OUTPUT_FILE_FD, data, &reply);
157 return reply.readInt32();
158 }
159
160 status_t setVideoSize(int width, int height)
161 {
162 LOGV("setVideoSize(%dx%d)", width, height);
163 Parcel data, reply;
164 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
165 data.writeInt32(width);
166 data.writeInt32(height);
167 remote()->transact(SET_VIDEO_SIZE, data, &reply);
168 return reply.readInt32();
169 }
170
171 status_t setVideoFrameRate(int frames_per_second)
172 {
173 LOGV("setVideoFrameRate(%d)", frames_per_second);
174 Parcel data, reply;
175 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
176 data.writeInt32(frames_per_second);
177 remote()->transact(SET_VIDEO_FRAMERATE, data, &reply);
178 return reply.readInt32();
179 }
180
181 status_t setListener(const sp<IMediaPlayerClient>& listener)
182 {
183 LOGV("setListener(%p)", listener.get());
184 Parcel data, reply;
185 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
186 data.writeStrongBinder(listener->asBinder());
187 remote()->transact(SET_LISTENER, data, &reply);
188 return reply.readInt32();
189 }
190
191 status_t prepare()
192 {
193 LOGV("prepare");
194 Parcel data, reply;
195 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
196 remote()->transact(PREPARE, data, &reply);
197 return reply.readInt32();
198 }
199
200 status_t getMaxAmplitude(int* max)
201 {
202 LOGV("getMaxAmplitude");
203 Parcel data, reply;
204 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
205 remote()->transact(GET_MAX_AMPLITUDE, data, &reply);
206 *max = reply.readInt32();
207 return reply.readInt32();
208 }
209
210 status_t start()
211 {
212 LOGV("start");
213 Parcel data, reply;
214 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
215 remote()->transact(START, data, &reply);
216 return reply.readInt32();
217 }
218
219 status_t stop()
220 {
221 LOGV("stop");
222 Parcel data, reply;
223 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
224 remote()->transact(STOP, data, &reply);
225 return reply.readInt32();
226 }
227
228 status_t reset()
229 {
230 LOGV("reset");
231 Parcel data, reply;
232 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
233 remote()->transact(RESET, data, &reply);
234 return reply.readInt32();
235 }
236
237 status_t close()
238 {
239 LOGV("close");
240 Parcel data, reply;
241 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
242 remote()->transact(CLOSE, data, &reply);
243 return reply.readInt32();
244 }
245
246 status_t release()
247 {
248 LOGV("release");
249 Parcel data, reply;
250 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor());
251 remote()->transact(RELEASE, data, &reply);
252 return reply.readInt32();
253 }
254};
255
256IMPLEMENT_META_INTERFACE(MediaRecorder, "android.hardware.IMediaRecorder");
257
258// ----------------------------------------------------------------------
259
260#define CHECK_INTERFACE(interface, data, reply) \
261 do { if (!data.enforceInterface(interface::getInterfaceDescriptor())) { \
262 LOGW("Call incorrectly routed to " #interface); \
263 return PERMISSION_DENIED; \
264 } } while (0)
265
266status_t BnMediaRecorder::onTransact(
267 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
268{
269 switch(code) {
270 case RELEASE: {
271 LOGV("RELEASE");
272 CHECK_INTERFACE(IMediaRecorder, data, reply);
273 reply->writeInt32(release());
274 return NO_ERROR;
275 } break;
276 case INIT: {
277 LOGV("INIT");
278 CHECK_INTERFACE(IMediaRecorder, data, reply);
279 reply->writeInt32(init());
280 return NO_ERROR;
281 } break;
282 case CLOSE: {
283 LOGV("CLOSE");
284 CHECK_INTERFACE(IMediaRecorder, data, reply);
285 reply->writeInt32(close());
286 return NO_ERROR;
287 } break;
288 case RESET: {
289 LOGV("RESET");
290 CHECK_INTERFACE(IMediaRecorder, data, reply);
291 reply->writeInt32(reset());
292 return NO_ERROR;
293 } break;
294 case STOP: {
295 LOGV("STOP");
296 CHECK_INTERFACE(IMediaRecorder, data, reply);
297 reply->writeInt32(stop());
298 return NO_ERROR;
299 } break;
300 case START: {
301 LOGV("START");
302 CHECK_INTERFACE(IMediaRecorder, data, reply);
303 reply->writeInt32(start());
304 return NO_ERROR;
305 } break;
306 case PREPARE: {
307 LOGV("PREPARE");
308 CHECK_INTERFACE(IMediaRecorder, data, reply);
309 reply->writeInt32(prepare());
310 return NO_ERROR;
311 } break;
312 case GET_MAX_AMPLITUDE: {
313 LOGV("GET_MAX_AMPLITUDE");
314 CHECK_INTERFACE(IMediaRecorder, data, reply);
315 int max = 0;
316 status_t ret = getMaxAmplitude(&max);
317 reply->writeInt32(max);
318 reply->writeInt32(ret);
319 return NO_ERROR;
320 } break;
321 case SET_VIDEO_SOURCE: {
322 LOGV("SET_VIDEO_SOURCE");
323 CHECK_INTERFACE(IMediaRecorder, data, reply);
324 int vs = data.readInt32();
325 reply->writeInt32(setVideoSource(vs));
326 return NO_ERROR;
327 } break;
328 case SET_AUDIO_SOURCE: {
329 LOGV("SET_AUDIO_SOURCE");
330 CHECK_INTERFACE(IMediaRecorder, data, reply);
331 int as = data.readInt32();
332 reply->writeInt32(setAudioSource(as));
333 return NO_ERROR;
334 } break;
335 case SET_OUTPUT_FORMAT: {
336 LOGV("SET_OUTPUT_FORMAT");
337 CHECK_INTERFACE(IMediaRecorder, data, reply);
338 int of = data.readInt32();
339 reply->writeInt32(setOutputFormat(of));
340 return NO_ERROR;
341 } break;
342 case SET_VIDEO_ENCODER: {
343 LOGV("SET_VIDEO_ENCODER");
344 CHECK_INTERFACE(IMediaRecorder, data, reply);
345 int ve = data.readInt32();
346 reply->writeInt32(setVideoEncoder(ve));
347 return NO_ERROR;
348 } break;
349 case SET_AUDIO_ENCODER: {
350 LOGV("SET_AUDIO_ENCODER");
351 CHECK_INTERFACE(IMediaRecorder, data, reply);
352 int ae = data.readInt32();
353 reply->writeInt32(setAudioEncoder(ae));
354 return NO_ERROR;
355
356 } break;
357 case SET_OUTPUT_FILE_PATH: {
358 LOGV("SET_OUTPUT_FILE_PATH");
359 CHECK_INTERFACE(IMediaRecorder, data, reply);
360 const char* path = data.readCString();
361 reply->writeInt32(setOutputFile(path));
362 return NO_ERROR;
363 } break;
364 case SET_OUTPUT_FILE_FD: {
365 LOGV("SET_OUTPUT_FILE_FD");
366 CHECK_INTERFACE(IMediaRecorder, data, reply);
367 int fd = dup(data.readFileDescriptor());
368 int64_t offset = data.readInt64();
369 int64_t length = data.readInt64();
370 reply->writeInt32(setOutputFile(fd, offset, length));
371 return NO_ERROR;
372 } break;
373 case SET_VIDEO_SIZE: {
374 LOGV("SET_VIDEO_SIZE");
375 CHECK_INTERFACE(IMediaRecorder, data, reply);
376 int width = data.readInt32();
377 int height = data.readInt32();
378 reply->writeInt32(setVideoSize(width, height));
379 return NO_ERROR;
380 } break;
381 case SET_VIDEO_FRAMERATE: {
382 LOGV("SET_VIDEO_FRAMERATE");
383 CHECK_INTERFACE(IMediaRecorder, data, reply);
384 int frames_per_second = data.readInt32();
385 reply->writeInt32(setVideoFrameRate(frames_per_second));
386 return NO_ERROR;
387 } break;
388 case SET_LISTENER: {
389 LOGV("SET_LISTENER");
390 CHECK_INTERFACE(IMediaRecorder, data, reply);
391 sp<IMediaPlayerClient> listener =
392 interface_cast<IMediaPlayerClient>(data.readStrongBinder());
393 reply->writeInt32(setListener(listener));
394 return NO_ERROR;
395 } break;
396 case SET_PREVIEW_SURFACE: {
397 LOGV("SET_PREVIEW_SURFACE");
398 CHECK_INTERFACE(IMediaRecorder, data, reply);
399 sp<ISurface> surface = interface_cast<ISurface>(data.readStrongBinder());
400 reply->writeInt32(setPreviewSurface(surface));
401 return NO_ERROR;
402 } break;
403 case SET_CAMERA: {
404 LOGV("SET_CAMERA");
405 CHECK_INTERFACE(IMediaRecorder, data, reply);
406 sp<ICamera> camera = interface_cast<ICamera>(data.readStrongBinder());
407 reply->writeInt32(setCamera(camera));
408 return NO_ERROR;
409 } break;
410 default:
411 return BBinder::onTransact(code, data, reply, flags);
412 }
413}
414
415// ----------------------------------------------------------------------------
416
417}; // namespace android