Merge changes from topic "b194508189" into sc-dev

* changes:
  Camera: Support common outputs between regular and extension sessions
  Camera: Include the parceled image dimensions
This commit is contained in:
Emilian Peev
2021-07-29 00:20:06 +00:00
committed by Android (Google) Code Review
5 changed files with 73 additions and 45 deletions

View File

@@ -446,10 +446,16 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
}
}
@Override
protected void finalize() throws Throwable {
if (mHandlerThread != null) {
mHandlerThread.quitSafely();
}
super.finalize();
}
public void release() {
synchronized (mInterfaceLock) {
mHandlerThread.quitSafely();
if (mSessionProcessor != null) {
try {
mSessionProcessor.deInitSession();
@@ -812,6 +818,8 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes
Log.e(TAG,"Failed to parcel buffer fence!");
}
}
parcelImage.width = img.getWidth();
parcelImage.height = img.getHeight();
parcelImage.format = img.getFormat();
parcelImage.timestamp = img.getTimestamp();
parcelImage.transform = img.getTransform();

View File

@@ -696,6 +696,16 @@ public class CameraDeviceImpl extends CameraDevice
mCurrentSession.replaceSessionClose();
}
if (mCurrentExtensionSession != null) {
mCurrentExtensionSession.release();
mCurrentExtensionSession = null;
}
if (mCurrentAdvancedExtensionSession != null) {
mCurrentAdvancedExtensionSession.release();
mCurrentAdvancedExtensionSession = null;
}
// TODO: dont block for this
boolean configureSuccess = true;
CameraAccessException pendingException = null;

View File

@@ -49,8 +49,6 @@ import android.media.ImageWriter;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.IInterface;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.annotation.NonNull;
@@ -265,13 +263,6 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
} catch (ClassCastException e) {
throw new UnsupportedOperationException("Failed casting preview processor!");
}
if (mClientRepeatingRequestSurface != null) {
mPreviewRequestUpdateProcessor.onOutputSurface(mClientRepeatingRequestSurface,
nativeGetSurfaceFormat(mClientRepeatingRequestSurface));
mRepeatingRequestImageWriter = ImageWriter.newInstance(
mClientRepeatingRequestSurface, PREVIEW_QUEUE_SIZE,
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT);
}
mRepeatingRequestImageReader = ImageReader.newInstance(repeatingSurfaceInfo.mWidth,
repeatingSurfaceInfo.mHeight,
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT,
@@ -285,11 +276,6 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
mPreviewRequestUpdateProcessor.onImageFormatUpdate(
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT);
} else {
if (mClientRepeatingRequestSurface != null) {
mRepeatingRequestImageWriter = ImageWriter.newInstance(
mClientRepeatingRequestSurface, PREVIEW_QUEUE_SIZE,
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT);
}
mRepeatingRequestImageReader = ImageReader.newInstance(repeatingSurfaceInfo.mWidth,
repeatingSurfaceInfo.mHeight,
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT,
@@ -320,7 +306,6 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
mBurstCaptureImageReader = ImageReader.newInstance(surfaceInfo.mWidth,
surfaceInfo.mHeight, CameraExtensionCharacteristics.PROCESSING_INPUT_FORMAT,
mImageExtender.getMaxCaptureStage());
mImageProcessor.onOutputSurface(mClientCaptureSurface, surfaceInfo.mFormat);
} else {
// The client doesn't intend to trigger multi-frame capture, however the
// image extender still needs to get initialized and the camera still capture
@@ -367,6 +352,29 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
}
}
private void finishPipelineInitialization() throws RemoteException {
if (mClientRepeatingRequestSurface != null) {
if (mPreviewProcessorType == IPreviewExtenderImpl.PROCESSOR_TYPE_REQUEST_UPDATE_ONLY) {
mPreviewRequestUpdateProcessor.onOutputSurface(mClientRepeatingRequestSurface,
nativeGetSurfaceFormat(mClientRepeatingRequestSurface));
mRepeatingRequestImageWriter = ImageWriter.newInstance(
mClientRepeatingRequestSurface,
PREVIEW_QUEUE_SIZE,
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT);
} else if (mPreviewProcessorType == IPreviewExtenderImpl.PROCESSOR_TYPE_NONE) {
mRepeatingRequestImageWriter = ImageWriter.newInstance(
mClientRepeatingRequestSurface,
PREVIEW_QUEUE_SIZE,
CameraExtensionCharacteristics.NON_PROCESSING_INPUT_FORMAT);
}
}
if ((mImageProcessor != null) && (mClientCaptureSurface != null)) {
CameraExtensionUtils.SurfaceInfo surfaceInfo = CameraExtensionUtils.querySurface(
mClientCaptureSurface);
mImageProcessor.onOutputSurface(mClientCaptureSurface, surfaceInfo.mFormat);
}
}
/**
* @hide
*/
@@ -622,11 +630,18 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
new CameraExtensionUtils.HandlerExecutor(mHandler), requestHandler);
}
@Override
protected void finalize() throws Throwable {
if (mHandlerThread != null) {
mHandlerThread.quitSafely();
}
super.finalize();
}
/** @hide */
public void release() {
synchronized (mInterfaceLock) {
mInternalRepeatingRequestEnabled = false;
mHandlerThread.quitSafely();
try {
mPreviewExtender.onDeInit();
@@ -750,6 +765,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
synchronized (mInterfaceLock) {
mCaptureSession = session;
try {
finishPipelineInitialization();
CameraExtensionCharacteristics.initializeSession(mInitializeHandler);
} catch (RemoteException e) {
Log.e(TAG, "Failed to initialize session! Extension service does"
@@ -1640,6 +1656,8 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession {
Log.e(TAG,"Failed to parcel buffer fence!");
}
}
parcelImage.width = img.getWidth();
parcelImage.height = img.getHeight();
parcelImage.format = img.getFormat();
parcelImage.timestamp = img.getTimestamp();
parcelImage.transform = img.getTransform();

View File

@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.graphics.ImageFormat;
import android.graphics.PixelFormat;
import android.hardware.HardwareBuffer;
import android.hardware.camera2.CameraExtensionCharacteristics;
import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.params.StreamConfigurationMap;
@@ -78,41 +77,20 @@ public final class CameraExtensionUtils {
SurfaceInfo surfaceInfo = new SurfaceInfo();
int nativeFormat = SurfaceUtils.getSurfaceFormat(s);
int dataspace = SurfaceUtils.getSurfaceDataspace(s);
Size surfaceSize = SurfaceUtils.getSurfaceSize(s);
surfaceInfo.mFormat = nativeFormat;
surfaceInfo.mWidth = surfaceSize.getWidth();
surfaceInfo.mHeight = surfaceSize.getHeight();
surfaceInfo.mUsage = SurfaceUtils.getSurfaceUsage(s);
// Jpeg surfaces cannot be queried for their usage and other parameters
// in the usual way below. A buffer can only be de-queued after the
// producer overrides the surface dimensions to (width*height) x 1.
if ((nativeFormat == StreamConfigurationMap.HAL_PIXEL_FORMAT_BLOB) &&
(dataspace == StreamConfigurationMap.HAL_DATASPACE_V0_JFIF)) {
surfaceInfo.mFormat = ImageFormat.JPEG;
Size surfaceSize = SurfaceUtils.getSurfaceSize(s);
surfaceInfo.mWidth = surfaceSize.getWidth();
surfaceInfo.mHeight = surfaceSize.getHeight();
return surfaceInfo;
}
HardwareBuffer buffer = null;
try {
writer = ImageWriter.newInstance(s, 1);
img = writer.dequeueInputImage();
buffer = img.getHardwareBuffer();
surfaceInfo.mFormat = buffer.getFormat();
surfaceInfo.mWidth = buffer.getWidth();
surfaceInfo.mHeight = buffer.getHeight();
surfaceInfo.mUsage = buffer.getUsage();
} catch (Exception e) {
Log.e(TAG, "Failed to query surface, returning defaults!");
} finally {
if (buffer != null) {
buffer.close();
}
if (img != null) {
img.close();
}
if (writer != null) {
writer.close();
}
}
return surfaceInfo;
}

View File

@@ -104,6 +104,20 @@ public class SurfaceUtils {
}
}
/**
* Get the surface usage bits.
*
* @param surface The surface to be queried for usage.
* @return the native object id of the surface, 0 if surface is not backed by a native object.
*/
public static long getSurfaceUsage(Surface surface) {
checkNotNull(surface);
try {
return nativeDetectSurfaceUsageFlags(surface);
} catch (IllegalArgumentException e) {
return 0;
}
}
/**
* Get the Surface size.
*