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