From 3fdfdea0721fe7a36f6aaa509075f01a194f6748 Mon Sep 17 00:00:00 2001 From: xie <xie-email@example.com> Date: Sat, 23 Nov 2024 09:19:59 +0000 Subject: [PATCH] feat(usb_camera): apply usb_camera patch --- android/device/softwinner/ceres-c3/configs/manifest.xml | 1 android/packages/apps/Camera2/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java | 11 +++ android/device/softwinner/ceres-c3/configs/media_profiles.xml | 58 +++++++++++++++++++ android/packages/apps/Camera2/res/values/arrays.xml | 5 + android/device/softwinner/ceres-c3/hal.mk | 6 + android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp | 12 ++-- android/packages/apps/Camera2/res/values/strings.xml | 2 android/packages/apps/Camera2/src/com/android/camera/MultiToggleImageButton.java | 34 +++++++++++ android/device/softwinner/ceres-c3/ceres_c3.mk | 10 +++ android/device/softwinner/ceres-c3/init.device.rc | 4 + 10 files changed, 135 insertions(+), 8 deletions(-) diff --git a/android/device/softwinner/ceres-c3/ceres_c3.mk b/android/device/softwinner/ceres-c3/ceres_c3.mk index 8db2d09..69aeb6b 100755 --- a/android/device/softwinner/ceres-c3/ceres_c3.mk +++ b/android/device/softwinner/ceres-c3/ceres_c3.mk @@ -328,6 +328,16 @@ #PRODUCT_ROTATION := 90 +PRODUCT_HAS_UVC_CAMERA := true +ifeq ($(PRODUCT_HAS_UVC_CAMERA),true) +PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \ + ro.camera.uvcfacing=external + +PRODUCT_COPY_FILES += \ + device/softwinner/common/config/external_camera_config.xml:$(TARGET_COPY_OUT_VENDOR)/etc/external_camera_config.xml +endif + + PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/ido/liblcd_bl.so:/system/lib64/liblcd_bl.so \ $(LOCAL_PATH)/ido/liblcd_bl32.so:/system/lib/liblcd_bl.so \ diff --git a/android/device/softwinner/ceres-c3/configs/manifest.xml b/android/device/softwinner/ceres-c3/configs/manifest.xml index 9a208c4..fb82972 100644 --- a/android/device/softwinner/ceres-c3/configs/manifest.xml +++ b/android/device/softwinner/ceres-c3/configs/manifest.xml @@ -156,6 +156,7 @@ <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> + <instance>external/0</instance> </interface> </hal> <hal format="hidl"> diff --git a/android/device/softwinner/ceres-c3/configs/media_profiles.xml b/android/device/softwinner/ceres-c3/configs/media_profiles.xml index 9bae325..3bdcf82 100644 --- a/android/device/softwinner/ceres-c3/configs/media_profiles.xml +++ b/android/device/softwinner/ceres-c3/configs/media_profiles.xml @@ -79,7 +79,33 @@ <!-- Each camcorder profile defines a set of predefined configuration parameters --> <!-- Back Camera --> <!-- Front Camera --> + <!-- External Camera --> <CamcorderProfiles cameraId="0" > + <EncoderProfile quality="720p" fileFormat="mp4" duration="30"> + <Video codec="h264" + bitRate="1500000" + width="1280" + height="720" + frameRate="30" /> + + <Audio codec="aac" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + <EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="30"> + <Video codec="h264" + bitRate="1500000" + width="1280" + height="720" + frameRate="30" /> + + <Audio codec="aac" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + <EncoderProfile quality="480p" fileFormat="mp4" duration="30"> <Video codec="h264" bitRate="1500000" @@ -148,6 +174,38 @@ </CamcorderProfiles> + <CamcorderProfiles cameraId="2" > + <EncoderProfile quality="480p" fileFormat="mp4" duration="30"> + <Video codec="h264" + bitRate="1500000" + width="1280" + height="720" + frameRate="30" /> + + <Audio codec="aac" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + <EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="30"> + <Video codec="h264" + bitRate="1500000" + width="1280" + height="720" + frameRate="30" /> + + <Audio codec="aac" + bitRate="12200" + sampleRate="8000" + channels="1" /> + </EncoderProfile> + + <ImageEncoding quality="90" /> + <ImageEncoding quality="80" /> + <ImageEncoding quality="70" /> + <ImageDecoding memCap="20000000" /> + </CamcorderProfiles> + <EncoderOutputFileFormat name="mp4" /> <!-- diff --git a/android/device/softwinner/ceres-c3/hal.mk b/android/device/softwinner/ceres-c3/hal.mk index 6d949af..47c965b 100644 --- a/android/device/softwinner/ceres-c3/hal.mk +++ b/android/device/softwinner/ceres-c3/hal.mk @@ -26,12 +26,16 @@ # CAMERA PRODUCT_PACKAGES += \ - camera.device@3.2-impl \ + camera.device@3.5-impl \ android.hardware.camera.provider@2.4-service-lazy \ android.hardware.camera.provider@2.4-impl \ libcamera \ camera.ceres +PRODUCT_PACKAGES += \ + android.hardware.camera.provider@2.4-external-service + + # Memtrack PRODUCT_PACKAGES += \ android.hardware.memtrack@1.0-impl \ diff --git a/android/device/softwinner/ceres-c3/init.device.rc b/android/device/softwinner/ceres-c3/init.device.rc index 3798b97..37a13f1 100644 --- a/android/device/softwinner/ceres-c3/init.device.rc +++ b/android/device/softwinner/ceres-c3/init.device.rc @@ -50,6 +50,10 @@ insmod vendor/modules/ov8858_r2a_4lane.ko #insmod /vendor/modules/gc2385_mipi.ko insmod /vendor/modules/vin_v4l2.ko +### uvc module + insmod /vendor/modules/videobuf2-vmalloc.ko + insmod /vendor/modules/uvcvideo.ko + on property:sys.boot_completed=1 #usb hub up diff --git a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp index c5361e5..aa4dbbc 100755 --- a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp +++ b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp @@ -2372,12 +2372,12 @@ } uint32_t bufferSize = fmt.fmt.pix.sizeimage; ALOGI("%s: V4L2 buffer size is %d", __FUNCTION__, bufferSize); - uint32_t expectedMaxBufferSize = kMaxBytesPerPixel * fmt.fmt.pix.width * fmt.fmt.pix.height; - if ((bufferSize == 0) || (bufferSize > expectedMaxBufferSize)) { - ALOGE("%s: V4L2 buffer size: %u looks invalid. Expected maximum size: %u", __FUNCTION__, - bufferSize, expectedMaxBufferSize); - return -EINVAL; - } + //uint32_t expectedMaxBufferSize = kMaxBytesPerPixel * fmt.fmt.pix.width * fmt.fmt.pix.height; + // if ((bufferSize == 0) || (bufferSize > expectedMaxBufferSize)) { + // ALOGE("%s: V4L2 buffer size: %u looks invalid. Expected maximum size: %u", __FUNCTION__, + // bufferSize, expectedMaxBufferSize); + // return -EINVAL; + // } mMaxV4L2BufferSize = bufferSize; const double kDefaultFps = 30.0; diff --git a/android/packages/apps/Camera2/res/values/arrays.xml b/android/packages/apps/Camera2/res/values/arrays.xml index 1e0a912..e67efb4 100755 --- a/android/packages/apps/Camera2/res/values/arrays.xml +++ b/android/packages/apps/Camera2/res/values/arrays.xml @@ -169,21 +169,25 @@ <array name="camera_id_entries" translatable="false"> <item>@string/pref_camera_id_entry_back</item> <item>@string/pref_camera_id_entry_front</item> + <item>@string/pref_camera_id_entry_external</item> </array> <array name="camera_id_entryvalues" translatable="false"> <item>@string/pref_camera_id_entry_back_value</item> <item>@string/pref_camera_id_entry_front_value</item> + <item>@string/pref_camera_id_entry_external_value</item> </array> <array name="camera_id_labels" translatable="false"> <item>@string/pref_camera_id_label_back</item> <item>@string/pref_camera_id_label_front</item> + <item>@string/pref_camera_id_label_external</item> </array> <array name="camera_id_icons" translatable="false"> <item>@drawable/ic_switch_camera_back</item> <item>@drawable/ic_switch_camera_front</item> + <item>@drawable/ic_switch_camera_external</item> </array> <array name="camera_id_icons_without_external" translatable="false"> @@ -221,6 +225,7 @@ <array name="camera_id_largeicons" translatable="false"> <item>@drawable/ic_switch_camera_back</item> <item>@drawable/ic_switch_camera_front</item> + <item>@drawable/ic_switch_camera_external</item> </array> <string-array name="pref_video_effect_entries" translatable="false"> diff --git a/android/packages/apps/Camera2/res/values/strings.xml b/android/packages/apps/Camera2/res/values/strings.xml index 78c269e..6231db8 100755 --- a/android/packages/apps/Camera2/res/values/strings.xml +++ b/android/packages/apps/Camera2/res/values/strings.xml @@ -174,6 +174,7 @@ <!-- Named indexes into the array of camera facing entries --> <string name="pref_camera_id_index_back" translatable="false">1</string> <string name="pref_camera_id_index_front" translatable="false">2</string> + <string name="pref_camera_id_index_external" translatable="false">2</string> <!-- In select camera setting, back facing camera. [CHAR LIMIT=14] --> <string name="pref_camera_id_entry_back">Back</string> @@ -185,6 +186,7 @@ <string name="pref_camera_id_entry_back_value" translatable="false">0</string> <!-- In select camera setting, front-facing camera value. [CHAR LIMIT=14] --> <string name="pref_camera_id_entry_front_value" translatable="false">1</string> + <string name="pref_camera_id_entry_external_value" translatable="false">2</string> <!-- Settings screen, location setting text. [CHAR LIMIT=20]--> <string name="pref_camera_save_location_title">Save location</string> diff --git a/android/packages/apps/Camera2/src/com/android/camera/MultiToggleImageButton.java b/android/packages/apps/Camera2/src/com/android/camera/MultiToggleImageButton.java index 34ffcef..9f885ef 100755 --- a/android/packages/apps/Camera2/src/com/android/camera/MultiToggleImageButton.java +++ b/android/packages/apps/Camera2/src/com/android/camera/MultiToggleImageButton.java @@ -27,6 +27,7 @@ import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.os.AsyncTask; +import android.os.SystemProperties; import android.util.AttributeSet; import android.view.View; import android.widget.ImageButton; @@ -74,6 +75,8 @@ private int mAnimDirection; private Matrix mMatrix = new Matrix(); private ValueAnimator mAnimator; + + private static final String ANDROID_UVC_PROPERTY = "ro.camera.uvcfacing"; public MultiToggleImageButton(Context context) { super(context); @@ -242,6 +245,37 @@ private void nextState() { int state = mState + 1; + if(getId() == R.id.camera_toggle_button){ + /* + *If ro.camera.uvcfacing is set, then skip the original facing state. + */ + String uvcProperty = SystemProperties.get(ANDROID_UVC_PROPERTY, ""); + if(uvcProperty.equals("")){ + if(state == Integer.parseInt(getResources() + .getString(R.string.pref_camera_id_entry_external_value))){ + state = state + 1; + } + } + else if (uvcProperty.equals("back")) { + if(state == Integer.parseInt(getResources() + .getString(R.string.pref_camera_id_entry_back_value))){ + state = state + 1; + } + } + else if (uvcProperty.equals("front")) { + if(state == Integer.parseInt(getResources() + .getString(R.string.pref_camera_id_entry_front_value))){ + state = state + 1; + } + } + else if (uvcProperty.equals("external")) { + int externalValue = Integer.parseInt(getResources(). + getString(R.string.pref_camera_id_entry_external_value)); + if(state != externalValue){ + state = externalValue; + } + } + } if (state >= mImageIds.length) { state = 0; } diff --git a/android/packages/apps/Camera2/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java b/android/packages/apps/Camera2/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java index 936cc2a..22eb4ab 100755 --- a/android/packages/apps/Camera2/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java +++ b/android/packages/apps/Camera2/src/com/android/camera/one/config/OneCameraFeatureConfigCreator.java @@ -28,6 +28,7 @@ import com.android.camera.util.GservicesHelper; import com.google.common.base.Function; import com.google.common.base.Optional; +import android.os.SystemProperties; /** * Creates the OneCamera feature configurations for the GoogleCamera app. @@ -35,6 +36,7 @@ public class OneCameraFeatureConfigCreator { private static final Log.Tag TAG = new Log.Tag("OneCamFtrCnfgCrtr"); + private static final String ANDROID_UVC_PROPERTY = "ro.camera.uvcfacing"; /** * Create the default camera feature config. */ @@ -119,7 +121,14 @@ // On LIMITED devices starting with L-MR1 we run a simple YUV // capture mode. if (supportedLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED) { - return CaptureSupportLevel.LIMITED_JPEG; + // return CaptureSupportLevel.LIMITED_JPEG; + String uvcProperty = SystemProperties.get(ANDROID_UVC_PROPERTY, ""); + if(uvcProperty.equals("")){ + return CaptureSupportLevel.LIMITED_JPEG; + } + else{ + return CaptureSupportLevel.LIMITED_YUV; + } } // We should never get here. If we do, let's fall back to a mode -- Gitblit v1.6.2