IMediaRecorder.cpp revision c6ac859f5a82ea8642bc6351a45508a15f224f32
1/* 2 ** 3 ** Copyright 2008, The Android Open Source Project 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 21#include <inttypes.h> 22#include <unistd.h> 23 24#include <utils/Log.h> 25#include <binder/Parcel.h> 26#include <camera/ICamera.h> 27#include <media/IMediaRecorderClient.h> 28#include <media/IMediaRecorder.h> 29#include <gui/Surface.h> 30#include <gui/IGraphicBufferProducer.h> 31 32namespace android { 33 34enum { 35 RELEASE = IBinder::FIRST_CALL_TRANSACTION, 36 INIT, 37 CLOSE, 38 QUERY_SURFACE_MEDIASOURCE, 39 RESET, 40 STOP, 41 START, 42 PREPARE, 43 GET_MAX_AMPLITUDE, 44 SET_VIDEO_SOURCE, 45 SET_AUDIO_SOURCE, 46 SET_OUTPUT_FORMAT, 47 SET_VIDEO_ENCODER, 48 SET_AUDIO_ENCODER, 49 SET_OUTPUT_FILE_FD, 50 SET_VIDEO_SIZE, 51 SET_VIDEO_FRAMERATE, 52 SET_PARAMETERS, 53 SET_PREVIEW_SURFACE, 54 SET_CAMERA, 55 SET_LISTENER, 56 SET_CLIENT_NAME 57}; 58 59class BpMediaRecorder: public BpInterface<IMediaRecorder> 60{ 61public: 62 BpMediaRecorder(const sp<IBinder>& impl) 63 : BpInterface<IMediaRecorder>(impl) 64 { 65 } 66 67 status_t setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy) 68 { 69 ALOGV("setCamera(%p,%p)", camera.get(), proxy.get()); 70 Parcel data, reply; 71 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 72 data.writeStrongBinder(IInterface::asBinder(camera)); 73 data.writeStrongBinder(IInterface::asBinder(proxy)); 74 remote()->transact(SET_CAMERA, data, &reply); 75 return reply.readInt32(); 76 } 77 78 sp<IGraphicBufferProducer> querySurfaceMediaSource() 79 { 80 ALOGV("Query SurfaceMediaSource"); 81 Parcel data, reply; 82 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 83 remote()->transact(QUERY_SURFACE_MEDIASOURCE, data, &reply); 84 int returnedNull = reply.readInt32(); 85 if (returnedNull) { 86 return NULL; 87 } 88 return interface_cast<IGraphicBufferProducer>(reply.readStrongBinder()); 89 } 90 91 status_t setPreviewSurface(const sp<IGraphicBufferProducer>& surface) 92 { 93 ALOGV("setPreviewSurface(%p)", surface.get()); 94 Parcel data, reply; 95 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 96 data.writeStrongBinder(IInterface::asBinder(surface)); 97 remote()->transact(SET_PREVIEW_SURFACE, data, &reply); 98 return reply.readInt32(); 99 } 100 101 status_t init() 102 { 103 ALOGV("init"); 104 Parcel data, reply; 105 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 106 remote()->transact(INIT, data, &reply); 107 return reply.readInt32(); 108 } 109 110 status_t setVideoSource(int vs) 111 { 112 ALOGV("setVideoSource(%d)", vs); 113 Parcel data, reply; 114 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 115 data.writeInt32(vs); 116 remote()->transact(SET_VIDEO_SOURCE, data, &reply); 117 return reply.readInt32(); 118 } 119 120 status_t setAudioSource(int as) 121 { 122 ALOGV("setAudioSource(%d)", as); 123 Parcel data, reply; 124 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 125 data.writeInt32(as); 126 remote()->transact(SET_AUDIO_SOURCE, data, &reply); 127 return reply.readInt32(); 128 } 129 130 status_t setOutputFormat(int of) 131 { 132 ALOGV("setOutputFormat(%d)", of); 133 Parcel data, reply; 134 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 135 data.writeInt32(of); 136 remote()->transact(SET_OUTPUT_FORMAT, data, &reply); 137 return reply.readInt32(); 138 } 139 140 status_t setVideoEncoder(int ve) 141 { 142 ALOGV("setVideoEncoder(%d)", ve); 143 Parcel data, reply; 144 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 145 data.writeInt32(ve); 146 remote()->transact(SET_VIDEO_ENCODER, data, &reply); 147 return reply.readInt32(); 148 } 149 150 status_t setAudioEncoder(int ae) 151 { 152 ALOGV("setAudioEncoder(%d)", ae); 153 Parcel data, reply; 154 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 155 data.writeInt32(ae); 156 remote()->transact(SET_AUDIO_ENCODER, data, &reply); 157 return reply.readInt32(); 158 } 159 160 status_t setOutputFile(int fd, int64_t offset, int64_t length) { 161 ALOGV("setOutputFile(%d, %" PRId64 ", %" PRId64 ")", fd, offset, length); 162 Parcel data, reply; 163 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 164 data.writeFileDescriptor(fd); 165 data.writeInt64(offset); 166 data.writeInt64(length); 167 remote()->transact(SET_OUTPUT_FILE_FD, data, &reply); 168 return reply.readInt32(); 169 } 170 171 status_t setVideoSize(int width, int height) 172 { 173 ALOGV("setVideoSize(%dx%d)", width, height); 174 Parcel data, reply; 175 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 176 data.writeInt32(width); 177 data.writeInt32(height); 178 remote()->transact(SET_VIDEO_SIZE, data, &reply); 179 return reply.readInt32(); 180 } 181 182 status_t setVideoFrameRate(int frames_per_second) 183 { 184 ALOGV("setVideoFrameRate(%d)", frames_per_second); 185 Parcel data, reply; 186 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 187 data.writeInt32(frames_per_second); 188 remote()->transact(SET_VIDEO_FRAMERATE, data, &reply); 189 return reply.readInt32(); 190 } 191 192 status_t setParameters(const String8& params) 193 { 194 ALOGV("setParameter(%s)", params.string()); 195 Parcel data, reply; 196 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 197 data.writeString8(params); 198 remote()->transact(SET_PARAMETERS, data, &reply); 199 return reply.readInt32(); 200 } 201 202 status_t setListener(const sp<IMediaRecorderClient>& listener) 203 { 204 ALOGV("setListener(%p)", listener.get()); 205 Parcel data, reply; 206 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 207 data.writeStrongBinder(IInterface::asBinder(listener)); 208 remote()->transact(SET_LISTENER, data, &reply); 209 return reply.readInt32(); 210 } 211 212 status_t setClientName(const String16& clientName) 213 { 214 ALOGV("setClientName(%s)", String8(clientName).string()); 215 Parcel data, reply; 216 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 217 data.writeString16(clientName); 218 remote()->transact(SET_CLIENT_NAME, data, &reply); 219 return reply.readInt32(); 220 } 221 222 status_t prepare() 223 { 224 ALOGV("prepare"); 225 Parcel data, reply; 226 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 227 remote()->transact(PREPARE, data, &reply); 228 return reply.readInt32(); 229 } 230 231 status_t getMaxAmplitude(int* max) 232 { 233 ALOGV("getMaxAmplitude"); 234 Parcel data, reply; 235 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 236 remote()->transact(GET_MAX_AMPLITUDE, data, &reply); 237 *max = reply.readInt32(); 238 return reply.readInt32(); 239 } 240 241 status_t start() 242 { 243 ALOGV("start"); 244 Parcel data, reply; 245 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 246 remote()->transact(START, data, &reply); 247 return reply.readInt32(); 248 } 249 250 status_t stop() 251 { 252 ALOGV("stop"); 253 Parcel data, reply; 254 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 255 remote()->transact(STOP, data, &reply); 256 return reply.readInt32(); 257 } 258 259 status_t reset() 260 { 261 ALOGV("reset"); 262 Parcel data, reply; 263 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 264 remote()->transact(RESET, data, &reply); 265 return reply.readInt32(); 266 } 267 268 status_t close() 269 { 270 ALOGV("close"); 271 Parcel data, reply; 272 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 273 remote()->transact(CLOSE, data, &reply); 274 return reply.readInt32(); 275 } 276 277 status_t release() 278 { 279 ALOGV("release"); 280 Parcel data, reply; 281 data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); 282 remote()->transact(RELEASE, data, &reply); 283 return reply.readInt32(); 284 } 285}; 286 287IMPLEMENT_META_INTERFACE(MediaRecorder, "android.media.IMediaRecorder"); 288 289// ---------------------------------------------------------------------- 290 291status_t BnMediaRecorder::onTransact( 292 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 293{ 294 switch (code) { 295 case RELEASE: { 296 ALOGV("RELEASE"); 297 CHECK_INTERFACE(IMediaRecorder, data, reply); 298 reply->writeInt32(release()); 299 return NO_ERROR; 300 } break; 301 case INIT: { 302 ALOGV("INIT"); 303 CHECK_INTERFACE(IMediaRecorder, data, reply); 304 reply->writeInt32(init()); 305 return NO_ERROR; 306 } break; 307 case CLOSE: { 308 ALOGV("CLOSE"); 309 CHECK_INTERFACE(IMediaRecorder, data, reply); 310 reply->writeInt32(close()); 311 return NO_ERROR; 312 } break; 313 case RESET: { 314 ALOGV("RESET"); 315 CHECK_INTERFACE(IMediaRecorder, data, reply); 316 reply->writeInt32(reset()); 317 return NO_ERROR; 318 } break; 319 case STOP: { 320 ALOGV("STOP"); 321 CHECK_INTERFACE(IMediaRecorder, data, reply); 322 reply->writeInt32(stop()); 323 return NO_ERROR; 324 } break; 325 case START: { 326 ALOGV("START"); 327 CHECK_INTERFACE(IMediaRecorder, data, reply); 328 reply->writeInt32(start()); 329 return NO_ERROR; 330 } break; 331 case PREPARE: { 332 ALOGV("PREPARE"); 333 CHECK_INTERFACE(IMediaRecorder, data, reply); 334 reply->writeInt32(prepare()); 335 return NO_ERROR; 336 } break; 337 case GET_MAX_AMPLITUDE: { 338 ALOGV("GET_MAX_AMPLITUDE"); 339 CHECK_INTERFACE(IMediaRecorder, data, reply); 340 int max = 0; 341 status_t ret = getMaxAmplitude(&max); 342 reply->writeInt32(max); 343 reply->writeInt32(ret); 344 return NO_ERROR; 345 } break; 346 case SET_VIDEO_SOURCE: { 347 ALOGV("SET_VIDEO_SOURCE"); 348 CHECK_INTERFACE(IMediaRecorder, data, reply); 349 int vs = data.readInt32(); 350 reply->writeInt32(setVideoSource(vs)); 351 return NO_ERROR; 352 } break; 353 case SET_AUDIO_SOURCE: { 354 ALOGV("SET_AUDIO_SOURCE"); 355 CHECK_INTERFACE(IMediaRecorder, data, reply); 356 int as = data.readInt32(); 357 reply->writeInt32(setAudioSource(as)); 358 return NO_ERROR; 359 } break; 360 case SET_OUTPUT_FORMAT: { 361 ALOGV("SET_OUTPUT_FORMAT"); 362 CHECK_INTERFACE(IMediaRecorder, data, reply); 363 int of = data.readInt32(); 364 reply->writeInt32(setOutputFormat(of)); 365 return NO_ERROR; 366 } break; 367 case SET_VIDEO_ENCODER: { 368 ALOGV("SET_VIDEO_ENCODER"); 369 CHECK_INTERFACE(IMediaRecorder, data, reply); 370 int ve = data.readInt32(); 371 reply->writeInt32(setVideoEncoder(ve)); 372 return NO_ERROR; 373 } break; 374 case SET_AUDIO_ENCODER: { 375 ALOGV("SET_AUDIO_ENCODER"); 376 CHECK_INTERFACE(IMediaRecorder, data, reply); 377 int ae = data.readInt32(); 378 reply->writeInt32(setAudioEncoder(ae)); 379 return NO_ERROR; 380 381 } break; 382 case SET_OUTPUT_FILE_FD: { 383 ALOGV("SET_OUTPUT_FILE_FD"); 384 CHECK_INTERFACE(IMediaRecorder, data, reply); 385 int fd = dup(data.readFileDescriptor()); 386 int64_t offset = data.readInt64(); 387 int64_t length = data.readInt64(); 388 reply->writeInt32(setOutputFile(fd, offset, length)); 389 ::close(fd); 390 return NO_ERROR; 391 } break; 392 case SET_VIDEO_SIZE: { 393 ALOGV("SET_VIDEO_SIZE"); 394 CHECK_INTERFACE(IMediaRecorder, data, reply); 395 int width = data.readInt32(); 396 int height = data.readInt32(); 397 reply->writeInt32(setVideoSize(width, height)); 398 return NO_ERROR; 399 } break; 400 case SET_VIDEO_FRAMERATE: { 401 ALOGV("SET_VIDEO_FRAMERATE"); 402 CHECK_INTERFACE(IMediaRecorder, data, reply); 403 int frames_per_second = data.readInt32(); 404 reply->writeInt32(setVideoFrameRate(frames_per_second)); 405 return NO_ERROR; 406 } break; 407 case SET_PARAMETERS: { 408 ALOGV("SET_PARAMETER"); 409 CHECK_INTERFACE(IMediaRecorder, data, reply); 410 reply->writeInt32(setParameters(data.readString8())); 411 return NO_ERROR; 412 } break; 413 case SET_LISTENER: { 414 ALOGV("SET_LISTENER"); 415 CHECK_INTERFACE(IMediaRecorder, data, reply); 416 sp<IMediaRecorderClient> listener = 417 interface_cast<IMediaRecorderClient>(data.readStrongBinder()); 418 reply->writeInt32(setListener(listener)); 419 return NO_ERROR; 420 } break; 421 case SET_CLIENT_NAME: { 422 ALOGV("SET_CLIENT_NAME"); 423 CHECK_INTERFACE(IMediaRecorder, data, reply); 424 reply->writeInt32(setClientName(data.readString16())); 425 return NO_ERROR; 426 } 427 case SET_PREVIEW_SURFACE: { 428 ALOGV("SET_PREVIEW_SURFACE"); 429 CHECK_INTERFACE(IMediaRecorder, data, reply); 430 sp<IGraphicBufferProducer> surface = interface_cast<IGraphicBufferProducer>(data.readStrongBinder()); 431 reply->writeInt32(setPreviewSurface(surface)); 432 return NO_ERROR; 433 } break; 434 case SET_CAMERA: { 435 ALOGV("SET_CAMERA"); 436 CHECK_INTERFACE(IMediaRecorder, data, reply); 437 sp<ICamera> camera = interface_cast<ICamera>(data.readStrongBinder()); 438 sp<ICameraRecordingProxy> proxy = 439 interface_cast<ICameraRecordingProxy>(data.readStrongBinder()); 440 reply->writeInt32(setCamera(camera, proxy)); 441 return NO_ERROR; 442 } break; 443 case QUERY_SURFACE_MEDIASOURCE: { 444 ALOGV("QUERY_SURFACE_MEDIASOURCE"); 445 CHECK_INTERFACE(IMediaRecorder, data, reply); 446 // call the mediaserver side to create 447 // a surfacemediasource 448 sp<IGraphicBufferProducer> surfaceMediaSource = querySurfaceMediaSource(); 449 // The mediaserver might have failed to create a source 450 int returnedNull= (surfaceMediaSource == NULL) ? 1 : 0 ; 451 reply->writeInt32(returnedNull); 452 if (!returnedNull) { 453 reply->writeStrongBinder(IInterface::asBinder(surfaceMediaSource)); 454 } 455 return NO_ERROR; 456 } break; 457 default: 458 return BBinder::onTransact(code, data, reply, flags); 459 } 460} 461 462// ---------------------------------------------------------------------------- 463 464}; // namespace android 465