CameraDeviceUserShimpublic class CameraDeviceUserShim extends Object implements android.hardware.camera2.ICameraDeviceUserCompatibility implementation of the Camera2 API binder interface.
This is intended to be called from the same process as client
{@link android.hardware.camera2.CameraDevice}, and wraps a
{@link android.hardware.camera2.legacy.LegacyCameraDevice} that emulates Camera2 service using
the Camera1 API.
Keep up to date with ICameraDeviceUser.aidl.
|
Fields Summary |
---|
private static final String | TAG | private static final boolean | DEBUG | private static final int | OPEN_CAMERA_TIMEOUT_MS | private final LegacyCameraDevice | mLegacyDevice | private final Object | mConfigureLock | private int | mSurfaceIdCounter | private boolean | mConfiguring | private final android.util.SparseArray | mSurfaces | private final android.hardware.camera2.CameraCharacteristics | mCameraCharacteristics | private final CameraLooper | mCameraInit | private final CameraCallbackThread | mCameraCallbacks |
Methods Summary |
---|
public android.os.IBinder | asBinder()
// This is solely intended to be used for in-process binding.
return null;
| public int | beginConfigure()
if (DEBUG) {
Log.d(TAG, "beginConfigure called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot begin configure, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot begin configure, configuration change already in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
mConfiguring = true;
}
return CameraBinderDecorator.NO_ERROR;
| public int | cancelRequest(int requestId, android.hardware.camera2.utils.LongParcelable lastFrameNumber)
if (DEBUG) {
Log.d(TAG, "cancelRequest called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot cancel request, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot cancel request, configuration change in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
}
long lastFrame = mLegacyDevice.cancelRequest(requestId);
lastFrameNumber.setNumber(lastFrame);
return CameraBinderDecorator.NO_ERROR;
| public static android.hardware.camera2.legacy.CameraDeviceUserShim | connectBinderShim(android.hardware.camera2.ICameraDeviceCallbacks callbacks, int cameraId)
if (DEBUG) {
Log.d(TAG, "Opening shim Camera device");
}
/*
* Put the camera open on a separate thread with its own looper; otherwise
* if the main thread is used then the callbacks might never get delivered
* (e.g. in CTS which run its own default looper only after tests)
*/
CameraLooper init = new CameraLooper(cameraId);
CameraCallbackThread threadCallbacks = new CameraCallbackThread(callbacks);
// TODO: Make this async instead of blocking
int initErrors = init.waitForOpen(OPEN_CAMERA_TIMEOUT_MS);
Camera legacyCamera = init.getCamera();
// Check errors old HAL initialization
CameraBinderDecorator.throwOnError(initErrors);
// Disable shutter sounds (this will work unconditionally) for api2 clients
legacyCamera.disableShutterSound();
CameraInfo info = new CameraInfo();
Camera.getCameraInfo(cameraId, info);
Camera.Parameters legacyParameters = null;
try {
legacyParameters = legacyCamera.getParameters();
} catch (RuntimeException e) {
throw new CameraRuntimeException(CameraAccessException.CAMERA_ERROR,
"Unable to get initial parameters", e);
}
CameraCharacteristics characteristics =
LegacyMetadataMapper.createCharacteristics(legacyParameters, info);
LegacyCameraDevice device = new LegacyCameraDevice(
cameraId, legacyCamera, characteristics, threadCallbacks);
return new CameraDeviceUserShim(cameraId, device, characteristics, init, threadCallbacks);
| public int | createDefaultRequest(int templateId, android.hardware.camera2.impl.CameraMetadataNative request)
if (DEBUG) {
Log.d(TAG, "createDefaultRequest called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot create default request, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
CameraMetadataNative template;
try {
template =
LegacyMetadataMapper.createRequestTemplate(mCameraCharacteristics, templateId);
} catch (IllegalArgumentException e) {
Log.e(TAG, "createDefaultRequest - invalid templateId specified");
return CameraBinderDecorator.BAD_VALUE;
}
request.swap(template);
return CameraBinderDecorator.NO_ERROR;
| public int | createStream(int width, int height, int format, android.view.Surface surface)
if (DEBUG) {
Log.d(TAG, "createStream called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot create stream, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (!mConfiguring) {
Log.e(TAG, "Cannot create stream, beginConfigure hasn't been called yet.");
return CameraBinderDecorator.INVALID_OPERATION;
}
int id = ++mSurfaceIdCounter;
mSurfaces.put(id, surface);
return id;
}
| public int | deleteStream(int streamId)
if (DEBUG) {
Log.d(TAG, "deleteStream called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot delete stream, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (!mConfiguring) {
Log.e(TAG, "Cannot delete stream, beginConfigure hasn't been called yet.");
return CameraBinderDecorator.INVALID_OPERATION;
}
int index = mSurfaces.indexOfKey(streamId);
if (index < 0) {
Log.e(TAG, "Cannot delete stream, stream id " + streamId + " doesn't exist.");
return CameraBinderDecorator.BAD_VALUE;
}
mSurfaces.removeAt(index);
}
return CameraBinderDecorator.NO_ERROR;
| public void | disconnect()
if (DEBUG) {
Log.d(TAG, "disconnect called.");
}
if (mLegacyDevice.isClosed()) {
Log.w(TAG, "Cannot disconnect, device has already been closed.");
}
try {
mLegacyDevice.close();
} finally {
mCameraInit.close();
mCameraCallbacks.close();
}
| public int | endConfigure()
if (DEBUG) {
Log.d(TAG, "endConfigure called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot end configure, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
ArrayList<Surface> surfaces = null;
synchronized(mConfigureLock) {
if (!mConfiguring) {
Log.e(TAG, "Cannot end configure, no configuration change in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
int numSurfaces = mSurfaces.size();
if (numSurfaces > 0) {
surfaces = new ArrayList<>();
for (int i = 0; i < numSurfaces; ++i) {
surfaces.add(mSurfaces.valueAt(i));
}
}
mConfiguring = false;
}
return mLegacyDevice.configureOutputs(surfaces);
| public int | flush(android.hardware.camera2.utils.LongParcelable lastFrameNumber)
if (DEBUG) {
Log.d(TAG, "flush called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot flush, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot flush, configuration change in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
}
long lastFrame = mLegacyDevice.flush();
if (lastFrameNumber != null) {
lastFrameNumber.setNumber(lastFrame);
}
return CameraBinderDecorator.NO_ERROR;
| public int | getCameraInfo(android.hardware.camera2.impl.CameraMetadataNative info)
if (DEBUG) {
Log.d(TAG, "getCameraInfo called.");
}
// TODO: implement getCameraInfo.
Log.e(TAG, "getCameraInfo unimplemented.");
return CameraBinderDecorator.NO_ERROR;
| public int | submitRequest(android.hardware.camera2.CaptureRequest request, boolean streaming, android.hardware.camera2.utils.LongParcelable lastFrameNumber)
if (DEBUG) {
Log.d(TAG, "submitRequest called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot submit request, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot submit request, configuration change in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
}
return mLegacyDevice.submitRequest(request, streaming, lastFrameNumber);
| public int | submitRequestList(java.util.List request, boolean streaming, android.hardware.camera2.utils.LongParcelable lastFrameNumber)
if (DEBUG) {
Log.d(TAG, "submitRequestList called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot submit request list, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot submit request, configuration change in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
}
return mLegacyDevice.submitRequestList(request, streaming, lastFrameNumber);
| private static int | translateErrorsFromCamera1(int errorCode)
switch (errorCode) {
case CameraBinderDecorator.EACCES:
return CameraBinderDecorator.PERMISSION_DENIED;
default:
return errorCode;
}
| public int | waitUntilIdle()
if (DEBUG) {
Log.d(TAG, "waitUntilIdle called.");
}
if (mLegacyDevice.isClosed()) {
Log.e(TAG, "Cannot wait until idle, device has been closed.");
return CameraBinderDecorator.ENODEV;
}
synchronized(mConfigureLock) {
if (mConfiguring) {
Log.e(TAG, "Cannot wait until idle, configuration change in progress.");
return CameraBinderDecorator.INVALID_OPERATION;
}
}
mLegacyDevice.waitUntilIdle();
return CameraBinderDecorator.NO_ERROR;
|
|