1db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin/*
2db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * Copyright (C) 2014 The Android Open Source Project
3db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
4db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
5db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * you may not use this file except in compliance with the License.
6db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * You may obtain a copy of the License at
7db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
8db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
9db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
10db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * Unless required by applicable law or agreed to in writing, software
11db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
12db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * See the License for the specific language governing permissions and
14db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * limitations under the License.
15db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin */
16db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
17db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinpackage android.hardware.camera2;
18db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
198b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvalaimport android.annotation.NonNull;
20db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinimport android.hardware.camera2.impl.CameraMetadataNative;
21bdf366cc70639b0e16b8f84eebe612a48a8b8b06Igor Murashkinimport android.hardware.camera2.impl.CaptureResultExtras;
22db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
231e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkinimport java.util.ArrayList;
24db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinimport java.util.Collections;
25db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinimport java.util.List;
26db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
27db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin/**
28db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>The total assembled results of a single image capture from the image sensor.</p>
29db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
30db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>Contains the final configuration for the capture hardware (sensor, lens,
31db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * flash), the processing pipeline, the control algorithms, and the output
32db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * buffers.</p>
33db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
34db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>A {@code TotalCaptureResult} is produced by a {@link CameraDevice} after processing a
35db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * {@link CaptureRequest}. All properties listed for capture requests can also
36db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * be queried on the capture result, to determine the final values used for
37db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * capture. The result also includes additional metadata about the state of the
38db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * camera device during the capture.</p>
39db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
40db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>All properties returned by {@link CameraCharacteristics#getAvailableCaptureResultKeys()}
41db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * are available (that is {@link CaptureResult#get} will return non-{@code null}, if and only if
42db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * that key that was enabled by the request. A few keys such as
43db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * {@link CaptureResult#STATISTICS_FACES} are disabled by default unless enabled with a switch (such
44db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * as {@link CaptureRequest#STATISTICS_FACE_DETECT_MODE}). Refer to each key documentation on
45db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * a case-by-case basis.</p>
46db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
47db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>{@link TotalCaptureResult} objects are immutable.</p>
48db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
49fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala * @see CameraDevice.CaptureCallback#onCaptureCompleted
50db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin */
51db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinpublic final class TotalCaptureResult extends CaptureResult {
52db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
531e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin    private final List<CaptureResult> mPartialResults;
547a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen    private final int mSessionId;
551e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin
56db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    /**
571e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * Takes ownership of the passed-in camera metadata and the partial results
581e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     *
591e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * @param partials a list of partial results; {@code null} will be substituted for an empty list
60db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * @hide
61db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     */
62bdf366cc70639b0e16b8f84eebe612a48a8b8b06Igor Murashkin    public TotalCaptureResult(CameraMetadataNative results, CaptureRequest parent,
637a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen            CaptureResultExtras extras, List<CaptureResult> partials, int sessionId) {
64bdf366cc70639b0e16b8f84eebe612a48a8b8b06Igor Murashkin        super(results, parent, extras);
651e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin
661e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        if (partials == null) {
671e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin            mPartialResults = new ArrayList<>();
681e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        } else {
691e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin            mPartialResults = partials;
701e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        }
717a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen
727a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen        mSessionId = sessionId;
73db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    }
74db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
75db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    /**
76db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * Creates a request-less result.
77db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
78db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * <p><strong>For testing only.</strong></p>
79db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * @hide
80db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     */
81db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    public TotalCaptureResult(CameraMetadataNative results, int sequenceId) {
82db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin        super(results, sequenceId);
831e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin
841e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        mPartialResults = new ArrayList<>();
857a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen        mSessionId = CameraCaptureSession.SESSION_ID_NONE;
86db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    }
87db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
88db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    /**
89db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * Get the read-only list of partial results that compose this total result.
90db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
91db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * <p>The list is returned is unmodifiable; attempting to modify it will result in a
92db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * {@code UnsupportedOperationException} being thrown.</p>
93db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
941e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * <p>The list size will be inclusive between {@code 0} and
951e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * {@link CameraCharacteristics#REQUEST_PARTIAL_RESULT_COUNT}, with elements in ascending order
96fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala     * of when {@link CameraCaptureSession.CaptureCallback#onCaptureProgressed} was invoked.</p>
97db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
98db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * @return unmodifiable list of partial results
99db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     */
1008b905578b54041f7d0b8dc04dd158d16d28262a1Eino-Ville Talvala    @NonNull
101db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    public List<CaptureResult> getPartialResults() {
1021e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        return Collections.unmodifiableList(mPartialResults);
103db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    }
1047a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen
1057a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen    /**
1067a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen     * Get the ID of the session where the capture request of this result was submitted.
1077a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen     *
1087a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen     * @return The session ID
1097a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen     * @hide
1107a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen     */
1117a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen    public int getSessionId() {
1127a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen        return mSessionId;
1137a316f6b1b040f0113161db87a36397aebfb80b8Chien-Yu Chen    }
114db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin}
115