MediaRecorderClient: Use checkService instead of getService for camera am: 58aef30341
am: 7273055732
Change-Id: Ib04f4d76e0d95a24210ddee9424a228b514f891b
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index 003418b..609b00d 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -368,14 +368,21 @@
mRecorder->setListener(listener);
sp<IServiceManager> sm = defaultServiceManager();
- sp<IBinder> binder = sm->getService(String16("media.camera"));
+ // WORKAROUND: We don't know if camera exists here and getService might block for 5 seconds.
+ // Use checkService for camera if we don't know it exists.
+ static std::atomic<bool> sCameraChecked(false); // once true never becomes false.
+ static std::atomic<bool> sCameraVerified(false); // once true never becomes false.
+ sp<IBinder> binder = (sCameraVerified || !sCameraChecked)
+ ? sm->getService(String16("media.camera")) : sm->checkService(String16("media.camera"));
// If the device does not have a camera, do not create a death listener for it.
if (binder != NULL) {
+ sCameraVerified = true;
mCameraDeathListener = new ServiceDeathNotifier(binder, listener,
MediaPlayerService::CAMERA_PROCESS_DEATH);
binder->linkToDeath(mCameraDeathListener);
}
+ sCameraChecked = true;
binder = sm->getService(String16("media.codec"));
mCodecDeathListener = new ServiceDeathNotifier(binder, listener,