Camera: Set metadata vendor id in extension proxy service
Set the appropriate vendor id for any native metadata instantiated within the camera extension proxy service. Bug: 187341271 Test: Partner verified, Camera CTS Change-Id: I07e0be304baac017d44606c1612a24c520bed588
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user