Fix Preview stretch when VideoCapture is bound
Use TEMPLATE_PREVIEW instead of TEMPLATE_RECORD can workaround this issue.
Bug: 227469801
Test: manually testing
Change-Id: I8493d62cd5f963346b9f459ff2e8cfeed578d45c
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
index ced0af2..9c57d72 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
@@ -45,6 +45,7 @@
import android.graphics.ImageFormat;
import android.graphics.Rect;
+import android.hardware.camera2.CameraDevice;
import android.media.MediaCodec;
import android.util.Pair;
import android.util.Range;
@@ -98,6 +99,8 @@
import androidx.camera.core.processing.SurfaceEffectNode;
import androidx.camera.video.StreamInfo.StreamState;
import androidx.camera.video.impl.VideoCaptureConfig;
+import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.video.internal.compat.quirk.PreviewStretchWhenVideoCaptureIsBoundQuirk;
import androidx.camera.video.internal.config.MimeInfo;
import androidx.camera.video.internal.encoder.InvalidConfigException;
import androidx.camera.video.internal.encoder.VideoEncoderConfig;
@@ -144,6 +147,8 @@
private static final String SURFACE_UPDATE_KEY =
"androidx.camera.video.VideoCapture.streamUpdate";
private static final Defaults DEFAULT_CONFIG = new Defaults();
+ private static final boolean HAS_PREVIEW_STRETCH_QUIRK =
+ DeviceQuirks.get(PreviewStretchWhenVideoCaptureIsBoundQuirk.class) != null;
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
DeferrableSurface mDeferrableSurface;
@@ -504,6 +509,9 @@
SessionConfig.Builder sessionConfigBuilder = SessionConfig.Builder.createFrom(config);
sessionConfigBuilder.addErrorListener(
(sessionConfig, error) -> resetPipeline(cameraId, config, resolution));
+ if (HAS_PREVIEW_STRETCH_QUIRK) {
+ sessionConfigBuilder.setTemplateType(CameraDevice.TEMPLATE_PREVIEW);
+ }
return sessionConfigBuilder;
}
@@ -737,6 +745,7 @@
Logger.d(TAG, "candidatesList = " + candidatesList);
// Find the smallest change in dimensions.
+ //noinspection ComparatorCombinators - Suggestion by Comparator.comparingInt is for API24+
Collections.sort(candidatesList,
(s1, s2) -> (Math.abs(s1.getWidth() - cropRect.width()) + Math.abs(
s1.getHeight() - cropRect.height()))
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
index 33843db..151ba52 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
@@ -77,6 +77,9 @@
if (NegativeLatLongSavesIncorrectlyQuirk.load()) {
quirks.add(new NegativeLatLongSavesIncorrectlyQuirk());
}
+ if (PreviewStretchWhenVideoCaptureIsBoundQuirk.load()) {
+ quirks.add(new PreviewStretchWhenVideoCaptureIsBoundQuirk());
+ }
return quirks;
}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewStretchWhenVideoCaptureIsBoundQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewStretchWhenVideoCaptureIsBoundQuirk.java
new file mode 100644
index 0000000..6e433bf
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewStretchWhenVideoCaptureIsBoundQuirk.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.camera.video.internal.compat.quirk;
+
+import android.os.Build;
+
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+
+/**
+ * <p>QuirkSummary
+ * Bug Id: b/227469801
+ * Description: Quirk indicates Preview is stretched when VideoCapture is bound.
+ * Device(s): Samsung J3, Samsung J7, Samsung J1 Ace neo and Oppo A37F
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class PreviewStretchWhenVideoCaptureIsBoundQuirk implements Quirk {
+
+ static boolean load() {
+ return isHuaweiP8Lite() || isSamsungJ3() || isSamsungJ7() || isSamsungJ1AceNeo()
+ || isOppoA37F();
+ }
+
+ private static boolean isHuaweiP8Lite() {
+ return "HUAWEI".equalsIgnoreCase(Build.MANUFACTURER)
+ && "HUAWEI ALE-L04".equalsIgnoreCase(Build.MODEL);
+ }
+
+ private static boolean isSamsungJ3() {
+ return "Samsung".equalsIgnoreCase(Build.MANUFACTURER)
+ && "sm-j320f".equalsIgnoreCase(Build.MODEL);
+ }
+
+ private static boolean isSamsungJ7() {
+ return "Samsung".equalsIgnoreCase(Build.MANUFACTURER)
+ && "sm-j700f".equalsIgnoreCase(Build.MODEL);
+ }
+
+ private static boolean isSamsungJ1AceNeo() {
+ return "Samsung".equalsIgnoreCase(Build.MANUFACTURER)
+ && "sm-j111f".equalsIgnoreCase(Build.MODEL);
+ }
+
+ private static boolean isOppoA37F() {
+ return "OPPO".equalsIgnoreCase(Build.MANUFACTURER) && "A37F".equalsIgnoreCase(Build.MODEL);
+ }
+}