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