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