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