1 /* 2 ** Copyright 2008, The Android Open Source Project 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17 //#define LOG_NDEBUG 0 18 #define LOG_TAG "MediaRecorderService" 19 #include <utils/Log.h> 20 21 #include <sys/types.h> 22 #include <sys/stat.h> 23 #include <dirent.h> 24 #include <unistd.h> 25 #include <string.h> 26 #include <cutils/atomic.h> 27 #include <cutils/properties.h> // for property_get 28 #include <binder/IPCThreadState.h> 29 #include <binder/IServiceManager.h> 30 #include <binder/MemoryHeapBase.h> 31 #include <binder/MemoryBase.h> 32 33 #include <utils/String16.h> 34 35 #include <system/audio.h> 36 37 #include "MediaRecorderClient.h" 38 #include "MediaPlayerService.h" 39 40 #include "StagefrightRecorder.h" 41 #include <gui/IGraphicBufferProducer.h> 42 43 namespace android { 44 45 const char* cameraPermission = "android.permission.CAMERA"; 46 const char* recordAudioPermission = "android.permission.RECORD_AUDIO"; 47 48 static bool checkPermission(const char* permissionString) { 49 if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 50 bool ok = checkCallingPermission(String16(permissionString)); 51 if (!ok) ALOGE("Request requires %s", permissionString); 52 return ok; 53 } 54 55 status_t MediaRecorderClient::setInputSurface(const sp<IGraphicBufferConsumer>& surface) 56 { 57 ALOGV("setInputSurface"); 58 Mutex::Autolock lock(mLock); 59 if (mRecorder == NULL) { 60 ALOGE("recorder is not initialized"); 61 return NO_INIT; 62 } 63 return mRecorder->setInputSurface(surface); 64 } 65 66 sp<IGraphicBufferProducer> MediaRecorderClient::querySurfaceMediaSource() 67 { 68 ALOGV("Query SurfaceMediaSource"); 69 Mutex::Autolock lock(mLock); 70 if (mRecorder == NULL) { 71 ALOGE("recorder is not initialized"); 72 return NULL; 73 } 74 return mRecorder->querySurfaceMediaSource(); 75 } 76 77 78 79 status_t MediaRecorderClient::setCamera(const sp<hardware::ICamera>& camera, 80 const sp<ICameraRecordingProxy>& proxy) 81 { 82 ALOGV("setCamera"); 83 Mutex::Autolock lock(mLock); 84 if (mRecorder == NULL) { 85 ALOGE("recorder is not initialized"); 86 return NO_INIT; 87 } 88 return mRecorder->setCamera(camera, proxy); 89 } 90 91 status_t MediaRecorderClient::setPreviewSurface(const sp<IGraphicBufferProducer>& surface) 92 { 93 ALOGV("setPreviewSurface"); 94 Mutex::Autolock lock(mLock); 95 if (mRecorder == NULL) { 96 ALOGE("recorder is not initialized"); 97 return NO_INIT; 98 } 99 return mRecorder->setPreviewSurface(surface); 100 } 101 102 status_t MediaRecorderClient::setVideoSource(int vs) 103 { 104 ALOGV("setVideoSource(%d)", vs); 105 // Check camera permission for sources other than SURFACE 106 if (vs != VIDEO_SOURCE_SURFACE && !checkPermission(cameraPermission)) { 107 return PERMISSION_DENIED; 108 } 109 Mutex::Autolock lock(mLock); 110 if (mRecorder == NULL) { 111 ALOGE("recorder is not initialized"); 112 return NO_INIT; 113 } 114 return mRecorder->setVideoSource((video_source)vs); 115 } 116 117 status_t MediaRecorderClient::setAudioSource(int as) 118 { 119 ALOGV("setAudioSource(%d)", as); 120 if (!checkPermission(recordAudioPermission)) { 121 return PERMISSION_DENIED; 122 } 123 Mutex::Autolock lock(mLock); 124 if (mRecorder == NULL) { 125 ALOGE("recorder is not initialized"); 126 return NO_INIT; 127 } 128 return mRecorder->setAudioSource((audio_source_t)as); 129 } 130 131 status_t MediaRecorderClient::setOutputFormat(int of) 132 { 133 ALOGV("setOutputFormat(%d)", of); 134 Mutex::Autolock lock(mLock); 135 if (mRecorder == NULL) { 136 ALOGE("recorder is not initialized"); 137 return NO_INIT; 138 } 139 return mRecorder->setOutputFormat((output_format)of); 140 } 141 142 status_t MediaRecorderClient::setVideoEncoder(int ve) 143 { 144 ALOGV("setVideoEncoder(%d)", ve); 145 Mutex::Autolock lock(mLock); 146 if (mRecorder == NULL) { 147 ALOGE("recorder is not initialized"); 148 return NO_INIT; 149 } 150 return mRecorder->setVideoEncoder((video_encoder)ve); 151 } 152 153 status_t MediaRecorderClient::setAudioEncoder(int ae) 154 { 155 ALOGV("setAudioEncoder(%d)", ae); 156 Mutex::Autolock lock(mLock); 157 if (mRecorder == NULL) { 158 ALOGE("recorder is not initialized"); 159 return NO_INIT; 160 } 161 return mRecorder->setAudioEncoder((audio_encoder)ae); 162 } 163 164 status_t MediaRecorderClient::setOutputFile(int fd, int64_t offset, int64_t length) 165 { 166 ALOGV("setOutputFile(%d, %lld, %lld)", fd, (long long)offset, (long long)length); 167 Mutex::Autolock lock(mLock); 168 if (mRecorder == NULL) { 169 ALOGE("recorder is not initialized"); 170 return NO_INIT; 171 } 172 return mRecorder->setOutputFile(fd, offset, length); 173 } 174 175 status_t MediaRecorderClient::setVideoSize(int width, int height) 176 { 177 ALOGV("setVideoSize(%dx%d)", width, height); 178 Mutex::Autolock lock(mLock); 179 if (mRecorder == NULL) { 180 ALOGE("recorder is not initialized"); 181 return NO_INIT; 182 } 183 return mRecorder->setVideoSize(width, height); 184 } 185 186 status_t MediaRecorderClient::setVideoFrameRate(int frames_per_second) 187 { 188 ALOGV("setVideoFrameRate(%d)", frames_per_second); 189 Mutex::Autolock lock(mLock); 190 if (mRecorder == NULL) { 191 ALOGE("recorder is not initialized"); 192 return NO_INIT; 193 } 194 return mRecorder->setVideoFrameRate(frames_per_second); 195 } 196 197 status_t MediaRecorderClient::setParameters(const String8& params) { 198 ALOGV("setParameters(%s)", params.string()); 199 Mutex::Autolock lock(mLock); 200 if (mRecorder == NULL) { 201 ALOGE("recorder is not initialized"); 202 return NO_INIT; 203 } 204 return mRecorder->setParameters(params); 205 } 206 207 status_t MediaRecorderClient::prepare() 208 { 209 ALOGV("prepare"); 210 Mutex::Autolock lock(mLock); 211 if (mRecorder == NULL) { 212 ALOGE("recorder is not initialized"); 213 return NO_INIT; 214 } 215 return mRecorder->prepare(); 216 } 217 218 219 status_t MediaRecorderClient::getMaxAmplitude(int* max) 220 { 221 ALOGV("getMaxAmplitude"); 222 Mutex::Autolock lock(mLock); 223 if (mRecorder == NULL) { 224 ALOGE("recorder is not initialized"); 225 return NO_INIT; 226 } 227 return mRecorder->getMaxAmplitude(max); 228 } 229 230 status_t MediaRecorderClient::start() 231 { 232 ALOGV("start"); 233 Mutex::Autolock lock(mLock); 234 if (mRecorder == NULL) { 235 ALOGE("recorder is not initialized"); 236 return NO_INIT; 237 } 238 return mRecorder->start(); 239 240 } 241 242 status_t MediaRecorderClient::stop() 243 { 244 ALOGV("stop"); 245 Mutex::Autolock lock(mLock); 246 if (mRecorder == NULL) { 247 ALOGE("recorder is not initialized"); 248 return NO_INIT; 249 } 250 return mRecorder->stop(); 251 } 252 253 status_t MediaRecorderClient::pause() 254 { 255 ALOGV("pause"); 256 Mutex::Autolock lock(mLock); 257 if (mRecorder == NULL) { 258 ALOGE("recorder is not initialized"); 259 return NO_INIT; 260 } 261 return mRecorder->pause(); 262 263 } 264 265 status_t MediaRecorderClient::resume() 266 { 267 ALOGV("resume"); 268 Mutex::Autolock lock(mLock); 269 if (mRecorder == NULL) { 270 ALOGE("recorder is not initialized"); 271 return NO_INIT; 272 } 273 return mRecorder->resume(); 274 } 275 276 status_t MediaRecorderClient::init() 277 { 278 ALOGV("init"); 279 Mutex::Autolock lock(mLock); 280 if (mRecorder == NULL) { 281 ALOGE("recorder is not initialized"); 282 return NO_INIT; 283 } 284 return mRecorder->init(); 285 } 286 287 status_t MediaRecorderClient::close() 288 { 289 ALOGV("close"); 290 Mutex::Autolock lock(mLock); 291 if (mRecorder == NULL) { 292 ALOGE("recorder is not initialized"); 293 return NO_INIT; 294 } 295 return mRecorder->close(); 296 } 297 298 299 status_t MediaRecorderClient::reset() 300 { 301 ALOGV("reset"); 302 Mutex::Autolock lock(mLock); 303 if (mRecorder == NULL) { 304 ALOGE("recorder is not initialized"); 305 return NO_INIT; 306 } 307 return mRecorder->reset(); 308 } 309 310 status_t MediaRecorderClient::release() 311 { 312 ALOGV("release"); 313 Mutex::Autolock lock(mLock); 314 if (mRecorder != NULL) { 315 delete mRecorder; 316 mRecorder = NULL; 317 wp<MediaRecorderClient> client(this); 318 mMediaPlayerService->removeMediaRecorderClient(client); 319 } 320 return NO_ERROR; 321 } 322 323 MediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t pid, 324 const String16& opPackageName) 325 { 326 ALOGV("Client constructor"); 327 mPid = pid; 328 mRecorder = new StagefrightRecorder(opPackageName); 329 mMediaPlayerService = service; 330 } 331 332 MediaRecorderClient::~MediaRecorderClient() 333 { 334 ALOGV("Client destructor"); 335 release(); 336 } 337 338 MediaRecorderClient::ServiceDeathNotifier::ServiceDeathNotifier( 339 const sp<IBinder>& service, 340 const sp<IMediaRecorderClient>& listener, 341 int which) { 342 mService = service; 343 mListener = listener; 344 mWhich = which; 345 } 346 347 MediaRecorderClient::ServiceDeathNotifier::~ServiceDeathNotifier() { 348 mService->unlinkToDeath(this); 349 } 350 351 void MediaRecorderClient::ServiceDeathNotifier::binderDied(const wp<IBinder>& /*who*/) { 352 sp<IMediaRecorderClient> listener = mListener.promote(); 353 if (listener != NULL) { 354 listener->notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, mWhich); 355 } else { 356 ALOGW("listener for process %d death is gone", mWhich); 357 } 358 } 359 360 status_t MediaRecorderClient::setListener(const sp<IMediaRecorderClient>& listener) 361 { 362 ALOGV("setListener"); 363 Mutex::Autolock lock(mLock); 364 if (mRecorder == NULL) { 365 ALOGE("recorder is not initialized"); 366 return NO_INIT; 367 } 368 mRecorder->setListener(listener); 369 370 sp<IServiceManager> sm = defaultServiceManager(); 371 sp<IBinder> binder = sm->getService(String16("media.camera")); 372 mCameraDeathListener = new ServiceDeathNotifier(binder, listener, 373 MediaPlayerService::CAMERA_PROCESS_DEATH); 374 binder->linkToDeath(mCameraDeathListener); 375 376 binder = sm->getService(String16("media.codec")); 377 mCodecDeathListener = new ServiceDeathNotifier(binder, listener, 378 MediaPlayerService::MEDIACODEC_PROCESS_DEATH); 379 binder->linkToDeath(mCodecDeathListener); 380 381 return OK; 382 } 383 384 status_t MediaRecorderClient::setClientName(const String16& clientName) { 385 ALOGV("setClientName(%s)", String8(clientName).string()); 386 Mutex::Autolock lock(mLock); 387 if (mRecorder == NULL) { 388 ALOGE("recorder is not initialized"); 389 return NO_INIT; 390 } 391 return mRecorder->setClientName(clientName); 392 } 393 394 status_t MediaRecorderClient::dump(int fd, const Vector<String16>& args) { 395 if (mRecorder != NULL) { 396 return mRecorder->dump(fd, args); 397 } 398 return OK; 399 } 400 401 }; // namespace android 402