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