Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f9a6090 authored by Zhijun He's avatar Zhijun He Committed by Android (Google) Code Review
Browse files

Merge "camera2: Implement CameraDevice#waitUntilIdle"

parents 616dfe37 7f4d3147
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -43,4 +43,6 @@ interface ICameraDeviceUser
    int createDefaultRequest(int templateId, out CameraMetadata request);

    int getCameraInfo(out CameraMetadata info);

    int waitUntilIdle();
}
+21 −4
Original line number Diff line number Diff line
@@ -65,9 +65,6 @@ public class CameraDevice implements android.hardware.photography.CameraDevice {
        return mCallbacks;
    }

    /**
     * @hide
     */
    public void setRemoteDevice(ICameraDeviceUser remoteDevice) {
        mRemoteDevice = remoteDevice;
    }
@@ -209,7 +206,22 @@ public class CameraDevice implements android.hardware.photography.CameraDevice {

    @Override
    public void waitUntilIdle() throws CameraAccessException {
        // TODO: implement

        synchronized (mLock) {
            checkIfCameraClosed();
            if (!mRepeatingRequestIdStack.isEmpty()) {
                throw new IllegalStateException("Active repeating request ongoing");
            }

            try {
                mRemoteDevice.waitUntilIdle();
            } catch (CameraRuntimeException e) {
                throw e.asChecked();
            } catch (RemoteException e) {
                // impossible
                return;
            }
      }
    }

    @Override
@@ -329,4 +341,9 @@ public class CameraDevice implements android.hardware.photography.CameraDevice {

    }

    private void checkIfCameraClosed() {
        if (mRemoteDevice == null) {
            throw new IllegalStateException("CameraDevice was already closed");
        }
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -300,7 +300,7 @@ static void Image_getLockedBufferInfo(JNIEnv* env, CpuConsumer::LockedBuffer* bu
    ALOG_ASSERT(size != NULL, "size is NULL!!!");
    ALOG_ASSERT((idx < IMAGE_READER_MAX_NUM_PLANES) && (idx >= 0));

    ALOGV("%s: buffer: 0x%p", __FUNCTION__, buffer);
    ALOGV("%s: buffer: %p", __FUNCTION__, buffer);

    uint32_t dataSize, ySize, cSize, cStride;
    uint8_t *cb, *cr;
@@ -633,7 +633,7 @@ static jboolean ImageReader_imageSetup(JNIEnv* env, jobject thiz,
    }
    status_t res = consumer->lockNextBuffer(buffer);
    if (res != NO_ERROR) {
        ALOGE("%s Fail to lockNextBuffer with error: 0x%x ", __FUNCTION__, res);
        ALOGE("%s Fail to lockNextBuffer with error: %d ", __FUNCTION__, res);
        return false;
    }

+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ public class CameraBinderTestUtils {

    protected static final int USE_CALLING_UID = -1;
    protected static final int BAD_VALUE = -22;
    protected static final int INVALID_OPERATION = -38;
    protected static final int ALREADY_EXISTS = -17;
    public static final int NO_ERROR = 0;
    private final Context mContext;
+45 −0
Original line number Diff line number Diff line
@@ -307,4 +307,49 @@ public class CameraDeviceBinderTest extends AndroidTestCase {
        assertNotNull(info.get(CameraPropertiesKeys.Scaler.AVAILABLE_FORMATS));
    }

    @SmallTest
    public void testWaitUntilIdle() throws Exception {
        CameraMetadata metadata = new CameraMetadata();
        assertTrue(metadata.isEmpty());

        CaptureRequest request = new CaptureRequest();
        assertTrue(request.isEmpty());

        // Create default request from template.
        int status = mCameraUser.createDefaultRequest(TEMPLATE_PREVIEW, /* out */metadata);
        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
        assertFalse(metadata.isEmpty());

        request.swap(metadata);
        assertFalse(request.isEmpty());
        assertTrue(metadata.isEmpty());

        SurfaceTexture surfaceTexture = new SurfaceTexture(/* ignored */0);
        surfaceTexture.setDefaultBufferSize(640, 480);
        Surface surface = new Surface(surfaceTexture);

        // Create stream first. Pre-requisite to submitting a request using that
        // stream.

        int streamId = mCameraUser.createStream(/* ignored */10, /* ignored */20, /* ignored */30,
                surface);
        assertEquals(0, streamId);

        request.addTarget(surface);

        int requestIdStreaming = mCameraUser.submitRequest(request, /* streaming */true);
        assertTrue("Request IDs should be non-negative", requestIdStreaming >= 0);

        // Test Bad case first: waitUntilIdle when there is active repeating request
        status = mCameraUser.waitUntilIdle();
        assertEquals("waitUntilIdle is invalid operation when there is active repeating request",
            CameraBinderTestUtils.INVALID_OPERATION, status);

        // Test good case, waitUntilIdle when there is no active repeating request
        status = mCameraUser.cancelRequest(requestIdStreaming);
        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
        status = mCameraUser.waitUntilIdle();
        assertEquals(CameraBinderTestUtils.NO_ERROR, status);
    }

}