IMediaRecorder.cpp revision 40bc906252974d0b389ae4a147232d0c9a97193f
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, 293 uint32_t flags) 294{ 295 switch (code) { 296 case RELEASE: { 297 ALOGV("RELEASE"); 298 CHECK_INTERFACE(IMediaRecorder, data, reply); 299 reply->writeInt32(release()); 300 return NO_ERROR; 301 } break; 302 case INIT: { 303 ALOGV("INIT"); 304 CHECK_INTERFACE(IMediaRecorder, data, reply); 305 reply->writeInt32(init()); 306 return NO_ERROR; 307 } break; 308 case CLOSE: { 309 ALOGV("CLOSE"); 310 CHECK_INTERFACE(IMediaRecorder, data, reply); 311 reply->writeInt32(close()); 312 return NO_ERROR; 313 } break; 314 case RESET: { 315 ALOGV("RESET"); 316 CHECK_INTERFACE(IMediaRecorder, data, reply); 317 reply->writeInt32(reset()); 318 return NO_ERROR; 319 } break; 320 case STOP: { 321 ALOGV("STOP"); 322 CHECK_INTERFACE(IMediaRecorder, data, reply); 323 reply->writeInt32(stop()); 324 return NO_ERROR; 325 } break; 326 case START: { 327 ALOGV("START"); 328 CHECK_INTERFACE(IMediaRecorder, data, reply); 329 reply->writeInt32(start()); 330 return NO_ERROR; 331 } break; 332 case PREPARE: { 333 ALOGV("PREPARE"); 334 CHECK_INTERFACE(IMediaRecorder, data, reply); 335 reply->writeInt32(prepare()); 336 return NO_ERROR; 337 } break; 338 case GET_MAX_AMPLITUDE: { 339 ALOGV("GET_MAX_AMPLITUDE"); 340 CHECK_INTERFACE(IMediaRecorder, data, reply); 341 int max = 0; 342 status_t ret = getMaxAmplitude(&max); 343 reply->writeInt32(max); 344 reply->writeInt32(ret); 345 return NO_ERROR; 346 } break; 347 case SET_VIDEO_SOURCE: { 348 ALOGV("SET_VIDEO_SOURCE"); 349 CHECK_INTERFACE(IMediaRecorder, data, reply); 350 int vs = data.readInt32(); 351 reply->writeInt32(setVideoSource(vs)); 352 return NO_ERROR; 353 } break; 354 case SET_AUDIO_SOURCE: { 355 ALOGV("SET_AUDIO_SOURCE"); 356 CHECK_INTERFACE(IMediaRecorder, data, reply); 357 int as = data.readInt32(); 358 reply->writeInt32(setAudioSource(as)); 359 return NO_ERROR; 360 } break; 361 case SET_OUTPUT_FORMAT: { 362 ALOGV("SET_OUTPUT_FORMAT"); 363 CHECK_INTERFACE(IMediaRecorder, data, reply); 364 int of = data.readInt32(); 365 reply->writeInt32(setOutputFormat(of)); 366 return NO_ERROR; 367 } break; 368 case SET_VIDEO_ENCODER: { 369 ALOGV("SET_VIDEO_ENCODER"); 370 CHECK_INTERFACE(IMediaRecorder, data, reply); 371 int ve = data.readInt32(); 372 reply->writeInt32(setVideoEncoder(ve)); 373 return NO_ERROR; 374 } break; 375 case SET_AUDIO_ENCODER: { 376 ALOGV("SET_AUDIO_ENCODER"); 377 CHECK_INTERFACE(IMediaRecorder, data, reply); 378 int ae = data.readInt32(); 379 reply->writeInt32(setAudioEncoder(ae)); 380 return NO_ERROR; 381 382 } break; 383 case SET_OUTPUT_FILE_FD: { 384 ALOGV("SET_OUTPUT_FILE_FD"); 385 CHECK_INTERFACE(IMediaRecorder, data, reply); 386 int fd = dup(data.readFileDescriptor()); 387 int64_t offset = data.readInt64(); 388 int64_t length = data.readInt64(); 389 reply->writeInt32(setOutputFile(fd, offset, length)); 390 ::close(fd); 391 return NO_ERROR; 392 } break; 393 case SET_VIDEO_SIZE: { 394 ALOGV("SET_VIDEO_SIZE"); 395 CHECK_INTERFACE(IMediaRecorder, data, reply); 396 int width = data.readInt32(); 397 int height = data.readInt32(); 398 reply->writeInt32(setVideoSize(width, height)); 399 return NO_ERROR; 400 } break; 401 case SET_VIDEO_FRAMERATE: { 402 ALOGV("SET_VIDEO_FRAMERATE"); 403 CHECK_INTERFACE(IMediaRecorder, data, reply); 404 int frames_per_second = data.readInt32(); 405 reply->writeInt32(setVideoFrameRate(frames_per_second)); 406 return NO_ERROR; 407 } break; 408 case SET_PARAMETERS: { 409 ALOGV("SET_PARAMETER"); 410 CHECK_INTERFACE(IMediaRecorder, data, reply); 411 reply->writeInt32(setParameters(data.readString8())); 412 return NO_ERROR; 413 } break; 414 case SET_LISTENER: { 415 ALOGV("SET_LISTENER"); 416 CHECK_INTERFACE(IMediaRecorder, data, reply); 417 sp<IMediaRecorderClient> listener = 418 interface_cast<IMediaRecorderClient>(data.readStrongBinder()); 419 reply->writeInt32(setListener(listener)); 420 return NO_ERROR; 421 } break; 422 case SET_CLIENT_NAME: { 423 ALOGV("SET_CLIENT_NAME"); 424 CHECK_INTERFACE(IMediaRecorder, data, reply); 425 reply->writeInt32(setClientName(data.readString16())); 426 return NO_ERROR; 427 } 428 case SET_PREVIEW_SURFACE: { 429 ALOGV("SET_PREVIEW_SURFACE"); 430 CHECK_INTERFACE(IMediaRecorder, data, reply); 431 sp<IGraphicBufferProducer> surface = interface_cast<IGraphicBufferProducer>( 432 data.readStrongBinder()); 433 reply->writeInt32(setPreviewSurface(surface)); 434 return NO_ERROR; 435 } break; 436 case SET_CAMERA: { 437 ALOGV("SET_CAMERA"); 438 CHECK_INTERFACE(IMediaRecorder, data, reply); 439 sp<ICamera> camera = interface_cast<ICamera>(data.readStrongBinder()); 440 sp<ICameraRecordingProxy> proxy = 441 interface_cast<ICameraRecordingProxy>(data.readStrongBinder()); 442 reply->writeInt32(setCamera(camera, proxy)); 443 return NO_ERROR; 444 } break; 445 case QUERY_SURFACE_MEDIASOURCE: { 446 ALOGV("QUERY_SURFACE_MEDIASOURCE"); 447 CHECK_INTERFACE(IMediaRecorder, data, reply); 448 // call the mediaserver side to create 449 // a surfacemediasource 450 sp<IGraphicBufferProducer> surfaceMediaSource = querySurfaceMediaSource(); 451 // The mediaserver might have failed to create a source 452 int returnedNull= (surfaceMediaSource == NULL) ? 1 : 0 ; 453 reply->writeInt32(returnedNull); 454 if (!returnedNull) { 455 reply->writeStrongBinder(IInterface::asBinder(surfaceMediaSource)); 456 } 457 return NO_ERROR; 458 } break; 459 default: 460 return BBinder::onTransact(code, data, reply, flags); 461 } 462} 463 464// ---------------------------------------------------------------------------- 465 466} // namespace android 467