|
|
|
@ -35,6 +35,7 @@ const char* CameraManagerGlobal::kCameraIdKey = "CameraId";
|
|
|
|
|
const char* CameraManagerGlobal::kPhysicalCameraIdKey = "PhysicalCameraId";
|
|
|
|
|
const char* CameraManagerGlobal::kCallbackFpKey = "CallbackFp";
|
|
|
|
|
const char* CameraManagerGlobal::kContextKey = "CallbackContext";
|
|
|
|
|
const nsecs_t CameraManagerGlobal::kCallbackDrainTimeout = 5000000; // 5 ms
|
|
|
|
|
Mutex CameraManagerGlobal::sLock;
|
|
|
|
|
CameraManagerGlobal* CameraManagerGlobal::sInstance = nullptr;
|
|
|
|
|
|
|
|
|
@ -117,7 +118,7 @@ sp<hardware::ICameraService> CameraManagerGlobal::getCameraServiceLocked() {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
if (mHandler == nullptr) {
|
|
|
|
|
mHandler = new CallbackHandler();
|
|
|
|
|
mHandler = new CallbackHandler(this);
|
|
|
|
|
}
|
|
|
|
|
mCbLooper->registerHandler(mHandler);
|
|
|
|
|
}
|
|
|
|
@ -211,6 +212,9 @@ void CameraManagerGlobal::registerExtendedAvailabilityCallback(
|
|
|
|
|
void CameraManagerGlobal::unregisterExtendedAvailabilityCallback(
|
|
|
|
|
const ACameraManager_ExtendedAvailabilityCallbacks *callback) {
|
|
|
|
|
Mutex::Autolock _l(mLock);
|
|
|
|
|
|
|
|
|
|
drainPendingCallbacksLocked();
|
|
|
|
|
|
|
|
|
|
Callback cb(callback);
|
|
|
|
|
mCallbacks.erase(cb);
|
|
|
|
|
}
|
|
|
|
@ -223,10 +227,32 @@ void CameraManagerGlobal::registerAvailabilityCallback(
|
|
|
|
|
void CameraManagerGlobal::unregisterAvailabilityCallback(
|
|
|
|
|
const ACameraManager_AvailabilityCallbacks *callback) {
|
|
|
|
|
Mutex::Autolock _l(mLock);
|
|
|
|
|
|
|
|
|
|
drainPendingCallbacksLocked();
|
|
|
|
|
|
|
|
|
|
Callback cb(callback);
|
|
|
|
|
mCallbacks.erase(cb);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CameraManagerGlobal::onCallbackCalled() {
|
|
|
|
|
Mutex::Autolock _l(mLock);
|
|
|
|
|
if (mPendingCallbackCnt > 0) {
|
|
|
|
|
mPendingCallbackCnt--;
|
|
|
|
|
}
|
|
|
|
|
mCallbacksCond.signal();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CameraManagerGlobal::drainPendingCallbacksLocked() {
|
|
|
|
|
while (mPendingCallbackCnt > 0) {
|
|
|
|
|
auto res = mCallbacksCond.waitRelative(mLock, kCallbackDrainTimeout);
|
|
|
|
|
if (res != NO_ERROR) {
|
|
|
|
|
ALOGE("%s: Error waiting to drain callbacks: %s(%d)",
|
|
|
|
|
__FUNCTION__, strerror(-res), res);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
|
void CameraManagerGlobal::registerAvailCallback(const T *callback) {
|
|
|
|
|
Mutex::Autolock _l(mLock);
|
|
|
|
@ -250,6 +276,7 @@ void CameraManagerGlobal::registerAvailCallback(const T *callback) {
|
|
|
|
|
msg->setPointer(kCallbackFpKey, (void *) cbFunc);
|
|
|
|
|
msg->setPointer(kContextKey, cb.mContext);
|
|
|
|
|
msg->setString(kCameraIdKey, AString(cameraId));
|
|
|
|
|
mPendingCallbackCnt++;
|
|
|
|
|
msg->post();
|
|
|
|
|
|
|
|
|
|
// Physical camera unavailable callback
|
|
|
|
@ -263,6 +290,7 @@ void CameraManagerGlobal::registerAvailCallback(const T *callback) {
|
|
|
|
|
msg->setPointer(kContextKey, cb.mContext);
|
|
|
|
|
msg->setString(kCameraIdKey, AString(cameraId));
|
|
|
|
|
msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId));
|
|
|
|
|
mPendingCallbackCnt++;
|
|
|
|
|
msg->post();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -323,6 +351,16 @@ bool CameraManagerGlobal::isStatusAvailable(int32_t status) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CameraManagerGlobal::CallbackHandler::onMessageReceived(
|
|
|
|
|
const sp<AMessage> &msg) {
|
|
|
|
|
onMessageReceivedInternal(msg);
|
|
|
|
|
if (msg->what() == kWhatSendSingleCallback ||
|
|
|
|
|
msg->what() == kWhatSendSingleAccessCallback ||
|
|
|
|
|
msg->what() == kWhatSendSinglePhysicalCameraCallback) {
|
|
|
|
|
notifyParent();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CameraManagerGlobal::CallbackHandler::onMessageReceivedInternal(
|
|
|
|
|
const sp<AMessage> &msg) {
|
|
|
|
|
switch (msg->what()) {
|
|
|
|
|
case kWhatSendSingleCallback:
|
|
|
|
@ -405,6 +443,13 @@ void CameraManagerGlobal::CallbackHandler::onMessageReceived(
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CameraManagerGlobal::CallbackHandler::notifyParent() {
|
|
|
|
|
sp<CameraManagerGlobal> parent = mParent.promote();
|
|
|
|
|
if (parent != nullptr) {
|
|
|
|
|
parent->onCallbackCalled();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
binder::Status CameraManagerGlobal::CameraServiceListener::onCameraAccessPrioritiesChanged() {
|
|
|
|
|
sp<CameraManagerGlobal> cm = mCameraManager.promote();
|
|
|
|
|
if (cm != nullptr) {
|
|
|
|
@ -445,6 +490,7 @@ void CameraManagerGlobal::onCameraAccessPrioritiesChanged() {
|
|
|
|
|
if (cbFp != nullptr) {
|
|
|
|
|
msg->setPointer(kCallbackFpKey, (void *) cbFp);
|
|
|
|
|
msg->setPointer(kContextKey, cb.mContext);
|
|
|
|
|
mPendingCallbackCnt++;
|
|
|
|
|
msg->post();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -491,6 +537,7 @@ void CameraManagerGlobal::onStatusChangedLocked(
|
|
|
|
|
msg->setPointer(kCallbackFpKey, (void *) cbFp);
|
|
|
|
|
msg->setPointer(kContextKey, cb.mContext);
|
|
|
|
|
msg->setString(kCameraIdKey, AString(cameraId));
|
|
|
|
|
mPendingCallbackCnt++;
|
|
|
|
|
msg->post();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -545,6 +592,7 @@ void CameraManagerGlobal::onStatusChangedLocked(
|
|
|
|
|
msg->setPointer(kContextKey, cb.mContext);
|
|
|
|
|
msg->setString(kCameraIdKey, AString(cameraId));
|
|
|
|
|
msg->setString(kPhysicalCameraIdKey, AString(physicalCameraId));
|
|
|
|
|
mPendingCallbackCnt++;
|
|
|
|
|
msg->post();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|