From e906e99eb77886b285bb0c88c5eaa62236a6b233 Mon Sep 17 00:00:00 2001 From: hmz007 Date: Thu, 12 Dec 2024 16:39:29 +0800 Subject: [PATCH] android: camera: Minor fixes for USB/external camera Signed-off-by: hmz007 --- .../3.4/default/ExternalCameraDevice.cpp | 6 +++- .../device/ExternalCameraDevice.cpp | 7 ++++- .../camera_aidl/device/HdmiDevice.cpp | 7 +++-- .../camera_aidl/device/RgaCropScale.cpp | 2 +- .../camera_aidl/provider/HdmiProvider.cpp | 3 ++ .../com/android/camera/CameraActivity.java | 14 ++++++++++ .../src/com/android/camera/CaptureModule.java | 13 +++++++-- .../src/com/android/camera/VideoModule.java | 2 +- .../android/camera/one/OneCameraManager.java | 7 ++++- .../one/v1/LegacyOneCameraManagerImpl.java | 7 ++++- .../one/v2/Camera2OneCameraManagerImpl.java | 28 +++++++++++++------ 11 files changed, 78 insertions(+), 18 deletions(-) diff --git a/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp b/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp index 311c688a2cb..2121d23c726 100644 --- a/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp +++ b/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include "android-base/macros.h" #include "CameraMetadata.h" #include "../../3.2/default/include/convert.h" @@ -370,7 +371,10 @@ status_t ExternalCameraDevice::initDefaultCharsKeys( UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, &opticalStabilizationMode, 1); - const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL; + int nr_back = property_get_int32("persist.vendor.camera.nr_back", 1); + const uint8_t facing = (std::stoi(mCameraId) < (mCfg.cameraIdOffset + nr_back)) ? + ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_EXTERNAL; + ALOGV("update camera %s facing to %d", mCameraId.c_str(), facing); UPDATE(ANDROID_LENS_FACING, &facing, 1); // android.noiseReduction diff --git a/hardware/rockchip/camera_aidl/device/ExternalCameraDevice.cpp b/hardware/rockchip/camera_aidl/device/ExternalCameraDevice.cpp index 8632cdb86a2..05c333ea27f 100644 --- a/hardware/rockchip/camera_aidl/device/ExternalCameraDevice.cpp +++ b/hardware/rockchip/camera_aidl/device/ExternalCameraDevice.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -482,7 +483,11 @@ status_t ExternalCameraDevice::initDefaultCharsKeys( const uint8_t opticalStabilizationMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, &opticalStabilizationMode, 1); - const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL; + int nr_back = property_get_int32("persist.vendor.camera.nr_back", 1); + int nr_hdmi = property_get_int32("persist.vendor.camera.nr_hdmi", 1); + const uint8_t facing = (std::stoi(mCameraId) > (mCfg.cameraIdOffset + nr_back - nr_hdmi)) ? + ANDROID_LENS_FACING_EXTERNAL : ANDROID_LENS_FACING_BACK; + ALOGV("update external camera %s facing to %d", mCameraId.c_str(), facing); UPDATE(ANDROID_LENS_FACING, &facing, 1); // android.noiseReduction diff --git a/hardware/rockchip/camera_aidl/device/HdmiDevice.cpp b/hardware/rockchip/camera_aidl/device/HdmiDevice.cpp index 880ff5b3378..60cfcedbd69 100644 --- a/hardware/rockchip/camera_aidl/device/HdmiDevice.cpp +++ b/hardware/rockchip/camera_aidl/device/HdmiDevice.cpp @@ -23,9 +23,9 @@ #include #include -#include #include #include +#include #include #include @@ -422,7 +422,10 @@ status_t HdmiDevice::initDefaultCharsKeys( const uint8_t opticalStabilizationMode = ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF; UPDATE(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, &opticalStabilizationMode, 1); - const uint8_t facing = ANDROID_LENS_FACING_EXTERNAL; + int nr_back = property_get_int32("persist.vendor.camera.nr_back", 1); + const uint8_t facing = (std::stoi(mCameraId) < (mCfg.cameraIdOffset + nr_back)) ? + ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_EXTERNAL; + ALOGV("update hdmiin %s facing to %d", mCameraId.c_str(), facing); UPDATE(ANDROID_LENS_FACING, &facing, 1); // android.noiseReduction diff --git a/hardware/rockchip/camera_aidl/device/RgaCropScale.cpp b/hardware/rockchip/camera_aidl/device/RgaCropScale.cpp index 4ab0b07371d..1bd0326477f 100644 --- a/hardware/rockchip/camera_aidl/device/RgaCropScale.cpp +++ b/hardware/rockchip/camera_aidl/device/RgaCropScale.cpp @@ -98,7 +98,7 @@ int RgaCropScale::CropScaleNV12Or21(struct Params* in, struct Params* out) } else { dst.fd = out->fd; dst_handle = importbuffer_fd(dst.fd, ¶m); - ALOGD("@%s, dst fd:%d,width:%d,height:%d",__FUNCTION__,dst.fd,param.width,param.height); + ALOGV("@%s, dst fd:%d,width:%d,height:%d",__FUNCTION__,dst.fd,param.width,param.height); } dst.mmuFlag = ((2 & 0x3) << 4) | 1 | (1 << 8) | (1 << 10); diff --git a/hardware/rockchip/camera_aidl/provider/HdmiProvider.cpp b/hardware/rockchip/camera_aidl/provider/HdmiProvider.cpp index 08b69ede4ad..2356e05c257 100644 --- a/hardware/rockchip/camera_aidl/provider/HdmiProvider.cpp +++ b/hardware/rockchip/camera_aidl/provider/HdmiProvider.cpp @@ -102,6 +102,7 @@ class IHdmiRxStatusCallbackImpl:public ::rockchip::hardware::hdmi::V1_0::IHdmiRx } // namespace HdmiProvider::HdmiProvider() : mCfg(HdmiConfig::loadFromCfg()) { + property_set("persist.vendor.camera.nr_hdmi", "0"); mHotPlugThread = std::make_shared(this); mHotPlugThread->run(); } @@ -258,6 +259,7 @@ void HdmiProvider::deviceAdded(const char* devName) { } deviceImpl.reset(); addHdmi(devName); + property_set("persist.vendor.camera.nr_hdmi", "1"); } void HdmiProvider::deviceRemoved(const char* devName) { @@ -278,6 +280,7 @@ void HdmiProvider::deviceRemoved(const char* devName) { if (mCallback != nullptr) { mCallback->cameraDeviceStatusChange(deviceName, CameraDeviceStatus::NOT_PRESENT); } + property_set("persist.vendor.camera.nr_hdmi", "0"); } void HdmiProvider::updateAttachedCameras() { diff --git a/packages/apps/Camera2/src/com/android/camera/CameraActivity.java b/packages/apps/Camera2/src/com/android/camera/CameraActivity.java index 3333f3bb342..96f6facefbe 100644 --- a/packages/apps/Camera2/src/com/android/camera/CameraActivity.java +++ b/packages/apps/Camera2/src/com/android/camera/CameraActivity.java @@ -1763,6 +1763,9 @@ public class CameraActivity extends QuickActivity setModuleFromModeIndex(getModeIndex()); + // Saved camera Id (of external camera) may be gone + checkCameraId(); + profile.mark(); mCameraAppUI.prepareModuleUI(); profile.mark("Init Current Module UI"); @@ -2194,6 +2197,17 @@ public class CameraActivity extends QuickActivity } } + private void checkCameraId() { + int cameraId = mSettingsManager.getInteger(SettingsManager.SCOPE_GLOBAL, + Keys.KEY_CAMERA_ID); + + if (!mOneCameraManager.hasCamera(cameraId)) { + Log.d(TAG, "reset cameraId setting " + cameraId + " to 0"); + mSettingsManager.set(SettingsManager.SCOPE_GLOBAL, + Keys.KEY_CAMERA_ID, 0); + } + } + private void preloadFilmstripItems() { if (mDataAdapter == null) { mDataAdapter = new CameraFilmstripDataAdapter(mAppContext, diff --git a/packages/apps/Camera2/src/com/android/camera/CaptureModule.java b/packages/apps/Camera2/src/com/android/camera/CaptureModule.java index 2b46b2b33f0..b07da2ae6e0 100644 --- a/packages/apps/Camera2/src/com/android/camera/CaptureModule.java +++ b/packages/apps/Camera2/src/com/android/camera/CaptureModule.java @@ -1748,10 +1748,19 @@ public class CaptureModule extends CameraModule implements private Facing getFacingFromCameraId(int cameraId) { try { CameraManager manager = (CameraManager) mCameraActivity.getSystemService(Context.CAMERA_SERVICE); - String cameraIds = manager.getCameraIdList()[cameraId]; - Log.d(TAG,"cameraIds="+cameraIds); + String[] ids = manager.getCameraIdList(); + if (cameraId >= ids.length) cameraId = 0; + + String cameraIds = ids[cameraId]; + Log.d(TAG, "cameraIds = " + cameraIds); CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraIds); int mLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING); + + // map first external camera to back + if (cameraId == 0 && mLensFacing == CameraCharacteristics.LENS_FACING_EXTERNAL) { + return Facing.BACK; + } + // cameraservice map external to front for legacy API return (mLensFacing == CameraCharacteristics.LENS_FACING_BACK) ? Facing.BACK : Facing.FRONT; } catch (CameraAccessException e) { diff --git a/packages/apps/Camera2/src/com/android/camera/VideoModule.java b/packages/apps/Camera2/src/com/android/camera/VideoModule.java index bb240eb7316..056b3436e2f 100644 --- a/packages/apps/Camera2/src/com/android/camera/VideoModule.java +++ b/packages/apps/Camera2/src/com/android/camera/VideoModule.java @@ -2507,7 +2507,7 @@ public class VideoModule extends CameraModule e.printStackTrace(); return 0; } - return id; + return id > 1 ? 0 : id; } else { Log.e(TAG, "No camera found."); return 0; diff --git a/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java b/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java index 604bc3a74df..e131c7d0369 100644 --- a/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java +++ b/packages/apps/Camera2/src/com/android/camera/one/OneCameraManager.java @@ -33,6 +33,11 @@ public interface OneCameraManager { */ public boolean hasCamera(); + /** + * Returns whether the device has a camera Id. + */ + public boolean hasCamera(int id); + /** * Returns whether the device has a camera facing the given direction. */ @@ -72,4 +77,4 @@ public interface OneCameraManager { public static class Factory { } -} \ No newline at end of file +} diff --git a/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java b/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java index 9a3ec12c6e7..aadca8f1b64 100644 --- a/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java +++ b/packages/apps/Camera2/src/com/android/camera/one/v1/LegacyOneCameraManagerImpl.java @@ -105,6 +105,11 @@ public class LegacyOneCameraManagerImpl implements OneCameraManager { @Override public boolean hasCamera() { + return hasCamera(0); + } + + @Override + public boolean hasCamera(int id) { return false; } @@ -193,4 +198,4 @@ public class LegacyOneCameraManagerImpl implements OneCameraManager { return characteristics; } -} \ No newline at end of file +} diff --git a/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java b/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java index 3810eabc3b6..5819b295577 100644 --- a/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java +++ b/packages/apps/Camera2/src/com/android/camera/one/v2/Camera2OneCameraManagerImpl.java @@ -84,9 +84,14 @@ public class Camera2OneCameraManagerImpl extends CameraManager.AvailabilityCallb @Override public boolean hasCamera() { + return hasCamera(0); + } + + @Override + public boolean hasCamera(int id) { try { String[] ids = mCameraManager.getCameraIdList(); - return ids != null && ids.length > 0; + return ids != null && ids.length > id; } catch (CameraAccessException ex) { Log.e(TAG, "Unable to read camera list.", ex); return false; @@ -179,9 +184,9 @@ public class Camera2OneCameraManagerImpl extends CameraManager.AvailabilityCallb String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_BACK); if (cameraId == null) { Log.w(TAG, "No back-facing camera found."); - Log.d(TAG, "Getting First FRONT Camera"); - //xcq add - cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_FRONT); + + Log.d(TAG, "Getting First EXTERNAL Camera"); + cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_EXTERNAL); } return cameraId; } @@ -191,8 +196,12 @@ public class Camera2OneCameraManagerImpl extends CameraManager.AvailabilityCallb Log.d(TAG, "Getting First FRONT Camera"); String cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_FRONT); if (cameraId == null) { - Log.w(TAG, "No front-facing camera found,try to find external facing camera."); - cameraId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_EXTERNAL); + Log.w(TAG, "No front-facing camera found."); + + String backId = findFirstCameraIdFacing(CameraCharacteristics.LENS_FACING_BACK); + int start = (backId == null) ? 1 : 0; + Log.d(TAG, "Finding external camera " + start); + cameraId = findCameraIdFacingFrom(CameraCharacteristics.LENS_FACING_EXTERNAL, start); if (cameraId == null) { Log.w(TAG, "No external camera found."); } @@ -200,16 +209,19 @@ public class Camera2OneCameraManagerImpl extends CameraManager.AvailabilityCallb return cameraId; } - /** Returns the ID of the first camera facing the given direction. */ private String findFirstCameraIdFacing(int facing) { + return findCameraIdFacingFrom(facing, 0); + } + + private String findCameraIdFacingFrom(int facing, int from) { try { String[] cameraIds = mCameraManager.getCameraIdList(); for (String cameraId : cameraIds) { CameraCharacteristics characteristics = mCameraManager .getCameraCharacteristics(cameraId); if (characteristics.get(CameraCharacteristics.LENS_FACING) == facing) { - return cameraId; + if (--from < 0) return cameraId; } } } catch (CameraAccessException ex) {