Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -19675,6 +19675,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata<android.hardware.camera2.CaptureRequest.Key<?>> implements android.os.Parcelable { method public int describeContents(); method @FlaggedApi("com.android.internal.camera.flags.surface_leak_fix") protected void finalize(); method @Nullable public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method @NonNull public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getKeys(); method @Nullable public Object getTag(); core/java/android/hardware/camera2/CaptureRequest.java +16 −0 Original line number Diff line number Diff line Loading @@ -309,6 +309,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> private Object mUserTag; private boolean mReleaseSurfaces = false; /** * Construct empty request. * Loading Loading @@ -610,6 +612,9 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> Parcelable[] parcelableArray = in.readParcelableArray(Surface.class.getClassLoader(), Surface.class); if (parcelableArray != null) { if (Flags.surfaceLeakFix()) { mReleaseSurfaces = true; } for (Parcelable p : parcelableArray) { Surface s = (Surface) p; mSurfaceSet.add(s); Loading Loading @@ -792,6 +797,17 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> } } @SuppressWarnings("Finalize") @FlaggedApi(Flags.FLAG_SURFACE_LEAK_FIX) @Override protected void finalize() { if (mReleaseSurfaces) { for (Surface s : mSurfaceSet) { s.release(); } } } /** * A builder for capture requests. * Loading core/java/android/hardware/camera2/extension/SessionProcessor.java +20 −0 Original line number Diff line number Diff line Loading @@ -363,11 +363,20 @@ public abstract class SessionProcessor { private final class SessionProcessorImpl extends ISessionProcessorImpl.Stub { private long mVendorId = -1; OutputSurface mImageCaptureSurface; OutputSurface mPreviewSurface; OutputSurface mPostviewSurface; @Override public CameraSessionConfig initSession(IBinder token, String cameraId, Map<String, CameraMetadataNative> charsMap, OutputSurface previewSurface, OutputSurface imageCaptureSurface, OutputSurface postviewSurface) throws RemoteException { if (Flags.surfaceLeakFix()) { mPreviewSurface = previewSurface; mPostviewSurface = postviewSurface; mImageCaptureSurface = imageCaptureSurface; } ExtensionConfiguration config = SessionProcessor.this.initSession(token, cameraId, new CharacteristicsMap(charsMap), new CameraOutputSurface(previewSurface), Loading @@ -390,6 +399,17 @@ public abstract class SessionProcessor { @Override public void deInitSession(IBinder token) throws RemoteException { SessionProcessor.this.deInitSession(token); if (Flags.surfaceLeakFix()) { if ((mPreviewSurface != null) && (mPreviewSurface.surface != null)) { mPreviewSurface.surface.release(); } if ((mImageCaptureSurface != null) && (mImageCaptureSurface.surface != null)) { mImageCaptureSurface.surface.release(); } if ((mPostviewSurface != null) && (mPostviewSurface.surface != null)) { mPostviewSurface.surface.release(); } } } @Override Loading packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java +24 −11 Original line number Diff line number Diff line Loading @@ -1566,6 +1566,10 @@ public class CameraExtensionsProxyService extends Service { private String mCameraId = null; private IBinder mToken; OutputSurfaceImplStub mOutputPreviewSurfaceImpl; OutputSurfaceImplStub mOutputImageCaptureSurfaceImpl; OutputSurfaceImplStub mOutputPostviewSurfaceImpl; public SessionProcessorImplStub(SessionProcessorImpl sessionProcessor) { mSessionProcessor = sessionProcessor; } Loading @@ -1574,21 +1578,18 @@ public class CameraExtensionsProxyService extends Service { public CameraSessionConfig initSession(IBinder token, String cameraId, Map<String, CameraMetadataNative> charsMapNative, OutputSurface previewSurface, OutputSurface imageCaptureSurface, OutputSurface postviewSurface) { OutputSurfaceImplStub outputPreviewSurfaceImpl = new OutputSurfaceImplStub(previewSurface); OutputSurfaceImplStub outputImageCaptureSurfaceImpl = new OutputSurfaceImplStub(imageCaptureSurface); OutputSurfaceImplStub outputPostviewSurfaceImpl = new OutputSurfaceImplStub(postviewSurface); mOutputPreviewSurfaceImpl = new OutputSurfaceImplStub(previewSurface); mOutputImageCaptureSurfaceImpl = new OutputSurfaceImplStub(imageCaptureSurface); mOutputPostviewSurfaceImpl = new OutputSurfaceImplStub(postviewSurface); Camera2SessionConfigImpl sessionConfig; if (LATENCY_IMPROVEMENTS_SUPPORTED) { OutputSurfaceConfigurationImplStub outputSurfaceConfigs = new OutputSurfaceConfigurationImplStub(outputPreviewSurfaceImpl, new OutputSurfaceConfigurationImplStub(mOutputPreviewSurfaceImpl, // Image Analysis Output is currently only supported in CameraX outputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/, outputPostviewSurfaceImpl); mOutputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/, mOutputPostviewSurfaceImpl); sessionConfig = mSessionProcessor.initSession(cameraId, getCharacteristicsMap(charsMapNative), Loading @@ -1596,8 +1597,8 @@ public class CameraExtensionsProxyService extends Service { } else { sessionConfig = mSessionProcessor.initSession(cameraId, getCharacteristicsMap(charsMapNative), getApplicationContext(), outputPreviewSurfaceImpl, outputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/); getApplicationContext(), mOutputPreviewSurfaceImpl, mOutputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/); } List<Camera2OutputConfigImpl> outputConfigs = sessionConfig.getOutputConfigs(); Loading Loading @@ -1632,6 +1633,18 @@ public class CameraExtensionsProxyService extends Service { public void deInitSession(IBinder token) { CameraExtensionsProxyService.unregisterDeathRecipient(mToken, this); mSessionProcessor.deInitSession(); if (Flags.surfaceLeakFix()) { if (mOutputImageCaptureSurfaceImpl.mSurface != null) { mOutputImageCaptureSurfaceImpl.mSurface.release(); } if (mOutputPreviewSurfaceImpl.mSurface != null) { mOutputPreviewSurfaceImpl.mSurface.release(); } if (mOutputPostviewSurfaceImpl.mSurface != null) { mOutputPostviewSurfaceImpl.mSurface.release(); } } } @Override Loading Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -19675,6 +19675,7 @@ package android.hardware.camera2 { public final class CaptureRequest extends android.hardware.camera2.CameraMetadata<android.hardware.camera2.CaptureRequest.Key<?>> implements android.os.Parcelable { method public int describeContents(); method @FlaggedApi("com.android.internal.camera.flags.surface_leak_fix") protected void finalize(); method @Nullable public <T> T get(android.hardware.camera2.CaptureRequest.Key<T>); method @NonNull public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getKeys(); method @Nullable public Object getTag();
core/java/android/hardware/camera2/CaptureRequest.java +16 −0 Original line number Diff line number Diff line Loading @@ -309,6 +309,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> private Object mUserTag; private boolean mReleaseSurfaces = false; /** * Construct empty request. * Loading Loading @@ -610,6 +612,9 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> Parcelable[] parcelableArray = in.readParcelableArray(Surface.class.getClassLoader(), Surface.class); if (parcelableArray != null) { if (Flags.surfaceLeakFix()) { mReleaseSurfaces = true; } for (Parcelable p : parcelableArray) { Surface s = (Surface) p; mSurfaceSet.add(s); Loading Loading @@ -792,6 +797,17 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> } } @SuppressWarnings("Finalize") @FlaggedApi(Flags.FLAG_SURFACE_LEAK_FIX) @Override protected void finalize() { if (mReleaseSurfaces) { for (Surface s : mSurfaceSet) { s.release(); } } } /** * A builder for capture requests. * Loading
core/java/android/hardware/camera2/extension/SessionProcessor.java +20 −0 Original line number Diff line number Diff line Loading @@ -363,11 +363,20 @@ public abstract class SessionProcessor { private final class SessionProcessorImpl extends ISessionProcessorImpl.Stub { private long mVendorId = -1; OutputSurface mImageCaptureSurface; OutputSurface mPreviewSurface; OutputSurface mPostviewSurface; @Override public CameraSessionConfig initSession(IBinder token, String cameraId, Map<String, CameraMetadataNative> charsMap, OutputSurface previewSurface, OutputSurface imageCaptureSurface, OutputSurface postviewSurface) throws RemoteException { if (Flags.surfaceLeakFix()) { mPreviewSurface = previewSurface; mPostviewSurface = postviewSurface; mImageCaptureSurface = imageCaptureSurface; } ExtensionConfiguration config = SessionProcessor.this.initSession(token, cameraId, new CharacteristicsMap(charsMap), new CameraOutputSurface(previewSurface), Loading @@ -390,6 +399,17 @@ public abstract class SessionProcessor { @Override public void deInitSession(IBinder token) throws RemoteException { SessionProcessor.this.deInitSession(token); if (Flags.surfaceLeakFix()) { if ((mPreviewSurface != null) && (mPreviewSurface.surface != null)) { mPreviewSurface.surface.release(); } if ((mImageCaptureSurface != null) && (mImageCaptureSurface.surface != null)) { mImageCaptureSurface.surface.release(); } if ((mPostviewSurface != null) && (mPostviewSurface.surface != null)) { mPostviewSurface.surface.release(); } } } @Override Loading
packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java +24 −11 Original line number Diff line number Diff line Loading @@ -1566,6 +1566,10 @@ public class CameraExtensionsProxyService extends Service { private String mCameraId = null; private IBinder mToken; OutputSurfaceImplStub mOutputPreviewSurfaceImpl; OutputSurfaceImplStub mOutputImageCaptureSurfaceImpl; OutputSurfaceImplStub mOutputPostviewSurfaceImpl; public SessionProcessorImplStub(SessionProcessorImpl sessionProcessor) { mSessionProcessor = sessionProcessor; } Loading @@ -1574,21 +1578,18 @@ public class CameraExtensionsProxyService extends Service { public CameraSessionConfig initSession(IBinder token, String cameraId, Map<String, CameraMetadataNative> charsMapNative, OutputSurface previewSurface, OutputSurface imageCaptureSurface, OutputSurface postviewSurface) { OutputSurfaceImplStub outputPreviewSurfaceImpl = new OutputSurfaceImplStub(previewSurface); OutputSurfaceImplStub outputImageCaptureSurfaceImpl = new OutputSurfaceImplStub(imageCaptureSurface); OutputSurfaceImplStub outputPostviewSurfaceImpl = new OutputSurfaceImplStub(postviewSurface); mOutputPreviewSurfaceImpl = new OutputSurfaceImplStub(previewSurface); mOutputImageCaptureSurfaceImpl = new OutputSurfaceImplStub(imageCaptureSurface); mOutputPostviewSurfaceImpl = new OutputSurfaceImplStub(postviewSurface); Camera2SessionConfigImpl sessionConfig; if (LATENCY_IMPROVEMENTS_SUPPORTED) { OutputSurfaceConfigurationImplStub outputSurfaceConfigs = new OutputSurfaceConfigurationImplStub(outputPreviewSurfaceImpl, new OutputSurfaceConfigurationImplStub(mOutputPreviewSurfaceImpl, // Image Analysis Output is currently only supported in CameraX outputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/, outputPostviewSurfaceImpl); mOutputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/, mOutputPostviewSurfaceImpl); sessionConfig = mSessionProcessor.initSession(cameraId, getCharacteristicsMap(charsMapNative), Loading @@ -1596,8 +1597,8 @@ public class CameraExtensionsProxyService extends Service { } else { sessionConfig = mSessionProcessor.initSession(cameraId, getCharacteristicsMap(charsMapNative), getApplicationContext(), outputPreviewSurfaceImpl, outputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/); getApplicationContext(), mOutputPreviewSurfaceImpl, mOutputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/); } List<Camera2OutputConfigImpl> outputConfigs = sessionConfig.getOutputConfigs(); Loading Loading @@ -1632,6 +1633,18 @@ public class CameraExtensionsProxyService extends Service { public void deInitSession(IBinder token) { CameraExtensionsProxyService.unregisterDeathRecipient(mToken, this); mSessionProcessor.deInitSession(); if (Flags.surfaceLeakFix()) { if (mOutputImageCaptureSurfaceImpl.mSurface != null) { mOutputImageCaptureSurfaceImpl.mSurface.release(); } if (mOutputPreviewSurfaceImpl.mSurface != null) { mOutputPreviewSurfaceImpl.mSurface.release(); } if (mOutputPostviewSurfaceImpl.mSurface != null) { mOutputPostviewSurfaceImpl.mSurface.release(); } } } @Override Loading