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
19db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinimport android.hardware.camera2.impl.CameraMetadataNative;
20bdf366cc70639b0e16b8f84eebe612a48a8b8b06Igor Murashkinimport android.hardware.camera2.impl.CaptureResultExtras;
21db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
221e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkinimport java.util.ArrayList;
23db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinimport java.util.Collections;
24db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinimport java.util.List;
25db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
26db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin/**
27db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>The total assembled results of a single image capture from the image sensor.</p>
28db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
29db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>Contains the final configuration for the capture hardware (sensor, lens,
30db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * flash), the processing pipeline, the control algorithms, and the output
31db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * buffers.</p>
32db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
33db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>A {@code TotalCaptureResult} is produced by a {@link CameraDevice} after processing a
34db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * {@link CaptureRequest}. All properties listed for capture requests can also
35db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * be queried on the capture result, to determine the final values used for
36db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * capture. The result also includes additional metadata about the state of the
37db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * camera device during the capture.</p>
38db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
39db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>All properties returned by {@link CameraCharacteristics#getAvailableCaptureResultKeys()}
40db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * are available (that is {@link CaptureResult#get} will return non-{@code null}, if and only if
41db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * that key that was enabled by the request. A few keys such as
42db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * {@link CaptureResult#STATISTICS_FACES} are disabled by default unless enabled with a switch (such
43db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * as {@link CaptureRequest#STATISTICS_FACE_DETECT_MODE}). Refer to each key documentation on
44db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * a case-by-case basis.</p>
45db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
46db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin * <p>{@link TotalCaptureResult} objects are immutable.</p>
47db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin *
48fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala * @see CameraDevice.CaptureCallback#onCaptureCompleted
49db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin */
50db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkinpublic final class TotalCaptureResult extends CaptureResult {
51db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
521e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin    private final List<CaptureResult> mPartialResults;
531e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin
54db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    /**
551e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * Takes ownership of the passed-in camera metadata and the partial results
561e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     *
571e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * @param partials a list of partial results; {@code null} will be substituted for an empty list
58db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * @hide
59db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     */
60bdf366cc70639b0e16b8f84eebe612a48a8b8b06Igor Murashkin    public TotalCaptureResult(CameraMetadataNative results, CaptureRequest parent,
611e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin            CaptureResultExtras extras, List<CaptureResult> partials) {
62bdf366cc70639b0e16b8f84eebe612a48a8b8b06Igor Murashkin        super(results, parent, extras);
631e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin
641e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        if (partials == null) {
651e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin            mPartialResults = new ArrayList<>();
661e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        } else {
671e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin            mPartialResults = partials;
681e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        }
69db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    }
70db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
71db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    /**
72db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * Creates a request-less result.
73db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
74db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * <p><strong>For testing only.</strong></p>
75db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * @hide
76db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     */
77db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    public TotalCaptureResult(CameraMetadataNative results, int sequenceId) {
78db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin        super(results, sequenceId);
791e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin
801e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        mPartialResults = new ArrayList<>();
81db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    }
82db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin
83db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    /**
84db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * Get the read-only list of partial results that compose this total result.
85db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
86db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * <p>The list is returned is unmodifiable; attempting to modify it will result in a
87db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * {@code UnsupportedOperationException} being thrown.</p>
88db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
891e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * <p>The list size will be inclusive between {@code 0} and
901e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin     * {@link CameraCharacteristics#REQUEST_PARTIAL_RESULT_COUNT}, with elements in ascending order
91fd887436bd111e4d2c7307578a51b5070025b7f2Eino-Ville Talvala     * of when {@link CameraCaptureSession.CaptureCallback#onCaptureProgressed} was invoked.</p>
92db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     *
93db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     * @return unmodifiable list of partial results
94db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin     */
95db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    public List<CaptureResult> getPartialResults() {
961e854c5fc817d31eef18e671b9b519bbb4b400d2Igor Murashkin        return Collections.unmodifiableList(mPartialResults);
97db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin    }
98db075afc85b6b50a5d3a988a17ed0d4e09ef0823Igor Murashkin}
99