1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.camera.one.v2.core;
18
19import android.hardware.camera2.CameraAccessException;
20
21import com.android.camera.async.SafeCloseable;
22import com.android.camera.one.v2.camera2proxy.CameraCaptureSessionClosedException;
23
24import java.util.List;
25
26import javax.annotation.Nonnull;
27import javax.annotation.Nullable;
28import javax.annotation.concurrent.ThreadSafe;
29
30/**
31 * Provides thread-safe access to a camera.
32 */
33@ThreadSafe
34public interface FrameServer {
35    /**
36     * A Session enables submitting multiple Requests for frames.
37     */
38    @ThreadSafe
39    public interface Session extends SafeCloseable {
40        /**
41         * Submits the given request, blocking until resources are allocated for
42         * the request.
43         *
44         * @param burstRequests The request to submit to the camera device.
45         * @throws java.lang.InterruptedException if interrupted before the
46         *             request is be submitted.
47         */
48        public void submitRequest(List<Request> burstRequests, RequestType type)
49                throws CameraAccessException, InterruptedException,
50                CameraCaptureSessionClosedException, ResourceAcquisitionFailedException;
51
52        @Override
53        public void close();
54    }
55
56    /**
57     * Indicates that a session has been closed already, via
58     * {@link FrameServer.Session#close} and no more requests may be submitted.
59     */
60    public static class SessionClosedException extends RuntimeException {
61    }
62
63    public static enum RequestType {
64        REPEATING, NON_REPEATING
65    }
66
67    /**
68     * Creates an exclusive session. Blocks, if necessary, until any existing
69     * exclusive session is closed.
70     *
71     * @return A new session which may be used to interact with the underlying
72     *         camera.
73     */
74    @Nonnull
75    public Session createExclusiveSession() throws InterruptedException;
76
77    /**
78     * Like {@link #createExclusiveSession}, but returns null instead of
79     * blocking if the session cannot be created immediately.
80     */
81    @Nullable
82    public Session tryCreateExclusiveSession();
83}
84