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

This commit is contained in:
TreeHugger Robot
2021-07-08 20:20:19 +00:00
committed by Android (Google) Code Review
3 changed files with 94 additions and 27 deletions

View File

@@ -1884,6 +1884,8 @@ public class CameraMetadataNative implements Parcelable {
private static native int nativeGetEntryCount(long ptr); private static native int nativeGetEntryCount(long ptr);
@FastNative @FastNative
private static native long nativeGetBufferSize(long ptr); 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) @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@FastNative @FastNative
@@ -1928,6 +1930,15 @@ public class CameraMetadataNative implements Parcelable {
other.updateNativeAllocation(); other.updateNativeAllocation();
} }
/**
* Set the native metadata vendor id.
*
* @hide
*/
public void setVendorId(long vendorId) {
nativeSetVendorId(mMetadataPtr, vendorId);
}
/** /**
* @hide * @hide
*/ */

View File

@@ -16,6 +16,7 @@
*/ */
// #define LOG_NDEBUG 0 // #define LOG_NDEBUG 0
#include <memory>
#define LOG_TAG "CameraMetadata-JNI" #define LOG_TAG "CameraMetadata-JNI"
#include <utils/Errors.h> #include <utils/Errors.h>
#include <utils/Log.h> #include <utils/Log.h>
@@ -162,6 +163,8 @@ struct Helpers {
extern "C" { extern "C" {
static void CameraMetadata_setVendorId(JNIEnv* env, jclass thiz, jlong ptr,
jlong vendorId);
static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr,
jclass keyType); jclass keyType);
static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, 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 const JNINativeMethod gCameraMetadataMethods[] = {
// static methods // static methods
{ "nativeSetVendorId",
"(JJ)V",
(void *)CameraMetadata_setVendorId },
{ "nativeGetTagFromKey", { "nativeGetTagFromKey",
"(Ljava/lang/String;J)I", "(Ljava/lang/String;J)I",
(void *)CameraMetadata_getTagFromKey }, (void *)CameraMetadata_getTagFromKey },
@@ -870,6 +876,27 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong p
return arrayList; 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, static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName,
jlong vendorId) { jlong vendorId) {
ScopedUtfChars keyScoped(env, keyName); ScopedUtfChars keyScoped(env, keyName);

View File

@@ -134,6 +134,7 @@ public class CameraExtensionsProxyService extends Service {
(!EXTENSIONS_VERSION.startsWith(NON_INIT_VERSION_PREFIX)); (!EXTENSIONS_VERSION.startsWith(NON_INIT_VERSION_PREFIX));
private HashMap<String, CameraCharacteristics> mCharacteristicsHashMap = new HashMap<>(); private HashMap<String, CameraCharacteristics> mCharacteristicsHashMap = new HashMap<>();
private HashMap<String, Long> mMetadataVendorIdMap = new HashMap<>();
private static boolean checkForAdvancedAPI() { private static boolean checkForAdvancedAPI() {
if (EXTENSIONS_PRESENT && EXTENSIONS_VERSION.startsWith(ADVANCED_VERSION_PREFIX)) { if (EXTENSIONS_PRESENT && EXTENSIONS_VERSION.startsWith(ADVANCED_VERSION_PREFIX)) {
@@ -464,8 +465,16 @@ public class CameraExtensionsProxyService extends Service {
String [] cameraIds = manager.getCameraIdListNoLazy(); String [] cameraIds = manager.getCameraIdListNoLazy();
if (cameraIds != null) { if (cameraIds != null) {
for (String cameraId : cameraIds) { for (String cameraId : cameraIds) {
mCharacteristicsHashMap.put(cameraId, CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId);
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) { } catch (CameraAccessException e) {
@@ -529,13 +538,16 @@ public class CameraExtensionsProxyService extends Service {
return ret; return ret;
} }
private static CameraMetadataNative initializeParcelableMetadata( private CameraMetadataNative initializeParcelableMetadata(
List<Pair<CaptureRequest.Key, Object>> paramList) { List<Pair<CaptureRequest.Key, Object>> paramList, String cameraId) {
if (paramList == null) { if (paramList == null) {
return null; return null;
} }
CameraMetadataNative ret = new CameraMetadataNative(); CameraMetadataNative ret = new CameraMetadataNative();
if (mMetadataVendorIdMap.containsKey(cameraId)) {
ret.setVendorId(mMetadataVendorIdMap.get(cameraId));
}
for (Pair<CaptureRequest.Key, Object> param : paramList) { for (Pair<CaptureRequest.Key, Object> param : paramList) {
ret.set(param.first, param.second); ret.set(param.first, param.second);
} }
@@ -543,13 +555,16 @@ public class CameraExtensionsProxyService extends Service {
return ret; return ret;
} }
private static CameraMetadataNative initializeParcelableMetadata( private CameraMetadataNative initializeParcelableMetadata(
Map<CaptureRequest.Key<?>, Object> paramMap) { Map<CaptureRequest.Key<?>, Object> paramMap, String cameraId) {
if (paramMap == null) { if (paramMap == null) {
return null; return null;
} }
CameraMetadataNative ret = new CameraMetadataNative(); CameraMetadataNative ret = new CameraMetadataNative();
if (mMetadataVendorIdMap.containsKey(cameraId)) {
ret.setVendorId(mMetadataVendorIdMap.get(cameraId));
}
for (Map.Entry<CaptureRequest.Key<?>, Object> param : paramMap.entrySet()) { for (Map.Entry<CaptureRequest.Key<?>, Object> param : paramMap.entrySet()) {
ret.set(((CaptureRequest.Key) param.getKey()), param.getValue()); ret.set(((CaptureRequest.Key) param.getKey()), param.getValue());
} }
@@ -557,8 +572,8 @@ public class CameraExtensionsProxyService extends Service {
return ret; return ret;
} }
private static android.hardware.camera2.extension.CaptureStageImpl initializeParcelable( private android.hardware.camera2.extension.CaptureStageImpl initializeParcelable(
androidx.camera.extensions.impl.CaptureStageImpl captureStage) { androidx.camera.extensions.impl.CaptureStageImpl captureStage, String cameraId) {
if (captureStage == null) { if (captureStage == null) {
return null; return null;
} }
@@ -566,12 +581,13 @@ public class CameraExtensionsProxyService extends Service {
android.hardware.camera2.extension.CaptureStageImpl ret = android.hardware.camera2.extension.CaptureStageImpl ret =
new android.hardware.camera2.extension.CaptureStageImpl(); new android.hardware.camera2.extension.CaptureStageImpl();
ret.id = captureStage.getId(); ret.id = captureStage.getId();
ret.parameters = initializeParcelableMetadata(captureStage.getParameters()); ret.parameters = initializeParcelableMetadata(captureStage.getParameters(), cameraId);
return ret; return ret;
} }
private Request initializeParcelable(RequestProcessorImpl.Request request, int requestId) { private Request initializeParcelable(RequestProcessorImpl.Request request, int requestId,
String cameraId) {
Request ret = new Request(); Request ret = new Request();
ret.targetOutputConfigIds = new ArrayList<>(); ret.targetOutputConfigIds = new ArrayList<>();
for (int id : request.getTargetOutputConfigIds()) { for (int id : request.getTargetOutputConfigIds()) {
@@ -580,7 +596,7 @@ public class CameraExtensionsProxyService extends Service {
ret.targetOutputConfigIds.add(configId); ret.targetOutputConfigIds.add(configId);
} }
ret.templateId = request.getTemplateId(); ret.templateId = request.getTemplateId();
ret.parameters = initializeParcelableMetadata(request.getParameters()); ret.parameters = initializeParcelableMetadata(request.getParameters(), cameraId);
ret.requestId = requestId; ret.requestId = requestId;
return ret; return ret;
} }
@@ -933,9 +949,11 @@ public class CameraExtensionsProxyService extends Service {
private class RequestProcessorStub implements RequestProcessorImpl { private class RequestProcessorStub implements RequestProcessorImpl {
private final IRequestProcessorImpl mRequestProcessor; private final IRequestProcessorImpl mRequestProcessor;
private final String mCameraId;
public RequestProcessorStub(IRequestProcessorImpl requestProcessor) { public RequestProcessorStub(IRequestProcessorImpl requestProcessor, String cameraId) {
mRequestProcessor = requestProcessor; mRequestProcessor = requestProcessor;
mCameraId = cameraId;
} }
@Override @Override
@@ -964,7 +982,7 @@ public class CameraExtensionsProxyService extends Service {
new ArrayList<>(); new ArrayList<>();
int requestId = 0; int requestId = 0;
for (Request request : requests) { for (Request request : requests) {
captureRequests.add(initializeParcelable(request, requestId)); captureRequests.add(initializeParcelable(request, requestId, mCameraId));
requestId++; requestId++;
} }
@@ -982,7 +1000,8 @@ public class CameraExtensionsProxyService extends Service {
try { try {
ArrayList<Request> requests = new ArrayList<>(); ArrayList<Request> requests = new ArrayList<>();
requests.add(request); requests.add(request);
return mRequestProcessor.setRepeating(initializeParcelable(request, 0), return mRequestProcessor.setRepeating(
initializeParcelable(request, 0, mCameraId),
new RequestCallbackStub(requests, callback)); new RequestCallbackStub(requests, callback));
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Failed to submit repeating request due to remote exception!"); 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 class SessionProcessorImplStub extends ISessionProcessorImpl.Stub {
private final SessionProcessorImpl mSessionProcessor; private final SessionProcessorImpl mSessionProcessor;
private String mCameraId = null;
public SessionProcessorImplStub(SessionProcessorImpl sessionProcessor) { public SessionProcessorImplStub(SessionProcessorImpl sessionProcessor) {
mSessionProcessor = sessionProcessor; mSessionProcessor = sessionProcessor;
@@ -1074,7 +1094,8 @@ public class CameraExtensionsProxyService extends Service {
} }
ret.sessionTemplateId = sessionConfig.getSessionTemplateId(); ret.sessionTemplateId = sessionConfig.getSessionTemplateId();
ret.sessionParameter = initializeParcelableMetadata( ret.sessionParameter = initializeParcelableMetadata(
sessionConfig.getSessionParameters()); sessionConfig.getSessionParameters(), cameraId);
mCameraId = cameraId;
return ret; return ret;
} }
@@ -1086,7 +1107,8 @@ public class CameraExtensionsProxyService extends Service {
@Override @Override
public void onCaptureSessionStart(IRequestProcessorImpl requestProcessor) { public void onCaptureSessionStart(IRequestProcessorImpl requestProcessor) {
mSessionProcessor.onCaptureSessionStart(new RequestProcessorStub(requestProcessor)); mSessionProcessor.onCaptureSessionStart(
new RequestProcessorStub(requestProcessor, mCameraId));
} }
@Override @Override
@@ -1143,6 +1165,7 @@ public class CameraExtensionsProxyService extends Service {
private class PreviewExtenderImplStub extends IPreviewExtenderImpl.Stub { private class PreviewExtenderImplStub extends IPreviewExtenderImpl.Stub {
private final PreviewExtenderImpl mPreviewExtender; private final PreviewExtenderImpl mPreviewExtender;
private String mCameraId = null;
public PreviewExtenderImplStub(PreviewExtenderImpl previewExtender) { public PreviewExtenderImplStub(PreviewExtenderImpl previewExtender) {
mPreviewExtender = previewExtender; mPreviewExtender = previewExtender;
@@ -1150,6 +1173,7 @@ public class CameraExtensionsProxyService extends Service {
@Override @Override
public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) { public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) {
mCameraId = cameraId;
mPreviewExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics), mPreviewExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics),
CameraExtensionsProxyService.this); CameraExtensionsProxyService.this);
} }
@@ -1161,17 +1185,17 @@ public class CameraExtensionsProxyService extends Service {
@Override @Override
public CaptureStageImpl onPresetSession() { public CaptureStageImpl onPresetSession() {
return initializeParcelable(mPreviewExtender.onPresetSession()); return initializeParcelable(mPreviewExtender.onPresetSession(), mCameraId);
} }
@Override @Override
public CaptureStageImpl onEnableSession() { public CaptureStageImpl onEnableSession() {
return initializeParcelable(mPreviewExtender.onEnableSession()); return initializeParcelable(mPreviewExtender.onEnableSession(), mCameraId);
} }
@Override @Override
public CaptureStageImpl onDisableSession() { public CaptureStageImpl onDisableSession() {
return initializeParcelable(mPreviewExtender.onDisableSession()); return initializeParcelable(mPreviewExtender.onDisableSession(), mCameraId);
} }
@Override @Override
@@ -1187,7 +1211,7 @@ public class CameraExtensionsProxyService extends Service {
@Override @Override
public CaptureStageImpl getCaptureStage() { public CaptureStageImpl getCaptureStage() {
return initializeParcelable(mPreviewExtender.getCaptureStage()); return initializeParcelable(mPreviewExtender.getCaptureStage(), mCameraId);
} }
@Override @Override
@@ -1230,7 +1254,7 @@ public class CameraExtensionsProxyService extends Service {
} }
if (processor != null) { if (processor != null) {
return new RequestUpdateProcessorImplStub(processor); return new RequestUpdateProcessorImplStub(processor, mCameraId);
} }
return null; return null;
@@ -1251,6 +1275,7 @@ public class CameraExtensionsProxyService extends Service {
private class ImageCaptureExtenderImplStub extends IImageCaptureExtenderImpl.Stub { private class ImageCaptureExtenderImplStub extends IImageCaptureExtenderImpl.Stub {
private final ImageCaptureExtenderImpl mImageExtender; private final ImageCaptureExtenderImpl mImageExtender;
private String mCameraId = null;
public ImageCaptureExtenderImplStub(ImageCaptureExtenderImpl imageExtender) { public ImageCaptureExtenderImplStub(ImageCaptureExtenderImpl imageExtender) {
mImageExtender = imageExtender; mImageExtender = imageExtender;
@@ -1260,6 +1285,7 @@ public class CameraExtensionsProxyService extends Service {
public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) { public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) {
mImageExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics), mImageExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics),
CameraExtensionsProxyService.this); CameraExtensionsProxyService.this);
mCameraId = cameraId;
} }
@Override @Override
@@ -1269,17 +1295,17 @@ public class CameraExtensionsProxyService extends Service {
@Override @Override
public CaptureStageImpl onPresetSession() { public CaptureStageImpl onPresetSession() {
return initializeParcelable(mImageExtender.onPresetSession()); return initializeParcelable(mImageExtender.onPresetSession(), mCameraId);
} }
@Override @Override
public CaptureStageImpl onEnableSession() { public CaptureStageImpl onEnableSession() {
return initializeParcelable(mImageExtender.onEnableSession()); return initializeParcelable(mImageExtender.onEnableSession(), mCameraId);
} }
@Override @Override
public CaptureStageImpl onDisableSession() { public CaptureStageImpl onDisableSession() {
return initializeParcelable(mImageExtender.onDisableSession()); return initializeParcelable(mImageExtender.onDisableSession(), mCameraId);
} }
@Override @Override
@@ -1312,7 +1338,7 @@ public class CameraExtensionsProxyService extends Service {
ArrayList<android.hardware.camera2.extension.CaptureStageImpl> ret = ArrayList<android.hardware.camera2.extension.CaptureStageImpl> ret =
new ArrayList<>(); new ArrayList<>();
for (androidx.camera.extensions.impl.CaptureStageImpl stage : captureStages) { for (androidx.camera.extensions.impl.CaptureStageImpl stage : captureStages) {
ret.add(initializeParcelable(stage)); ret.add(initializeParcelable(stage, mCameraId));
} }
return ret; return ret;
@@ -1428,9 +1454,12 @@ public class CameraExtensionsProxyService extends Service {
private class RequestUpdateProcessorImplStub extends IRequestUpdateProcessorImpl.Stub { private class RequestUpdateProcessorImplStub extends IRequestUpdateProcessorImpl.Stub {
private final RequestUpdateProcessorImpl mProcessor; private final RequestUpdateProcessorImpl mProcessor;
private final String mCameraId;
public RequestUpdateProcessorImplStub(RequestUpdateProcessorImpl processor) { public RequestUpdateProcessorImplStub(RequestUpdateProcessorImpl processor,
String cameraId) {
mProcessor = processor; mProcessor = processor;
mCameraId = cameraId;
} }
@Override @Override
@@ -1451,7 +1480,7 @@ public class CameraExtensionsProxyService extends Service {
@Override @Override
public CaptureStageImpl process(CameraMetadataNative result, int sequenceId) { public CaptureStageImpl process(CameraMetadataNative result, int sequenceId) {
return initializeParcelable( return initializeParcelable(
mProcessor.process(new TotalCaptureResult(result, sequenceId))); mProcessor.process(new TotalCaptureResult(result, sequenceId)), mCameraId);
} }
} }