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

Commit 48c6fc10 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Camera: Set metadata vendor id in extension proxy service" into sc-dev...

Merge "Camera: Set metadata vendor id in extension proxy service" into sc-dev am: 2d5d1676 am: d54c08d4

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15224774

Change-Id: I6fd2e1e627926fc63d1192fab551941b904ad082
parents ae292215 d54c08d4
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1884,6 +1884,8 @@ public class CameraMetadataNative implements Parcelable {
    private static native int nativeGetEntryCount(long ptr);
    @FastNative
    private static native long nativeGetBufferSize(long ptr);
    @FastNative
    private static native void nativeSetVendorId(long ptr, long vendorId);

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    @FastNative
@@ -1928,6 +1930,15 @@ public class CameraMetadataNative implements Parcelable {
        other.updateNativeAllocation();
    }

    /**
     * Set the native metadata vendor id.
     *
     * @hide
     */
    public void setVendorId(long vendorId) {
        nativeSetVendorId(mMetadataPtr, vendorId);
    }

    /**
     * @hide
     */
+27 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
*/

// #define LOG_NDEBUG 0
#include <memory>
#define LOG_TAG "CameraMetadata-JNI"
#include <utils/Errors.h>
#include <utils/Log.h>
@@ -162,6 +163,8 @@ struct Helpers {

extern "C" {

static void CameraMetadata_setVendorId(JNIEnv* env, jclass thiz, jlong ptr,
        jlong vendorId);
static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr,
        jclass keyType);
static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName,
@@ -596,6 +599,9 @@ static void CameraMetadata_writeToParcel(JNIEnv *env, jclass thiz, jobject parce

static const JNINativeMethod gCameraMetadataMethods[] = {
// static methods
  { "nativeSetVendorId",
    "(JJ)V",
    (void *)CameraMetadata_setVendorId },
  { "nativeGetTagFromKey",
    "(Ljava/lang/String;J)I",
    (void *)CameraMetadata_getTagFromKey },
@@ -870,6 +876,27 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong p
    return arrayList;
}

static void CameraMetadata_setVendorId(JNIEnv *env, jclass thiz, jlong ptr,
        jlong vendorId) {
    ALOGV("%s", __FUNCTION__);

    CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr);

    if (metadata == NULL) {
        ALOGW("%s: Returning early due to exception being thrown",
               __FUNCTION__);
        return;
    }
    if (metadata->isEmpty()) {
        std::unique_ptr<CameraMetadata> emptyBuffer = std::make_unique<CameraMetadata>(10);
        metadata->swap(*emptyBuffer);
    }

    camera_metadata_t *meta = const_cast<camera_metadata_t *>(metadata->getAndLock());
    set_camera_metadata_vendor_id(meta, vendorId);
    metadata->unlock(meta);
}

static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName,
        jlong vendorId) {
    ScopedUtfChars keyScoped(env, keyName);
+56 −27
Original line number Diff line number Diff line
@@ -134,6 +134,7 @@ public class CameraExtensionsProxyService extends Service {
            (!EXTENSIONS_VERSION.startsWith(NON_INIT_VERSION_PREFIX));

    private HashMap<String, CameraCharacteristics> mCharacteristicsHashMap = new HashMap<>();
    private HashMap<String, Long> mMetadataVendorIdMap = new HashMap<>();

    private static boolean checkForAdvancedAPI() {
        if (EXTENSIONS_PRESENT && EXTENSIONS_VERSION.startsWith(ADVANCED_VERSION_PREFIX)) {
@@ -464,8 +465,16 @@ public class CameraExtensionsProxyService extends Service {
            String [] cameraIds = manager.getCameraIdListNoLazy();
            if (cameraIds != null) {
                for (String cameraId : cameraIds) {
                    mCharacteristicsHashMap.put(cameraId,
                            manager.getCameraCharacteristics(cameraId));
                    CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId);
                    mCharacteristicsHashMap.put(cameraId, chars);
                    Object thisClass = CameraCharacteristics.Key.class;
                    Class<CameraCharacteristics.Key<?>> keyClass =
                            (Class<CameraCharacteristics.Key<?>>)thisClass;
                    ArrayList<CameraCharacteristics.Key<?>> vendorKeys =
                            chars.getNativeMetadata().getAllVendorKeys(keyClass);
                    if ((vendorKeys != null) && !vendorKeys.isEmpty()) {
                        mMetadataVendorIdMap.put(cameraId, vendorKeys.get(0).getVendorId());
                    }
                }
            }
        } catch (CameraAccessException e) {
@@ -529,13 +538,16 @@ public class CameraExtensionsProxyService extends Service {
        return ret;
    }

    private static CameraMetadataNative initializeParcelableMetadata(
            List<Pair<CaptureRequest.Key, Object>> paramList) {
    private CameraMetadataNative initializeParcelableMetadata(
            List<Pair<CaptureRequest.Key, Object>> paramList, String cameraId) {
        if (paramList == null) {
            return null;
        }

        CameraMetadataNative ret = new CameraMetadataNative();
        if (mMetadataVendorIdMap.containsKey(cameraId)) {
            ret.setVendorId(mMetadataVendorIdMap.get(cameraId));
        }
        for (Pair<CaptureRequest.Key, Object> param : paramList) {
            ret.set(param.first, param.second);
        }
@@ -543,13 +555,16 @@ public class CameraExtensionsProxyService extends Service {
        return ret;
    }

    private static CameraMetadataNative initializeParcelableMetadata(
            Map<CaptureRequest.Key<?>, Object> paramMap) {
    private CameraMetadataNative initializeParcelableMetadata(
            Map<CaptureRequest.Key<?>, Object> paramMap, String cameraId) {
        if (paramMap == null) {
            return null;
        }

        CameraMetadataNative ret = new CameraMetadataNative();
        if (mMetadataVendorIdMap.containsKey(cameraId)) {
            ret.setVendorId(mMetadataVendorIdMap.get(cameraId));
        }
        for (Map.Entry<CaptureRequest.Key<?>, Object> param : paramMap.entrySet()) {
            ret.set(((CaptureRequest.Key) param.getKey()), param.getValue());
        }
@@ -557,8 +572,8 @@ public class CameraExtensionsProxyService extends Service {
        return ret;
    }

    private static android.hardware.camera2.extension.CaptureStageImpl initializeParcelable(
            androidx.camera.extensions.impl.CaptureStageImpl captureStage) {
    private android.hardware.camera2.extension.CaptureStageImpl initializeParcelable(
            androidx.camera.extensions.impl.CaptureStageImpl captureStage, String cameraId) {
        if (captureStage == null) {
            return null;
        }
@@ -566,12 +581,13 @@ public class CameraExtensionsProxyService extends Service {
        android.hardware.camera2.extension.CaptureStageImpl ret =
                new android.hardware.camera2.extension.CaptureStageImpl();
        ret.id = captureStage.getId();
        ret.parameters = initializeParcelableMetadata(captureStage.getParameters());
        ret.parameters = initializeParcelableMetadata(captureStage.getParameters(), cameraId);

        return ret;
    }

    private Request initializeParcelable(RequestProcessorImpl.Request request, int requestId) {
    private Request initializeParcelable(RequestProcessorImpl.Request request, int requestId,
            String cameraId) {
        Request ret = new Request();
        ret.targetOutputConfigIds = new ArrayList<>();
        for (int id : request.getTargetOutputConfigIds()) {
@@ -580,7 +596,7 @@ public class CameraExtensionsProxyService extends Service {
            ret.targetOutputConfigIds.add(configId);
        }
        ret.templateId = request.getTemplateId();
        ret.parameters = initializeParcelableMetadata(request.getParameters());
        ret.parameters = initializeParcelableMetadata(request.getParameters(), cameraId);
        ret.requestId = requestId;
        return ret;
    }
@@ -933,9 +949,11 @@ public class CameraExtensionsProxyService extends Service {

    private class RequestProcessorStub implements RequestProcessorImpl {
        private final IRequestProcessorImpl mRequestProcessor;
        private final String mCameraId;

        public RequestProcessorStub(IRequestProcessorImpl requestProcessor) {
        public RequestProcessorStub(IRequestProcessorImpl requestProcessor, String cameraId) {
            mRequestProcessor = requestProcessor;
            mCameraId = cameraId;
        }

        @Override
@@ -964,7 +982,7 @@ public class CameraExtensionsProxyService extends Service {
                    new ArrayList<>();
            int requestId = 0;
            for (Request request : requests) {
                captureRequests.add(initializeParcelable(request, requestId));
                captureRequests.add(initializeParcelable(request, requestId, mCameraId));
                requestId++;
            }

@@ -982,7 +1000,8 @@ public class CameraExtensionsProxyService extends Service {
            try {
                ArrayList<Request> requests = new ArrayList<>();
                requests.add(request);
                return mRequestProcessor.setRepeating(initializeParcelable(request, 0),
                return mRequestProcessor.setRepeating(
                        initializeParcelable(request, 0, mCameraId),
                        new RequestCallbackStub(requests, callback));
            } catch (RemoteException e) {
                Log.e(TAG, "Failed to submit repeating request due to remote exception!");
@@ -1012,6 +1031,7 @@ public class CameraExtensionsProxyService extends Service {

    private class SessionProcessorImplStub extends ISessionProcessorImpl.Stub {
        private final SessionProcessorImpl mSessionProcessor;
        private String mCameraId = null;

        public SessionProcessorImplStub(SessionProcessorImpl sessionProcessor) {
            mSessionProcessor = sessionProcessor;
@@ -1074,7 +1094,8 @@ public class CameraExtensionsProxyService extends Service {
            }
            ret.sessionTemplateId = sessionConfig.getSessionTemplateId();
            ret.sessionParameter = initializeParcelableMetadata(
                    sessionConfig.getSessionParameters());
                    sessionConfig.getSessionParameters(), cameraId);
            mCameraId = cameraId;

            return ret;
        }
@@ -1086,7 +1107,8 @@ public class CameraExtensionsProxyService extends Service {

        @Override
        public void onCaptureSessionStart(IRequestProcessorImpl requestProcessor) {
            mSessionProcessor.onCaptureSessionStart(new RequestProcessorStub(requestProcessor));
            mSessionProcessor.onCaptureSessionStart(
                    new RequestProcessorStub(requestProcessor, mCameraId));
        }

        @Override
@@ -1143,6 +1165,7 @@ public class CameraExtensionsProxyService extends Service {

    private class PreviewExtenderImplStub extends IPreviewExtenderImpl.Stub {
        private final PreviewExtenderImpl mPreviewExtender;
        private String mCameraId = null;

        public PreviewExtenderImplStub(PreviewExtenderImpl previewExtender) {
            mPreviewExtender = previewExtender;
@@ -1150,6 +1173,7 @@ public class CameraExtensionsProxyService extends Service {

        @Override
        public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) {
            mCameraId = cameraId;
            mPreviewExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics),
                    CameraExtensionsProxyService.this);
        }
@@ -1161,17 +1185,17 @@ public class CameraExtensionsProxyService extends Service {

        @Override
        public CaptureStageImpl onPresetSession() {
            return initializeParcelable(mPreviewExtender.onPresetSession());
            return initializeParcelable(mPreviewExtender.onPresetSession(), mCameraId);
        }

        @Override
        public CaptureStageImpl onEnableSession() {
            return initializeParcelable(mPreviewExtender.onEnableSession());
            return initializeParcelable(mPreviewExtender.onEnableSession(), mCameraId);
        }

        @Override
        public CaptureStageImpl onDisableSession() {
            return initializeParcelable(mPreviewExtender.onDisableSession());
            return initializeParcelable(mPreviewExtender.onDisableSession(), mCameraId);
        }

        @Override
@@ -1187,7 +1211,7 @@ public class CameraExtensionsProxyService extends Service {

        @Override
        public CaptureStageImpl getCaptureStage() {
            return initializeParcelable(mPreviewExtender.getCaptureStage());
            return initializeParcelable(mPreviewExtender.getCaptureStage(), mCameraId);
        }

        @Override
@@ -1230,7 +1254,7 @@ public class CameraExtensionsProxyService extends Service {
            }

            if (processor != null) {
                return new RequestUpdateProcessorImplStub(processor);
                return new RequestUpdateProcessorImplStub(processor, mCameraId);
            }

            return null;
@@ -1251,6 +1275,7 @@ public class CameraExtensionsProxyService extends Service {

    private class ImageCaptureExtenderImplStub extends IImageCaptureExtenderImpl.Stub {
        private final ImageCaptureExtenderImpl mImageExtender;
        private String mCameraId = null;

        public ImageCaptureExtenderImplStub(ImageCaptureExtenderImpl imageExtender) {
            mImageExtender = imageExtender;
@@ -1260,6 +1285,7 @@ public class CameraExtensionsProxyService extends Service {
        public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) {
            mImageExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics),
                    CameraExtensionsProxyService.this);
            mCameraId = cameraId;
        }

        @Override
@@ -1269,17 +1295,17 @@ public class CameraExtensionsProxyService extends Service {

        @Override
        public CaptureStageImpl onPresetSession() {
            return initializeParcelable(mImageExtender.onPresetSession());
            return initializeParcelable(mImageExtender.onPresetSession(), mCameraId);
        }

        @Override
        public CaptureStageImpl onEnableSession() {
            return initializeParcelable(mImageExtender.onEnableSession());
            return initializeParcelable(mImageExtender.onEnableSession(), mCameraId);
        }

        @Override
        public CaptureStageImpl onDisableSession() {
            return initializeParcelable(mImageExtender.onDisableSession());
            return initializeParcelable(mImageExtender.onDisableSession(), mCameraId);
        }

        @Override
@@ -1312,7 +1338,7 @@ public class CameraExtensionsProxyService extends Service {
                ArrayList<android.hardware.camera2.extension.CaptureStageImpl> ret =
                        new ArrayList<>();
                for (androidx.camera.extensions.impl.CaptureStageImpl stage : captureStages) {
                    ret.add(initializeParcelable(stage));
                    ret.add(initializeParcelable(stage, mCameraId));
                }

                return ret;
@@ -1428,9 +1454,12 @@ public class CameraExtensionsProxyService extends Service {

    private class RequestUpdateProcessorImplStub extends IRequestUpdateProcessorImpl.Stub {
        private final RequestUpdateProcessorImpl mProcessor;
        private final String mCameraId;

        public RequestUpdateProcessorImplStub(RequestUpdateProcessorImpl processor) {
        public RequestUpdateProcessorImplStub(RequestUpdateProcessorImpl processor,
                String cameraId) {
            mProcessor = processor;
            mCameraId = cameraId;
        }

        @Override
@@ -1451,7 +1480,7 @@ public class CameraExtensionsProxyService extends Service {
        @Override
        public CaptureStageImpl process(CameraMetadataNative result, int sequenceId) {
            return initializeParcelable(
                    mProcessor.process(new TotalCaptureResult(result, sequenceId)));
                    mProcessor.process(new TotalCaptureResult(result, sequenceId)), mCameraId);
        }
    }