Loading services/camera/libcameraservice/CameraService.cpp +59 −0 Original line number Diff line number Diff line Loading @@ -2073,6 +2073,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& } client->setImageDumpMask(mImageDumpMask); client->setStreamUseCaseOverrides(mStreamUseCaseOverrides); } // lock is destroyed, allow further connect calls // Important: release the mutex here so the client can call back into the service from its Loading Loading @@ -4451,6 +4452,13 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { String8 activeClientString = mActiveClientManager.toString(); dprintf(fd, "Active Camera Clients:\n%s", activeClientString.string()); dprintf(fd, "Allowed user IDs: %s\n", toString(mAllowedUsers).string()); if (mStreamUseCaseOverrides.size() > 0) { dprintf(fd, "Active stream use case overrides:"); for (int64_t useCaseOverride : mStreamUseCaseOverrides) { dprintf(fd, " %" PRId64, useCaseOverride); } dprintf(fd, "\n"); } dumpEventLog(fd); Loading Loading @@ -4954,6 +4962,11 @@ status_t CameraService::shellCommand(int in, int out, int err, const Vector<Stri return handleGetImageDumpMask(out); } else if (args.size() >= 2 && args[0] == String16("set-camera-mute")) { return handleSetCameraMute(args); } else if (args.size() >= 2 && args[0] == String16("set-stream-use-case-override")) { return handleSetStreamUseCaseOverrides(args); } else if (args.size() >= 1 && args[0] == String16("clear-stream-use-case-override")) { handleClearStreamUseCaseOverrides(); return OK; } else if (args.size() >= 2 && args[0] == String16("watch")) { return handleWatchCommand(args, in, out); } else if (args.size() >= 2 && args[0] == String16("set-watchdog")) { Loading Loading @@ -5160,6 +5173,43 @@ status_t CameraService::handleSetCameraMute(const Vector<String16>& args) { return OK; } status_t CameraService::handleSetStreamUseCaseOverrides(const Vector<String16>& args) { std::vector<int64_t> useCasesOverride; for (size_t i = 1; i < args.size(); i++) { int64_t useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT; String8 arg8 = String8(args[i]); if (arg8 == "DEFAULT") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT; } else if (arg8 == "PREVIEW") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW; } else if (arg8 == "STILL_CAPTURE") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE; } else if (arg8 == "VIDEO_RECORD") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD; } else if (arg8 == "PREVIEW_VIDEO_STILL") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL; } else if (arg8 == "VIDEO_CALL") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL; } else if (arg8 == "CROPPED_RAW") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW; } else { ALOGE("%s: Invalid stream use case %s", __FUNCTION__, arg8.c_str()); return BAD_VALUE; } useCasesOverride.push_back(useCase); } Mutex::Autolock lock(mServiceLock); mStreamUseCaseOverrides = std::move(useCasesOverride); return OK; } void CameraService::handleClearStreamUseCaseOverrides() { Mutex::Autolock lock(mServiceLock); mStreamUseCaseOverrides.clear(); } status_t CameraService::handleWatchCommand(const Vector<String16>& args, int inFd, int outFd) { if (args.size() >= 3 && args[1] == String16("start")) { return startWatchingTags(args, outFd); Loading Loading @@ -5517,6 +5567,15 @@ status_t CameraService::printHelp(int out) { " Valid values 0=OFF, 1=ON for JPEG\n" " get-image-dump-mask returns the current image-dump-mask value\n" " set-camera-mute <0/1> enable or disable camera muting\n" " set-stream-use-case-override <usecase1> <usecase2> ... override stream use cases\n" " Use cases applied in descending resolutions. So usecase1 is assigned to the\n" " largest resolution, usecase2 is assigned to the 2nd largest resolution, and so\n" " on. In case the number of usecases is smaller than the number of streams, the\n" " last use case is assigned to all the remaining streams. In case of multiple\n" " streams with the same resolution, the tie-breaker is (JPEG, RAW, YUV, and PRIV)\n" " Valid values are (case sensitive): DEFAULT, PREVIEW, STILL_CAPTURE, VIDEO_RECORD,\n" " PREVIEW_VIDEO_STILL, VIDEO_CALL, CROPPED_RAW\n" " clear-stream-use-case-override clear the stream use case override\n" " watch <start|stop|dump|print|clear> manages tag monitoring in connected clients\n" " help print this message\n"); } Loading services/camera/libcameraservice/CameraService.h +16 −0 Original line number Diff line number Diff line Loading @@ -355,6 +355,13 @@ public: // Set Camera service watchdog virtual status_t setCameraServiceWatchdog(bool enabled) = 0; // Set stream use case overrides virtual void setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides) = 0; // Clear stream use case overrides virtual void clearStreamUseCaseOverrides() = 0; // The injection camera session to replace the internal camera // session. virtual status_t injectCamera(const String8& injectedCamId, Loading Loading @@ -1257,6 +1264,12 @@ private: // Set the camera mute state status_t handleSetCameraMute(const Vector<String16>& args); // Set the stream use case overrides status_t handleSetStreamUseCaseOverrides(const Vector<String16>& args); // Clear the stream use case overrides void handleClearStreamUseCaseOverrides(); // Handle 'watch' command as passed through 'cmd' status_t handleWatchCommand(const Vector<String16> &args, int inFd, int outFd); Loading Loading @@ -1355,6 +1368,9 @@ private: // Camera Service watchdog flag bool mCameraServiceWatchdogEnabled = true; // Current stream use case overrides std::vector<int64_t> mStreamUseCaseOverrides; /** * A listener class that implements the IBinder::DeathRecipient interface * for use to call back the error state injected by the external camera, and Loading services/camera/libcameraservice/api1/Camera2Client.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -2380,6 +2380,15 @@ status_t Camera2Client::setCameraMute(bool enabled) { return mDevice->setCameraMute(enabled); } void Camera2Client::setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides) { mDevice->setStreamUseCaseOverrides(useCaseOverrides); } void Camera2Client::clearStreamUseCaseOverrides() { mDevice->clearStreamUseCaseOverrides(); } status_t Camera2Client::waitUntilCurrentRequestIdLocked() { int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); if (activeRequestId != 0) { Loading services/camera/libcameraservice/api1/Camera2Client.h +4 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,10 @@ public: virtual status_t setCameraServiceWatchdog(bool enabled); virtual void setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides); virtual void clearStreamUseCaseOverrides(); /** * Interface used by CameraService */ Loading services/camera/libcameraservice/api2/CameraDeviceClient.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -1781,6 +1781,15 @@ status_t CameraDeviceClient::setCameraMute(bool enabled) { return mDevice->setCameraMute(enabled); } void CameraDeviceClient::setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides) { mDevice->setStreamUseCaseOverrides(useCaseOverrides); } void CameraDeviceClient::clearStreamUseCaseOverrides() { mDevice->clearStreamUseCaseOverrides(); } binder::Status CameraDeviceClient::switchToOffline( const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, const std::vector<int>& offlineOutputIds, Loading Loading
services/camera/libcameraservice/CameraService.cpp +59 −0 Original line number Diff line number Diff line Loading @@ -2073,6 +2073,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8& } client->setImageDumpMask(mImageDumpMask); client->setStreamUseCaseOverrides(mStreamUseCaseOverrides); } // lock is destroyed, allow further connect calls // Important: release the mutex here so the client can call back into the service from its Loading Loading @@ -4451,6 +4452,13 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { String8 activeClientString = mActiveClientManager.toString(); dprintf(fd, "Active Camera Clients:\n%s", activeClientString.string()); dprintf(fd, "Allowed user IDs: %s\n", toString(mAllowedUsers).string()); if (mStreamUseCaseOverrides.size() > 0) { dprintf(fd, "Active stream use case overrides:"); for (int64_t useCaseOverride : mStreamUseCaseOverrides) { dprintf(fd, " %" PRId64, useCaseOverride); } dprintf(fd, "\n"); } dumpEventLog(fd); Loading Loading @@ -4954,6 +4962,11 @@ status_t CameraService::shellCommand(int in, int out, int err, const Vector<Stri return handleGetImageDumpMask(out); } else if (args.size() >= 2 && args[0] == String16("set-camera-mute")) { return handleSetCameraMute(args); } else if (args.size() >= 2 && args[0] == String16("set-stream-use-case-override")) { return handleSetStreamUseCaseOverrides(args); } else if (args.size() >= 1 && args[0] == String16("clear-stream-use-case-override")) { handleClearStreamUseCaseOverrides(); return OK; } else if (args.size() >= 2 && args[0] == String16("watch")) { return handleWatchCommand(args, in, out); } else if (args.size() >= 2 && args[0] == String16("set-watchdog")) { Loading Loading @@ -5160,6 +5173,43 @@ status_t CameraService::handleSetCameraMute(const Vector<String16>& args) { return OK; } status_t CameraService::handleSetStreamUseCaseOverrides(const Vector<String16>& args) { std::vector<int64_t> useCasesOverride; for (size_t i = 1; i < args.size(); i++) { int64_t useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT; String8 arg8 = String8(args[i]); if (arg8 == "DEFAULT") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT; } else if (arg8 == "PREVIEW") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW; } else if (arg8 == "STILL_CAPTURE") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_STILL_CAPTURE; } else if (arg8 == "VIDEO_RECORD") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_RECORD; } else if (arg8 == "PREVIEW_VIDEO_STILL") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_PREVIEW_VIDEO_STILL; } else if (arg8 == "VIDEO_CALL") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL; } else if (arg8 == "CROPPED_RAW") { useCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_CROPPED_RAW; } else { ALOGE("%s: Invalid stream use case %s", __FUNCTION__, arg8.c_str()); return BAD_VALUE; } useCasesOverride.push_back(useCase); } Mutex::Autolock lock(mServiceLock); mStreamUseCaseOverrides = std::move(useCasesOverride); return OK; } void CameraService::handleClearStreamUseCaseOverrides() { Mutex::Autolock lock(mServiceLock); mStreamUseCaseOverrides.clear(); } status_t CameraService::handleWatchCommand(const Vector<String16>& args, int inFd, int outFd) { if (args.size() >= 3 && args[1] == String16("start")) { return startWatchingTags(args, outFd); Loading Loading @@ -5517,6 +5567,15 @@ status_t CameraService::printHelp(int out) { " Valid values 0=OFF, 1=ON for JPEG\n" " get-image-dump-mask returns the current image-dump-mask value\n" " set-camera-mute <0/1> enable or disable camera muting\n" " set-stream-use-case-override <usecase1> <usecase2> ... override stream use cases\n" " Use cases applied in descending resolutions. So usecase1 is assigned to the\n" " largest resolution, usecase2 is assigned to the 2nd largest resolution, and so\n" " on. In case the number of usecases is smaller than the number of streams, the\n" " last use case is assigned to all the remaining streams. In case of multiple\n" " streams with the same resolution, the tie-breaker is (JPEG, RAW, YUV, and PRIV)\n" " Valid values are (case sensitive): DEFAULT, PREVIEW, STILL_CAPTURE, VIDEO_RECORD,\n" " PREVIEW_VIDEO_STILL, VIDEO_CALL, CROPPED_RAW\n" " clear-stream-use-case-override clear the stream use case override\n" " watch <start|stop|dump|print|clear> manages tag monitoring in connected clients\n" " help print this message\n"); } Loading
services/camera/libcameraservice/CameraService.h +16 −0 Original line number Diff line number Diff line Loading @@ -355,6 +355,13 @@ public: // Set Camera service watchdog virtual status_t setCameraServiceWatchdog(bool enabled) = 0; // Set stream use case overrides virtual void setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides) = 0; // Clear stream use case overrides virtual void clearStreamUseCaseOverrides() = 0; // The injection camera session to replace the internal camera // session. virtual status_t injectCamera(const String8& injectedCamId, Loading Loading @@ -1257,6 +1264,12 @@ private: // Set the camera mute state status_t handleSetCameraMute(const Vector<String16>& args); // Set the stream use case overrides status_t handleSetStreamUseCaseOverrides(const Vector<String16>& args); // Clear the stream use case overrides void handleClearStreamUseCaseOverrides(); // Handle 'watch' command as passed through 'cmd' status_t handleWatchCommand(const Vector<String16> &args, int inFd, int outFd); Loading Loading @@ -1355,6 +1368,9 @@ private: // Camera Service watchdog flag bool mCameraServiceWatchdogEnabled = true; // Current stream use case overrides std::vector<int64_t> mStreamUseCaseOverrides; /** * A listener class that implements the IBinder::DeathRecipient interface * for use to call back the error state injected by the external camera, and Loading
services/camera/libcameraservice/api1/Camera2Client.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -2380,6 +2380,15 @@ status_t Camera2Client::setCameraMute(bool enabled) { return mDevice->setCameraMute(enabled); } void Camera2Client::setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides) { mDevice->setStreamUseCaseOverrides(useCaseOverrides); } void Camera2Client::clearStreamUseCaseOverrides() { mDevice->clearStreamUseCaseOverrides(); } status_t Camera2Client::waitUntilCurrentRequestIdLocked() { int32_t activeRequestId = mStreamingProcessor->getActiveRequestId(); if (activeRequestId != 0) { Loading
services/camera/libcameraservice/api1/Camera2Client.h +4 −0 Original line number Diff line number Diff line Loading @@ -93,6 +93,10 @@ public: virtual status_t setCameraServiceWatchdog(bool enabled); virtual void setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides); virtual void clearStreamUseCaseOverrides(); /** * Interface used by CameraService */ Loading
services/camera/libcameraservice/api2/CameraDeviceClient.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -1781,6 +1781,15 @@ status_t CameraDeviceClient::setCameraMute(bool enabled) { return mDevice->setCameraMute(enabled); } void CameraDeviceClient::setStreamUseCaseOverrides( const std::vector<int64_t>& useCaseOverrides) { mDevice->setStreamUseCaseOverrides(useCaseOverrides); } void CameraDeviceClient::clearStreamUseCaseOverrides() { mDevice->clearStreamUseCaseOverrides(); } binder::Status CameraDeviceClient::switchToOffline( const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, const std::vector<int>& offlineOutputIds, Loading