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