Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cccd2b69 authored by Emilian Peev's avatar Emilian Peev
Browse files

Camera: Support Eyes free videography advanced extenders

Add necessary plumbing to support EFV extensions.
The basic extension API will no longer receive further
updates and is getting deprecated starting with version 1.5.

Bug: 297083874
Test: Successful build
Change-Id: Ia0a096fd37c44212ca6b0171cffff052f0dcbe3c
parent 6169de0b
Loading
Loading
Loading
Loading
+254 −6
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ import android.util.Size;
import android.view.Surface;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
import androidx.camera.extensions.impl.AutoPreviewExtenderImpl;
import androidx.camera.extensions.impl.BeautyImageCaptureExtenderImpl;
@@ -94,6 +95,7 @@ import androidx.camera.extensions.impl.PreviewExtenderImpl;
import androidx.camera.extensions.impl.PreviewExtenderImpl.ProcessorType;
import androidx.camera.extensions.impl.PreviewImageProcessorImpl;
import androidx.camera.extensions.impl.ProcessResultImpl;
import androidx.camera.extensions.impl.ProcessorImpl;
import androidx.camera.extensions.impl.RequestUpdateProcessorImpl;
import androidx.camera.extensions.impl.advanced.AdvancedExtenderImpl;
import androidx.camera.extensions.impl.advanced.AutoAdvancedExtenderImpl;
@@ -101,6 +103,7 @@ import androidx.camera.extensions.impl.advanced.BeautyAdvancedExtenderImpl;
import androidx.camera.extensions.impl.advanced.BokehAdvancedExtenderImpl;
import androidx.camera.extensions.impl.advanced.Camera2OutputConfigImpl;
import androidx.camera.extensions.impl.advanced.Camera2SessionConfigImpl;
import androidx.camera.extensions.impl.advanced.EyesFreeVideographyAdvancedExtenderImpl;
import androidx.camera.extensions.impl.advanced.HdrAdvancedExtenderImpl;
import androidx.camera.extensions.impl.advanced.ImageProcessorImpl;
import androidx.camera.extensions.impl.advanced.ImageReaderOutputConfigImpl;
@@ -112,6 +115,8 @@ import androidx.camera.extensions.impl.advanced.RequestProcessorImpl;
import androidx.camera.extensions.impl.advanced.SessionProcessorImpl;
import androidx.camera.extensions.impl.advanced.SurfaceOutputConfigImpl;

import com.android.internal.camera.flags.Flags;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -135,22 +140,28 @@ public class CameraExtensionsProxyService extends Service {
    private static final String RESULTS_VERSION_PREFIX = "1.3";
    // Support for various latency improvements
    private static final String LATENCY_VERSION_PREFIX = "1.4";
    private static final String[] ADVANCED_VERSION_PREFIXES = {LATENCY_VERSION_PREFIX,
            ADVANCED_VERSION_PREFIX, RESULTS_VERSION_PREFIX };
    private static final String[] SUPPORTED_VERSION_PREFIXES = {LATENCY_VERSION_PREFIX,
            RESULTS_VERSION_PREFIX, ADVANCED_VERSION_PREFIX, "1.1", NON_INIT_VERSION_PREFIX};
    private static final String EFV_VERSION_PREFIX = "1.5";
    private static final String[] ADVANCED_VERSION_PREFIXES = {EFV_VERSION_PREFIX,
            LATENCY_VERSION_PREFIX, ADVANCED_VERSION_PREFIX, RESULTS_VERSION_PREFIX };
    private static final String[] SUPPORTED_VERSION_PREFIXES = {EFV_VERSION_PREFIX,
            LATENCY_VERSION_PREFIX, RESULTS_VERSION_PREFIX, ADVANCED_VERSION_PREFIX, "1.1",
            NON_INIT_VERSION_PREFIX};
    private static final boolean EXTENSIONS_PRESENT = checkForExtensions();
    private static final String EXTENSIONS_VERSION = EXTENSIONS_PRESENT ?
            (new ExtensionVersionImpl()).checkApiVersion(LATEST_VERSION) : null;
    private static final boolean ESTIMATED_LATENCY_API_SUPPORTED = checkForLatencyAPI();
    private static final boolean LATENCY_IMPROVEMENTS_SUPPORTED = EXTENSIONS_PRESENT &&
            (EXTENSIONS_VERSION.startsWith(LATENCY_VERSION_PREFIX));
            (EXTENSIONS_VERSION.startsWith(LATENCY_VERSION_PREFIX) ||
                    (EXTENSIONS_VERSION.startsWith(EFV_VERSION_PREFIX)));
    private static final boolean EFV_SUPPORTED = EXTENSIONS_PRESENT &&
            (EXTENSIONS_VERSION.startsWith(EFV_VERSION_PREFIX));
    private static final boolean ADVANCED_API_SUPPORTED = checkForAdvancedAPI();
    private static final boolean INIT_API_SUPPORTED = EXTENSIONS_PRESENT &&
            (!EXTENSIONS_VERSION.startsWith(NON_INIT_VERSION_PREFIX));
    private static final boolean RESULT_API_SUPPORTED = EXTENSIONS_PRESENT &&
            (EXTENSIONS_VERSION.startsWith(RESULTS_VERSION_PREFIX) ||
            EXTENSIONS_VERSION.startsWith(LATENCY_VERSION_PREFIX));
            EXTENSIONS_VERSION.startsWith(LATENCY_VERSION_PREFIX) ||
            EXTENSIONS_VERSION.startsWith(EFV_VERSION_PREFIX));

    private HashMap<String, Long> mMetadataVendorIdMap = new HashMap<>();
    private CameraManager mCameraManager;
@@ -509,6 +520,167 @@ public class CameraExtensionsProxyService extends Service {
     */
    public static Pair<PreviewExtenderImpl, ImageCaptureExtenderImpl> initializeExtension(
            int extensionType) {
        if (Flags.concertMode()) {
            if (extensionType == CameraExtensionCharacteristics.EXTENSION_EYES_FREE_VIDEOGRAPHY) {
                // Basic extensions are deprecated starting with extension version 1.5
                return new Pair<>(new PreviewExtenderImpl() {
                    @Override
                    public boolean isExtensionAvailable(String cameraId,
                            CameraCharacteristics cameraCharacteristics) {
                        return false;
                    }

                    @Override
                    public void init(String cameraId, CameraCharacteristics cameraCharacteristics) {

                    }

                    @Override
                    public androidx.camera.extensions.impl.CaptureStageImpl getCaptureStage() {
                        return null;
                    }

                    @Override
                    public ProcessorType getProcessorType() {
                        return null;
                    }

                    @Override
                    public ProcessorImpl getProcessor() {
                        return null;
                    }

                    @Nullable
                    @Override
                    public List<Pair<Integer, Size[]>> getSupportedResolutions() {
                        return null;
                    }

                    @Override
                    public void onInit(String cameraId, CameraCharacteristics cameraCharacteristics,
                            Context context) { }

                    @Override
                    public void onDeInit() { }

                    @Override
                    public androidx.camera.extensions.impl.CaptureStageImpl onPresetSession() {
                        return null;
                    }

                    @Override
                    public androidx.camera.extensions.impl.CaptureStageImpl onEnableSession() {
                        return null;
                    }

                    @Override
                    public androidx.camera.extensions.impl.CaptureStageImpl onDisableSession() {
                        return null;
                    }

                    @Override
                    public int onSessionType() {
                        return 0;
                    }
                }, new ImageCaptureExtenderImpl() {
                    @Override
                    public boolean isExtensionAvailable(String cameraId,
                            CameraCharacteristics cameraCharacteristics) {
                        return false;
                    }

                    @Override
                    public void init(String cameraId,
                            CameraCharacteristics cameraCharacteristics) { }

                    @Override
                    public CaptureProcessorImpl getCaptureProcessor() {
                        return null;
                    }

                    @Override
                    public
                    List<androidx.camera.extensions.impl.CaptureStageImpl> getCaptureStages() {
                        return null;
                    }

                    @Override
                    public int getMaxCaptureStage() {
                        return 0;
                    }

                    @Override
                    public List<Pair<Integer, Size[]>> getSupportedResolutions() {
                        return null;
                    }

                    @Override
                    public List<Pair<Integer, Size[]>> getSupportedPostviewResolutions(
                            Size captureSize) {
                        return null;
                    }

                    @Override
                    public Range<Long> getEstimatedCaptureLatencyRange(
                            Size captureOutputSize) {
                        return null;
                    }

                    @Override
                    public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
                        return null;
                    }

                    @Override
                    public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
                        return null;
                    }

                    @Override
                    public boolean isCaptureProcessProgressAvailable() {
                        return false;
                    }

                    @Override
                    public Pair<Long, Long> getRealtimeCaptureLatency() {
                        return null;
                    }

                    @Override
                    public boolean isPostviewAvailable() {
                        return false;
                    }

                    @Override
                    public void onInit(String cameraId,
                            CameraCharacteristics cameraCharacteristics, Context context) { }

                    @Override
                    public void onDeInit() { }

                    @Override
                    public androidx.camera.extensions.impl.CaptureStageImpl onPresetSession() {
                        return null;
                    }

                    @Override
                    public androidx.camera.extensions.impl.CaptureStageImpl onEnableSession() {
                        return null;
                    }

                    @Override
                    public androidx.camera.extensions.impl.CaptureStageImpl onDisableSession() {
                        return null;
                    }

                    @Override
                    public int onSessionType() {
                        return 0;
                    }
                });
            }
        }

        switch (extensionType) {
            case CameraExtensionCharacteristics.EXTENSION_AUTOMATIC:
                return new Pair<>(new AutoPreviewExtenderImpl(),
@@ -533,6 +705,82 @@ public class CameraExtensionsProxyService extends Service {
     * @hide
     */
    public static AdvancedExtenderImpl initializeAdvancedExtensionImpl(int extensionType) {
        if (Flags.concertMode()) {
            if (extensionType == CameraExtensionCharacteristics.EXTENSION_EYES_FREE_VIDEOGRAPHY) {
                if (EFV_SUPPORTED) {
                    return new EyesFreeVideographyAdvancedExtenderImpl();
                } else {
                    return new AdvancedExtenderImpl() {
                        @Override
                        public boolean isExtensionAvailable(String cameraId,
                                Map<String, CameraCharacteristics> characteristicsMap) {
                            return false;
                        }

                        @Override
                        public void init(String cameraId,
                                Map<String, CameraCharacteristics> characteristicsMap) {

                        }

                        @Override
                        public Range<Long> getEstimatedCaptureLatencyRange(String cameraId,
                                Size captureOutputSize, int imageFormat) {
                            return null;
                        }

                        @Override
                        public Map<Integer, List<Size>> getSupportedPreviewOutputResolutions(
                                String cameraId) {
                            return null;
                        }

                        @Override
                        public Map<Integer, List<Size>> getSupportedCaptureOutputResolutions(
                                String cameraId) {
                            return null;
                        }

                        @Override
                        public Map<Integer, List<Size>> getSupportedPostviewResolutions(
                                Size captureSize) {
                            return null;
                        }

                        @Override
                        public List<Size> getSupportedYuvAnalysisResolutions(String cameraId) {
                            return null;
                        }

                        @Override
                        public SessionProcessorImpl createSessionProcessor() {
                            return null;
                        }

                        @Override
                        public List<CaptureRequest.Key> getAvailableCaptureRequestKeys() {
                            return null;
                        }

                        @Override
                        public List<CaptureResult.Key> getAvailableCaptureResultKeys() {
                            return null;
                        }

                        @Override
                        public boolean isCaptureProcessProgressAvailable() {
                            return false;
                        }

                        @Override
                        public boolean isPostviewAvailable() {
                            return false;
                        }
                    };
                }
            }
        }

        switch (extensionType) {
            case CameraExtensionCharacteristics.EXTENSION_AUTOMATIC:
                return new AutoAdvancedExtenderImpl();