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

Commit 81f05702 authored by Automerger Merge Worker's avatar Automerger Merge Worker Committed by Android (Google) Code Review
Browse files

Merge "Merge "Camera: Add support for readout timestamp" into tm-d1-dev am:...

Merge "Merge "Camera: Add support for readout timestamp" into tm-d1-dev am: daf69b3d" into tm-d1-dev-plus-aosp
parents 60001535 efe41a46
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -1233,6 +1233,41 @@ public abstract class CameraCaptureSession implements AutoCloseable {
            // default empty implementation
        }

        /**
         * This method is called when the camera device has started reading out the output
         * image for the request, at the beginning of the sensor image readout.
         *
         * <p>For a capture request, this callback is invoked right after
         * {@link #onCaptureStarted}. Unlike {@link #onCaptureStarted}, instead of passing
         * a timestamp of start of exposure, this callback passes a timestamp of start of
         * camera data readout. This is useful because for a camera running at fixed frame
         * rate, the start of readout is at fixed interval, but not necessary for the start
         * of exposure.</p>
         *
         * <p>This timestamp may not match {@link CaptureResult#SENSOR_TIMESTAMP the result
         * timestamp field}. It will, however, match the timestamp of buffers sent to the
         * output surfaces with {@link OutputConfiguration#TIMESTAMP_BASE_READOUT_SENSOR}
         * timestamp base.</p>
         *
         * <p>This callback will be called only if {@link
         * CameraCharacteristics#SENSOR_READOUT_TIMESTAMP} is
         * {@link CameraMetadata#SENSOR_READOUT_TIMESTAMP_HARDWARE}, and it's called
         * right after {@link #onCaptureStarted}.</p>
         *
         * @param session the session returned by {@link CameraDevice#createCaptureSession}
         * @param request the request for the readout that just began
         * @param timestamp the timestamp at start of readout for a regular request, or
         *                  the timestamp at the input image's start of readout for a
         *                  reprocess request, in nanoseconds.
         * @param frameNumber the frame number for this capture
         *
         * @hide
         */
        public void onReadoutStarted(@NonNull CameraCaptureSession session,
                @NonNull CaptureRequest request, long timestamp, long frameNumber) {
            // default empty implementation
        }

        /**
         * This method is called when some results from an image capture are
         * available.
+34 −0
Original line number Diff line number Diff line
@@ -4383,6 +4383,40 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
    public static final Key<android.graphics.Rect[]> SENSOR_OPTICAL_BLACK_REGIONS =
            new Key<android.graphics.Rect[]>("android.sensor.opticalBlackRegions", android.graphics.Rect[].class);

    /**
     * <p>Whether or not the camera device supports readout timestamp and
     * onReadoutStarted callback.</p>
     * <p>If this tag is HARDWARE, the camera device calls onReadoutStarted in addition to the
     * onCaptureStarted callback for each capture. The timestamp passed into the callback
     * is the start of camera image readout rather than the start of the exposure. In
     * addition, the application can configure an
     * {@link android.hardware.camera2.params.OutputConfiguration } with
     * TIMESTAMP_BASE_READOUT_SENSOR timestamp base, in which case, the timestamp of the
     * output surface matches the timestamp from the corresponding onReadoutStarted callback.</p>
     * <p>The readout timestamp is beneficial for video recording, because the encoder favors
     * uniform timestamps, and the readout timestamps better reflect the cadence camera sensors
     * output data.</p>
     * <p>If this tag is HARDWARE, the camera device produces the start-of-exposure and
     * start-of-readout together. As a result, the onReadoutStarted is called right after
     * onCaptureStarted. The difference in start-of-readout and start-of-exposure is the sensor
     * exposure time, plus certain constant offset. The offset is usually due to camera sensor
     * level crop, and it remains constant for a given camera sensor mode.</p>
     * <p><b>Possible values:</b></p>
     * <ul>
     *   <li>{@link #SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED NOT_SUPPORTED}</li>
     *   <li>{@link #SENSOR_READOUT_TIMESTAMP_HARDWARE HARDWARE}</li>
     * </ul>
     *
     * <p>This key is available on all devices.</p>
     * @see #SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED
     * @see #SENSOR_READOUT_TIMESTAMP_HARDWARE
     * @hide
     */
    @PublicKey
    @NonNull
    public static final Key<Integer> SENSOR_READOUT_TIMESTAMP =
            new Key<Integer>("android.sensor.readoutTimestamp", int.class);

    /**
     * <p>List of lens shading modes for {@link CaptureRequest#SHADING_MODE android.shading.mode} that are supported by this camera device.</p>
     * <p>This list contains lens shading modes that can be set for the camera device.
+22 −0
Original line number Diff line number Diff line
@@ -1657,6 +1657,28 @@ public abstract class CameraMetadata<TKey> {
     */
    public static final int SENSOR_REFERENCE_ILLUMINANT1_ISO_STUDIO_TUNGSTEN = 24;

    //
    // Enumeration values for CameraCharacteristics#SENSOR_READOUT_TIMESTAMP
    //

    /**
     * <p>This camera device doesn't support readout timestamp and onReadoutStarted
     * callback.</p>
     * @see CameraCharacteristics#SENSOR_READOUT_TIMESTAMP
     * @hide
     */
    public static final int SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED = 0;

    /**
     * <p>This camera device supports the onReadoutStarted callback as well as outputting
     * readout timestamp for streams with TIMESTAMP_BASE_READOUT_SENSOR timestamp base. The
     * readout timestamp is generated by the camera hardware and it has the same accuracy
     * and timing characteristics of the start-of-exposure time.</p>
     * @see CameraCharacteristics#SENSOR_READOUT_TIMESTAMP
     * @hide
     */
    public static final int SENSOR_READOUT_TIMESTAMP_HARDWARE = 1;

    //
    // Enumeration values for CameraCharacteristics#LED_AVAILABLE_LEDS
    //
+15 −0
Original line number Diff line number Diff line
@@ -656,6 +656,21 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession
                }
            }

            @Override
            public void onReadoutStarted(CameraDevice camera,
                    CaptureRequest request, long timestamp, long frameNumber) {
                if ((callback != null) && (executor != null)) {
                    final long ident = Binder.clearCallingIdentity();
                    try {
                        executor.execute(() -> callback.onReadoutStarted(
                                    CameraCaptureSessionImpl.this, request, timestamp,
                                    frameNumber));
                    } finally {
                        Binder.restoreCallingIdentity(ident);
                    }
                }
            }

            @Override
            public void onCapturePartial(CameraDevice camera,
                    CaptureRequest request, android.hardware.camera2.CaptureResult result) {
+20 −4
Original line number Diff line number Diff line
@@ -2025,12 +2025,16 @@ public class CameraDeviceImpl extends CameraDevice
                    resultExtras.getLastCompletedReprocessFrameNumber();
            final long lastCompletedZslFrameNumber =
                    resultExtras.getLastCompletedZslFrameNumber();
            final boolean hasReadoutTimestamp = resultExtras.hasReadoutTimestamp();
            final long readoutTimestamp = resultExtras.getReadoutTimestamp();

            if (DEBUG) {
                Log.d(TAG, "Capture started for id " + requestId + " frame number " + frameNumber
                        + ": completedRegularFrameNumber " + lastCompletedRegularFrameNumber
                        + ", completedReprocessFrameNUmber " + lastCompletedReprocessFrameNumber
                        + ", completedZslFrameNumber " + lastCompletedZslFrameNumber);
                        + ", completedZslFrameNumber " + lastCompletedZslFrameNumber
                        + ", hasReadoutTimestamp " + hasReadoutTimestamp
                        + (hasReadoutTimestamp ? ", readoutTimestamp " + readoutTimestamp : "")) ;
            }
            final CaptureCallbackHolder holder;

@@ -2084,12 +2088,24 @@ public class CameraDeviceImpl extends CameraDevice
                                                timestamp - (subsequenceId - i) *
                                                NANO_PER_SECOND / fpsRange.getUpper(),
                                                frameNumber - (subsequenceId - i));
                                            if (hasReadoutTimestamp) {
                                                holder.getCallback().onReadoutStarted(
                                                    CameraDeviceImpl.this,
                                                    holder.getRequest(i),
                                                    readoutTimestamp - (subsequenceId - i) *
                                                    NANO_PER_SECOND / fpsRange.getUpper(),
                                                    frameNumber - (subsequenceId - i));
                                            }
                                        }
                                    } else {
                                        holder.getCallback().onCaptureStarted(
                                            CameraDeviceImpl.this,
                                            holder.getRequest(resultExtras.getSubsequenceId()),
                                            CameraDeviceImpl.this, request,
                                            timestamp, frameNumber);
                                        if (hasReadoutTimestamp) {
                                            holder.getCallback().onReadoutStarted(
                                                CameraDeviceImpl.this, request,
                                                readoutTimestamp, frameNumber);
                                        }
                                    }
                                }
                            }
Loading