1fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala/*
2c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wang * Copyright (C) 2013-2018 The Android Open Source Project
3fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
4fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
5fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * you may not use this file except in compliance with the License.
6fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * You may obtain a copy of the License at
7fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
8fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
9fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
10fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
11fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
12fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * See the License for the specific language governing permissions and
14fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * limitations under the License.
15fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala */
16fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
17fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA3_STREAM_H
18fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#define ANDROID_SERVERS_CAMERA3_STREAM_H
19fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
20fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <gui/Surface.h>
21fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/RefBase.h>
22fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/String8.h>
23fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include <utils/String16.h>
242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include <utils/List.h>
25fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
26fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#include "hardware/camera3.h"
27fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
28686f644f981badd481d8781bf80b221544df7b1fShuzhen Wang#include "utils/LatencyHistogram.h"
292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Camera3StreamBufferListener.h"
302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin#include "Camera3StreamInterface.h"
312fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
32fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace android {
33fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
34fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalanamespace camera3 {
35fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
36fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala/**
37fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * A class for managing a single stream of input or output data from the camera
38fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * device.
39fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
40fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * The stream has an internal state machine to track whether it's
41fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * connected/configured/etc.
42fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
43fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * States:
44fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
45fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_ERROR: A serious error has occurred, stream is unusable. Outstanding
46fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    buffers may still be returned.
47fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
48fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_CONSTRUCTED: The stream is ready for configuration, but buffers cannot
49fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    be gotten yet. Not connected to any endpoint, no buffers are registered
50fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    with the HAL.
51fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
52fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_IN_CONFIG: Configuration has started, but not yet concluded. During this
53fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    time, the usage, max_buffers, and priv fields of camera3_stream returned by
54fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    startConfiguration() may be modified.
55fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
56fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_IN_RE_CONFIG: Configuration has started, and the stream has been
57fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    configured before. Need to track separately from IN_CONFIG to avoid
58fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    re-registering buffers with HAL.
59fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
60fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *  STATE_CONFIGURED: Stream is configured, and has registered buffers with the
614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    HAL (if necessary). The stream's getBuffer/returnBuffer work. The priv
624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    pointer may still be modified.
634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *
644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *  STATE_PREPARING: The stream's buffers are being pre-allocated for use.  On
654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    older HALs, this is done as part of configuration, but in newer HALs
664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    buffers may be allocated at time of first use. But some use cases require
674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    buffer allocation upfront, to minmize disruption due to lengthy allocation
684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    duration.  In this state, only prepareNextBuffer() and cancelPrepare()
694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    may be called.
70fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
71ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *  STATE_IN_IDLE: This is a temporary state only intended to be used for input
72ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *    streams and only for the case where we need to re-configure the camera device
73ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *    while the input stream has an outstanding buffer. All other streams should not
74ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *    be able to switch to this state. For them this is invalid and should be handled
75ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *    as an unknown state.
76ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *
77fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala * Transition table:
78fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *
79fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    <none>               => STATE_CONSTRUCTED:
80fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When constructed with valid arguments
81fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    <none>               => STATE_ERROR:
82fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When constructed with invalid arguments
83fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONSTRUCTED    => STATE_IN_CONFIG:
84fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When startConfiguration() is called
85fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_CONFIG      => STATE_CONFIGURED:
86fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() is called
87fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_CONFIG      => STATE_ERROR:
88fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() fails to allocate or register buffers.
89fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_IN_RE_CONFIG:  *
90fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When startConfiguration() is called again, after making sure stream is
91fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        idle with waitUntilIdle().
92fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_RE_CONFIG   => STATE_CONFIGURED:
93fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() is called.
94fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_IN_RE_CONFIG   => STATE_ERROR:
95fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When finishConfiguration() fails to allocate or register buffers.
96fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_CONSTRUCTED:
97fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        When disconnect() is called after making sure stream is idle with
98fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala *        waitUntilIdle().
994d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    STATE_CONFIGURED     => STATE_PREPARING:
1004d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        When startPrepare is called before the stream has a buffer
1014d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        queued back into it for the first time.
1024d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *    STATE_PREPARING      => STATE_CONFIGURED:
1034d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        When sufficient prepareNextBuffer calls have been made to allocate
1044d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala *        all stream buffers, or cancelPrepare is called.
105e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen *    STATE_CONFIGURED     => STATE_ABANDONED:
106e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen *        When the buffer queue of the stream is abandoned.
107ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *    STATE_CONFIGURED     => STATE_IN_IDLE:
108ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *        Only for an input stream which has an outstanding buffer.
109ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *    STATE_IN_IDLE     => STATE_CONFIGURED:
110ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *        After the internal re-configuration, the input should revert back to
111ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *        the configured state.
11213d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
11313d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin * Status Tracking:
11413d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    Each stream is tracked by StatusTracker as a separate component,
11513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    depending on the handed out buffer count. The state must be STATE_CONFIGURED
11613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    in order for the component to be marked.
11713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
11813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    It's marked in one of two ways:
11913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
12013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - ACTIVE: One or more buffers have been handed out (with #getBuffer).
12113d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    - IDLE: All buffers have been returned (with #returnBuffer), and their
122ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *          respective release_fence(s) have been signaled. The only exception to this
123ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *          rule is an input stream that moves to "STATE_IN_IDLE" during internal
124ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev *          re-configuration.
12513d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
12613d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    A typical use case is output streams. When the HAL has any buffers
12713d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    dequeued, the stream is marked ACTIVE. When the HAL returns all buffers
12813d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    (e.g. if no capture requests are active), the stream is marked IDLE.
12913d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *    In this use case, the app consumer does not affect the component status.
13013d315eb8c0848ea0584b9fb1d27bab55bc8158bIgor Murashkin *
131fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala */
132fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvalaclass Camera3Stream :
133fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        protected camera3_stream,
1342fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual Camera3StreamInterface,
1352fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        public virtual RefBase {
136fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  public:
137fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
138fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual ~Camera3Stream();
139fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
140fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static Camera3Stream*       cast(camera3_stream *stream);
141fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    static const Camera3Stream* cast(const camera3_stream *stream);
142fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
143fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
144fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's ID
145fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
146fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    int              getId() const;
147fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
148fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
149125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Get the output stream set id.
150125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
151125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    int              getStreamSetId() const;
152125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
153125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
154fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Get the stream's dimensions and format
155fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
1563d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    uint32_t          getWidth() const;
1573d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    uint32_t          getHeight() const;
1583d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    int               getFormat() const;
1593d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala    android_dataspace getDataSpace() const;
160050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peev    uint64_t          getUsage() const;
161050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peev    void              setUsage(uint64_t usage);
162710c142d6a83a5f96cd34e4209bd9cac2f4c6639Emilian Peev    void              setFormatOverride(bool formatOverriden);
16391cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    bool              isFormatOverridden() const;
16491cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    int               getOriginalFormat() const;
16591cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    void              setDataSpaceOverride(bool dataSpaceOverriden);
16691cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    bool              isDataSpaceOverridden() const;
16791cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    android_dataspace getOriginalDataSpace() const;
1685c22c15ed8c593189ed9bb8fcbccace2ca63b82aShuzhen Wang    const String8&    physicalCameraId() const;
169fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
1700b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala    camera3_stream*   asHalStream() override {
1710b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala        return this;
1720b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala    }
1730b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala
174fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
175fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Start the stream configuration process. Returns a handle to the stream's
176fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * information to be passed into the HAL device's configure_streams call.
177fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
178fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Until finishConfiguration() is called, no other methods on the stream may be
179fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * called. The usage and max_buffers fields of camera3_stream may be modified
180fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * between start/finishConfiguration, but may not be changed after that.
181fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * The priv field of camera3_stream may be modified at any time after
182fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * startConfiguration.
183fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
184fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns NULL in case of error starting configuration.
185fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
186fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    camera3_stream*  startConfiguration();
187fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
188fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
189fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Check if the stream is mid-configuration (start has been called, but not
190fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * finish).  Used for lazy completion of configuration.
191fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
192fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             isConfiguring() const;
193fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
194fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
1950b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * Completes the stream configuration process. The stream information
1960b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * structure returned by startConfiguration() may no longer be modified
1970b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * after this call, but can still be read until the destruction of the
1980b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala     * stream.
199fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
200fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Returns:
201fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   OK on a successful configuration
202fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_INIT in case of a serious error from the HAL device
203fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *   NO_MEMORY in case of an error registering buffers
2045d677d1f0879d5101e38df480a38228a64d63959Zhijun He     *   INVALID_OPERATION in case connecting to the consumer failed or consumer
2055d677d1f0879d5101e38df480a38228a64d63959Zhijun He     *       doesn't exist yet.
206fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
2070b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala    status_t         finishConfiguration();
208fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
209fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
2101754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * Cancels the stream configuration process. This returns the stream to the
2111754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * initial state, allowing it to be configured again later.
2121754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     * This is done if the HAL rejects the proposed combined stream configuration
2131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala     */
2141754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    status_t         cancelConfiguration();
2151754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
2161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    /**
2174d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Determine whether the stream has already become in-use (has received
2184d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * a valid filled buffer), which determines if a stream can still have
2194d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * prepareNextBuffer called on it.
2204d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2214d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool             isUnpreparable();
2224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Start stream preparation. May only be called in the CONFIGURED state,
225c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * when no valid buffers have yet been returned to this stream. Prepares
226c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * up to maxCount buffers, or the maximum number of buffers needed by the
227c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk     * pipeline if maxCount is ALLOCATE_PIPELINE_MAX.
2284d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * If no prepartion is necessary, returns OK and does not transition to
2304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * PREPARING state. Otherwise, returns NOT_ENOUGH_DATA and transitions
2314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * to PREPARING.
2324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * This call performs no allocation, so is quick to call.
2344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2354d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2364d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if no more buffers need to be preallocated
2374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NOT_ENOUGH_DATA if calls to prepareNextBuffer are needed to finish
2384d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        buffer pre-allocation, and transitions to the PREPARING state.
2394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if called when not in CONFIGURED state, or a
2414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        valid buffer has already been returned to this stream.
2424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
243c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    status_t         startPrepare(int maxCount);
2444d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Check if the stream is mid-preparing.
2474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool             isPreparing() const;
2494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Continue stream buffer preparation by allocating the next
2524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * buffer for this stream.  May only be called in the PREPARED state.
2534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns OK and transitions to the CONFIGURED state if all buffers
2554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * are allocated after the call concludes. Otherwise returns NOT_ENOUGH_DATA.
2564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * This call allocates one buffer, which may take several milliseconds for
2584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * large buffers.
2594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if no more buffers need to be preallocated, and transitions
2624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        to the CONFIGURED state.
2634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NOT_ENOUGH_DATA if more calls to prepareNextBuffer are needed to finish
2644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        buffer pre-allocation.
2654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if called when not in CONFIGURED state, or a
2674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *        valid buffer has already been returned to this stream.
2684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t         prepareNextBuffer();
2704d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2714d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
2724d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Cancel stream preparation early. In case allocation needs to be
2734d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * stopped, this method transitions the stream back to the CONFIGURED state.
2744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Buffers that have been allocated with prepareNextBuffer remain that way,
2754d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * but a later use of prepareNextBuffer will require just as many
2764d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * calls as if the earlier prepare attempt had not existed.
2774d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *
2784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Returns:
2794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    OK if cancellation succeeded, and transitions to the CONFIGURED state
2804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    INVALID_OPERATION if not in the PREPARING state
2814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
2824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
2834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t        cancelPrepare();
2844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
2854d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
286b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * Tear down memory for this stream. This frees all unused gralloc buffers
287b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * allocated for this stream, but leaves it ready for operation afterward.
288b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *
289b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * May only be called in the CONFIGURED state, and keeps the stream in
290b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * the CONFIGURED state.
291b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *
292b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     * Returns:
293b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    OK if teardown succeeded.
294b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    INVALID_OPERATION if not in the CONFIGURED state
295b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     *    NO_INIT in case of a serious error from the HAL device
296b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala     */
297b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    status_t       tearDown();
298b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala
299b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    /**
300fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Fill in the camera3_stream_buffer with the next valid buffer for this
301fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * stream, to hand over to the HAL.
302fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
303bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * Multiple surfaces could share the same HAL stream, but a request may
304bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * be only for a subset of surfaces. In this case, the
305bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * Camera3StreamInterface object needs the surface ID information to acquire
306bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     * buffers for those surfaces.
307bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang     *
308fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called once finishConfiguration has been called.
309fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side
310fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
311fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
312fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
313bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang    status_t         getBuffer(camera3_stream_buffer *buffer,
314bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang            const std::vector<size_t>& surface_ids = std::vector<size_t>());
315fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
316fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
317fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Return a buffer to the stream after use by the HAL.
318fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     *
319fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * This method may only be called for buffers provided by getBuffer().
320fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * For bidirectional streams, this method applies to the output-side buffers
321fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
322fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         returnBuffer(const camera3_stream_buffer &buffer,
323fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala            nsecs_t timestamp);
324fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
325fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
3265a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Fill in the camera3_stream_buffer with the next valid buffer for this
3275a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * stream, to hand over to the HAL.
3285a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
3295a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called once finishConfiguration has been called.
3305a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side
3315a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * buffers.
3325a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
333ba435258270476d7931329dc0239bdc468e9ddbdEino-Ville Talvala     * Normally this call will block until the handed out buffer count is less than the stream
334ba435258270476d7931329dc0239bdc468e9ddbdEino-Ville Talvala     * max buffer count; if respectHalLimit is set to false, this is ignored.
3355a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
336ba435258270476d7931329dc0239bdc468e9ddbdEino-Ville Talvala    status_t         getInputBuffer(camera3_stream_buffer *buffer, bool respectHalLimit = true);
3375a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
3385a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
3395a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * Return a buffer to the stream after use by the HAL.
3405a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     *
3415a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * This method may only be called for buffers provided by getBuffer().
3425a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     * For bidirectional streams, this method applies to the input-side buffers
3435a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin     */
3445a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    status_t         returnInputBuffer(const camera3_stream_buffer &buffer);
3455a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin
346618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // get the buffer producer of the input buffer queue.
347618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // only apply to input streams.
348618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    status_t         getInputBufferProducer(sp<IGraphicBufferProducer> *producer);
349618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
3505a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    /**
351fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Whether any of the stream's buffers are currently in use by the HAL,
352fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * including buffers that have been returned but not yet had their
353fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * release fence signaled.
354fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
355fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    bool             hasOutstandingBuffers() const;
356fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
357fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
358fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        TIMEOUT_NEVER = -1
359fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    };
360f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
361fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
362f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Set the status tracker to notify about idle transitions
363fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
364f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual status_t setStatusTracker(sp<StatusTracker> statusTracker);
365fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
366fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
367fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Disconnect stream from its non-HAL endpoint. After this,
368fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * start/finishConfiguration must be called before the stream can be used
369fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * again. This cannot be called if the stream has outstanding dequeued
370fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * buffers.
371fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
372fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    status_t         disconnect();
373fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
374fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
375fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Debug dump of the stream's state.
376fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
377686f644f981badd481d8781bf80b221544df7b1fShuzhen Wang    virtual void     dump(int fd, const Vector<String16> &args) const;
378fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
379f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
380f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Add a camera3 buffer listener. Adding the same listener twice has
381f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * no effect.
382f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
3832fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             addBufferListener(
3842fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            wp<Camera3StreamBufferListener> listener);
385f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He
386f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He    /**
387f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * Remove a camera3 buffer listener. Removing the same listener twice
388f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     * or the listener that was never added has no effect.
389f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He     */
3902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void             removeBufferListener(
3912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            const sp<Camera3StreamBufferListener>& listener);
3922fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
393be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh
394be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    // Setting listener will remove previous listener (if exists)
395be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh    virtual void     setBufferFreedListener(
396db1e864daf162007341d6715094330c13bf5482fYin-Chia Yeh            wp<Camera3StreamBufferFreedListener> listener) override;
397be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh
398e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    /**
399e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen     * Return if the buffer queue of the stream is abandoned.
400e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen     */
401e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen    bool             isAbandoned() const;
402e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen
403ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev    /**
404ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev     * Switch a configured stream with possibly outstanding buffers in idle
405ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev     * state. Configuration for such streams will be skipped assuming there
406ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev     * are no changes to the stream parameters.
407ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev     */
408ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev    status_t         forceToIdle();
409ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev
410ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev    /**
411ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev     * Restore a forced idle stream to configured state, marking it active
412ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev     * in case it contains outstanding buffers.
413ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev     */
414ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev    status_t         restoreConfiguredState();
415ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev
416fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  protected:
417fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const int mId;
418125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
419125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Stream set id, used to indicate which group of this stream belongs to for buffer sharing
420125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * across multiple streams.
421125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     *
422125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * The default value is set to CAMERA3_STREAM_SET_ID_INVALID, which indicates that this stream
423125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * doesn't intend to share buffers with any other streams, and this stream will fall back to
424125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * the existing BufferQueue mechanism to manage the buffer allocations and buffer circulation.
425125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * When a valid stream set id is set, this stream intends to use the Camera3BufferManager to
426125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * manage the buffer allocations; the BufferQueue will only handle the buffer transaction
427125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * between the producer and consumer. For this case, upon successfully registration, the streams
428125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * with the same stream set id will potentially share the buffers allocated by
429125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Camera3BufferManager.
430125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
431125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    const int mSetId;
432125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
433fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const String8 mName;
434fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Zero for formats with fixed buffer size for given dimensions.
435fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    const size_t mMaxSize;
436fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
437fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    enum {
438fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_ERROR,
439fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_CONSTRUCTED,
440fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_CONFIG,
441fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala        STATE_IN_RECONFIG,
4424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        STATE_CONFIGURED,
443e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        STATE_PREPARING,
444ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev        STATE_ABANDONED,
445ac3ce6c30c5859401332caa207ed79ac188de647Emilian Peev        STATE_IN_IDLE
446fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    } mState;
447fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
448fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    mutable Mutex mLock;
449fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
450fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    Camera3Stream(int id, camera3_stream_type type,
4513d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            uint32_t width, uint32_t height, size_t maxSize, int format,
452125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            android_dataspace dataSpace, camera3_stream_rotation_t rotation,
453c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wang            const String8& physicalCameraId, int setId);
454fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
455db1e864daf162007341d6715094330c13bf5482fYin-Chia Yeh    wp<Camera3StreamBufferFreedListener> mBufferFreedListener;
456be83fa713da45b1c751d33ad69ce0017ebe9f707Yin-Chia Yeh
457fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    /**
458fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     * Interface to be implemented by derived classes
459fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala     */
460fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
461fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // getBuffer / returnBuffer implementations
462fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
463fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Since camera3_stream_buffer includes a raw pointer to the stream,
464fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // cast to camera3_stream*, implementations must increment the
465fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // refcount of the stream manually in getBufferLocked, and decrement it in
466fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // returnBufferLocked.
467bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang    virtual status_t getBufferLocked(camera3_stream_buffer *buffer,
468bee0f0a5e7aa19aa7c59de03b508985b68bc6b5eShuzhen Wang            const std::vector<size_t>& surface_ids = std::vector<size_t>());
469fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer,
4705a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            nsecs_t timestamp);
4715a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer);
4725a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t returnInputBufferLocked(
4735a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            const camera3_stream_buffer &buffer);
474fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual bool     hasOutstandingBuffersLocked() const = 0;
475618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // Get the buffer producer of the input buffer queue. Only apply to input streams.
476618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    virtual status_t getInputBufferProducerLocked(sp<IGraphicBufferProducer> *producer);
477618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
478e2172bed7e77ab1d922588cf727818b481400b53Igor Murashkin    // Can return -ENOTCONN when we are already disconnected (not an error)
479fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t disconnectLocked() = 0;
480fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
481fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Configure the buffer queue interface to the other end of the stream,
482fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // after the HAL has provided usage and max_buffers values. After this call,
483fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // the stream must be ready to produce all buffers for registration with
484fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // HAL.
485fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual status_t configureQueueLocked() = 0;
486fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
487fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    // Get the total number of buffers in the queue
488fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala    virtual size_t   getBufferCountLocked() = 0;
489fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
4906adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout output buffer count.
4916adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutOutputBufferCountLocked() = 0;
4926adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
4936adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    // Get handout input buffer count.
4946adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    virtual size_t   getHandoutInputBufferCountLocked() = 0;
4956adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He
496b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // Get the usage flags for the other endpoint, or return
497b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala    // INVALID_OPERATION if they cannot be obtained.
498050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peev    virtual status_t getEndpointUsage(uint64_t *usage) const = 0;
499b2f5b19e5b6e1408a259add23dba91037756a943Eino-Ville Talvala
500889234d4b84ef011c21e28be51ff614231603a06Emilian Peev    // Return whether the buffer is in the list of outstanding buffers.
501889234d4b84ef011c21e28be51ff614231603a06Emilian Peev    bool isOutstandingBuffer(const camera3_stream_buffer& buffer) const;
502889234d4b84ef011c21e28be51ff614231603a06Emilian Peev
503f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Tracking for idle state
504f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    wp<StatusTracker> mStatusTracker;
505f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Status tracker component ID
506f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    int mStatusId;
507f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
5084d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Tracking for stream prepare - whether this stream can still have
5094d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // prepareNextBuffer called on it.
5104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool mStreamUnpreparable;
5114d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
512050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peev    uint64_t mUsage;
513050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peev
514fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala  private:
515050f5dcf7d1903926b165ebdd2dd30f7a2e83c02Emilian Peev    uint64_t mOldUsage;
51602bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    uint32_t mOldMaxBuffers;
5176adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mOutputBufferReturnedSignal;
5186adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    Condition mInputBufferReturnedSignal;
5196adc9ccb2948d9421a0ed4b74f52b909bcec2037Zhijun He    static const nsecs_t kWaitForBufferDuration = 3000000000LL; // 3000 ms
520fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
5212fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    void fireBufferListenersLocked(const camera3_stream_buffer& buffer,
5222fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                  bool acquired, bool output);
5232fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    List<wp<Camera3StreamBufferListener> > mBufferListenerList;
5242fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin
5254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    status_t        cancelPrepareLocked();
5264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
527e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    // Remove the buffer from the list of outstanding buffers.
528e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    void removeOutstandingBuffer(const camera3_stream_buffer& buffer);
529e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen
5304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // Tracking for PREPARING state
5314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
5324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // State of buffer preallocation. Only true if either prepareNextBuffer
5334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // has been called sufficient number of times, or stream configuration
5344d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    // had to register buffers with the HAL
5354d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    bool mPrepared;
5364d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
5374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    Vector<camera3_stream_buffer_t> mPreparedBuffers;
5384d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    size_t mPreparedBufferIdx;
5394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
540c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    // Number of buffers allocated on last prepare call.
54102bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala    size_t mLastMaxCount;
542c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
543889234d4b84ef011c21e28be51ff614231603a06Emilian Peev    mutable Mutex mOutstandingBuffersLock;
544e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    // Outstanding buffers dequeued from the stream's buffer queue.
545e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen    List<buffer_handle_t> mOutstandingBuffers;
546e02e932d2210bd513bb8283840bbe24b58d28620Chien-Yu Chen
547686f644f981badd481d8781bf80b221544df7b1fShuzhen Wang    // Latency histogram of the wait time for handout buffer count to drop below
548686f644f981badd481d8781bf80b221544df7b1fShuzhen Wang    // max_buffers.
549686f644f981badd481d8781bf80b221544df7b1fShuzhen Wang    static const int32_t kBufferLimitLatencyBinSize = 33; //in ms
550686f644f981badd481d8781bf80b221544df7b1fShuzhen Wang    CameraLatencyHistogram mBufferLimitLatency;
551710c142d6a83a5f96cd34e4209bd9cac2f4c6639Emilian Peev
552710c142d6a83a5f96cd34e4209bd9cac2f4c6639Emilian Peev    //Keep track of original format in case it gets overridden
553710c142d6a83a5f96cd34e4209bd9cac2f4c6639Emilian Peev    bool mFormatOverridden;
554710c142d6a83a5f96cd34e4209bd9cac2f4c6639Emilian Peev    int mOriginalFormat;
55591cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala
55691cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    //Keep track of original dataSpace in case it gets overridden
55791cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    bool mDataSpaceOverridden;
55891cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala    android_dataspace mOriginalDataSpace;
55991cd3f89bee99f1a982f1950091bcf578f9a1529Eino-Ville Talvala
560c28189a64a6ef65aecccb6e3bb980f1afc189a1cShuzhen Wang    String8 mPhysicalCameraId;
561fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // class Camera3Stream
562fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
563fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace camera3
564fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
565fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala}; // namespace android
566fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala
567fd58f1a10a749ca72fec1012920d6e94a664cd70Eino-Ville Talvala#endif
568