Camera3Stream.h revision 7b82efe7a376c882f8f938e1c41b8311a8cdda4a
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2013 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 17fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_SERVERS_CAMERA3_STREAM_H 18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_SERVERS_CAMERA3_STREAM_H 191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 201aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <gui/Surface.h> 21c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <utils/RefBase.h> 22c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams#include <utils/String8.h> 23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <utils/String16.h> 24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <utils/List.h> 25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "hardware/camera3.h" 27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 28fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "Camera3StreamBufferListener.h" 29fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "Camera3StreamInterface.h" 301aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams 31326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 32326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 33326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace camera3 { 34326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 354815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams/** 364815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * A class for managing a single stream of input or output data from the camera 374815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * device. 384815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * 39326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * The stream has an internal state machine to track whether it's 40f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams * connected/configured/etc. 41f2649a961db2995e9e24a6c98f8a419f1496c1b7Jason Sams * 424815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * States: 434815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams * 44326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * STATE_ERROR: A serious error has occurred, stream is unusable. Outstanding 45326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * buffers may still be returned. 46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * STATE_CONSTRUCTED: The stream is ready for configuration, but buffers cannot 48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * be gotten yet. Not connected to any endpoint, no buffers are registered 49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * with the HAL. 5056bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams * 5156bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams * STATE_IN_CONFIG: Configuration has started, but not yet concluded. During this 52992a0b70d8fd7a14f0c57bc3c7e16c1f269a6609Jason Sams * time, the usage, max_buffers, and priv fields of camera3_stream returned by 53cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams * startConfiguration() may be modified. 54cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams * 55cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams * STATE_IN_RE_CONFIG: Configuration has started, and the stream has been 56cacee55b3217710cc01a3aa42ea447a779facc74Jason Sams * configured before. Need to track separately from IN_CONFIG to avoid 5756bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams * re-registering buffers with HAL. 5856bc1af0a040b003164e3394f1c7a277b15e7d85Jason Sams * 59cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams * STATE_CONFIGURED: Stream is configured, and has registered buffers with the 60cd50653f99c960e1a47c2c30e53b369b8805344aJason Sams * HAL. The stream's getBuffer/returnBuffer work. The priv pointer may still be 61c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * modified. 62c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 63c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Transition table: 64c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * 65f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams * <none> => STATE_CONSTRUCTED: 669ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams * When constructed with valid arguments 676e9342199959dc9beb5299fefc9775fe8c32620eAlex Sakhartchouk * <none> => STATE_ERROR: 689ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams * When constructed with invalid arguments 69b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * STATE_CONSTRUCTED => STATE_IN_CONFIG: 70b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * When startConfiguration() is called 71b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * STATE_IN_CONFIG => STATE_CONFIGURED: 72b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * When finishConfiguration() is called 73bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams * STATE_IN_CONFIG => STATE_ERROR: 74bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams * When finishConfiguration() fails to allocate or register buffers. 75bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams * STATE_CONFIGURED => STATE_IN_RE_CONFIG: * 76bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams * When startConfiguration() is called again, after making sure stream is 77bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams * idle with waitUntilIdle(). 78b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * STATE_IN_RE_CONFIG => STATE_CONFIGURED: 79b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * When finishConfiguration() is called. 80b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * STATE_IN_RE_CONFIG => STATE_ERROR: 81b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * When finishConfiguration() fails to allocate or register buffers. 82b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * STATE_CONFIGURED => STATE_CONSTRUCTED: 83b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * When disconnect() is called after making sure stream is idle with 84b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams * waitUntilIdle(). 85b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams */ 86b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Samsclass Camera3Stream : 87b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams protected camera3_stream, 88b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams public virtual Camera3StreamInterface, 89b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams public virtual RefBase { 90bdb046001675f949e7e9b2cd0bfd63a5889d97edJason Sams public: 91b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 92b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams virtual ~Camera3Stream(); 93b4d3568f68b1ae97e2a82061cccf220f8e93cd94Jason Sams 94f2a5d7326b38e5a28b6618f9b1e5a021aef7179fJason Sams static Camera3Stream* cast(camera3_stream *stream); 95c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams static const Camera3Stream* cast(const camera3_stream *stream); 96e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 97e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk /** 98c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Get the stream's ID 99c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams */ 100c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams int getId() const; 101383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk 102c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams /** 103c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * Get the stream's dimensions and format 104c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams */ 105e64c2f172516972abe581ca1b762302dd2ba1199Jason Sams uint32_t getWidth() const; 106c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t getHeight() const; 107c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams int getFormat() const; 1083eb28f07ab726a2e73063b95729abc191103b432Jason Sams 109e9ed6cc76bbff93f681cf4a72d9cfc2bc2d00ae9Jason Sams /** 110e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * Start the stream configuration process. Returns a handle to the stream's 111e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * information to be passed into the HAL device's configure_streams call. 112e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * 113e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * Until finishConfiguration() is called, no other methods on the stream may be 114e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * called. The usage and max_buffers fields of camera3_stream may be modified 115e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * between start/finishConfiguration, but may not be changed after that. 116e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * The priv field of camera3_stream may be modified at any time after 117e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * startConfiguration. 118e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * 119e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * Returns NULL in case of error starting configuration. 120c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams */ 121c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams camera3_stream* startConfiguration(); 1223eb28f07ab726a2e73063b95729abc191103b432Jason Sams 123383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk /** 1249ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams * Check if the stream is mid-configuration (start has been called, but not 125c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams * finish). Used for lazy completion of configuration. 126433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams */ 127c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams bool isConfiguring() const; 128c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 129383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk /** 130c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams * Completes the stream configuration process. During this call, the stream 131e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * may call the device's register_stream_buffers() method. The stream 132383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * information structure returned by startConfiguration() may no longer be 133383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * modified after this call, but can still be read until the destruction of 134383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * the stream. 135383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * 136383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * Returns: 137383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * OK on a successful configuration 138e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * NO_INIT in case of a serious error from the HAL device 139e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * NO_MEMORY in case of an error registering buffers 1409ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams * INVALID_OPERATION in case connecting to the consumer failed 141c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams */ 142cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams status_t finishConfiguration(camera3_device *hal3Device); 143c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 144c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams /** 145383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * Fill in the camera3_stream_buffer with the next valid buffer for this 146c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams * stream, to hand over to the HAL. 147e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * 148383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * This method may only be called once finishConfiguration has been called. 149383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * For bidirectional streams, this method applies to the output-side 150383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * buffers. 151383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * 152383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk */ 153383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk status_t getBuffer(camera3_stream_buffer *buffer); 154383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk 155e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk /** 156e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk * Return a buffer to the stream after use by the HAL. 1579ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams * 158c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams * This method may only be called for buffers provided by getBuffer(). 159cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams * For bidirectional streams, this method applies to the output-side buffers 160c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams */ 161c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams status_t returnBuffer(const camera3_stream_buffer &buffer, 162383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk nsecs_t timestamp); 163c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams 164e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk /** 165383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * Fill in the camera3_stream_buffer with the next valid buffer for this 166383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * stream, to hand over to the HAL. 167383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * 168383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * This method may only be called once finishConfiguration has been called. 169383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * For bidirectional streams, this method applies to the input-side 170383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * buffers. 171383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * 172e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk */ 173e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk status_t getInputBuffer(camera3_stream_buffer *buffer); 1749ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 175c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams /** 176cfb1d11ce6826fce7241d316d8b7dcab661f63a6Jason Sams * Return a buffer to the stream after use by the HAL. 177c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams * 178c9d43db4d216b01b13aebfdb31d5615909591b33Jason Sams * This method may only be called for buffers provided by getBuffer(). 179383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * For bidirectional streams, this method applies to the input-side buffers 18095333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk */ 181e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk status_t returnInputBuffer(const camera3_stream_buffer &buffer); 182383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk 183383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk /** 184383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * Whether any of the stream's buffers are currently in use by the HAL, 185383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * including buffers that have been returned but not yet had their 186383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * release fence signaled. 187383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk */ 188383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk bool hasOutstandingBuffers() const; 189e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 190e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk enum { 19195333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk TIMEOUT_NEVER = -1 19295333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk }; 19395333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk /** 19495333f998fd4a983f89e5128e85f6f710d200bd9Alex Sakhartchouk * Wait until the HAL is done with all of this stream's buffers, including 195383e5b1f68c321a77bfd7466fa1171a9bfab4a6fAlex Sakhartchouk * signalling all release fences. Returns TIMED_OUT if the timeout is exceeded, 1963a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams * OK on success. Pass in TIMEOUT_NEVER for timeout to indicate an indefinite wait. 197e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk */ 198e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual status_t waitUntilIdle(nsecs_t timeout) = 0; 199e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 2009ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams /** 2013a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams * Disconnect stream from its non-HAL endpoint. After this, 2023a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams * start/finishConfiguration must be called before the stream can be used 2033a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams * again. This cannot be called if the stream has outstanding dequeued 2043a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams * buffers. 2053a97c59c6f8cc974d007080365b82c5177ba6a3fJason Sams */ 206326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams status_t disconnect(); 207c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams 208c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams /** 209be504f2d0c5db4485e6db5b406e9e8b8c390dea9Jason Sams * Debug dump of the stream's state. 210433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams */ 211433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams virtual void dump(int fd, const Vector<String16> &args) const = 0; 2129ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 2139ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams void addBufferListener( 2149ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams wp<Camera3StreamBufferListener> listener); 215e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk void removeBufferListener( 2164c9a208262a1fc9ba062d21b8c6c787b8a822991Jason Sams const sp<Camera3StreamBufferListener>& listener); 2179ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams 218433eca30b2efe0cf84bbda33f2dfdfd6dcafaf59Jason Sams protected: 2199ebb0c44ece47531f3d0a98ba52ae448de42032bJason Sams const int mId; 220c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams const String8 mName; 221c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams // Zero for formats with fixed buffer size for given dimensions. 222c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams const size_t mMaxSize; 223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk enum { 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk STATE_ERROR, 226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk STATE_CONSTRUCTED, 227fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk STATE_IN_CONFIG, 228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk STATE_IN_RECONFIG, 229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk STATE_CONFIGURED 230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } mState; 231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mutable Mutex mLock; 2334815c0d121310cfcd6a8aba4eab77a9910af53acJason Sams 234c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams Camera3Stream(int id, camera3_stream_type type, 235c460e55d78cbe8bee95c5c947dfe541218142a5bJason Sams uint32_t width, uint32_t height, size_t maxSize, int format); 236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 237326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams /** 238326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Interface to be implemented by derived classes 239326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 240326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 241326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // getBuffer / returnBuffer implementations 242326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 243326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams // Since camera3_stream_buffer includes a raw pointer to the stream, 244771565f47fc44608444c00aa8fa3bda769ceaeceJason Sams // cast to camera3_stream*, implementations must increment the 2458ce125be69531dbf3a7e856d5e59d1b8e2789db0Jason Sams // refcount of the stream manually in getBufferLocked, and decrement it in 246e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // returnBufferLocked. 247e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual status_t getBufferLocked(camera3_stream_buffer *buffer); 248e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual status_t returnBufferLocked(const camera3_stream_buffer &buffer, 249e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk nsecs_t timestamp); 250e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual status_t getInputBufferLocked(camera3_stream_buffer *buffer); 251e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual status_t returnInputBufferLocked( 252e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk const camera3_stream_buffer &buffer); 253e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual bool hasOutstandingBuffersLocked() const = 0; 254e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // Can return -ENOTCONN when we are already disconnected (not an error) 255e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual status_t disconnectLocked() = 0; 256e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 257e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // Configure the buffer queue interface to the other end of the stream, 258e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // after the HAL has provided usage and max_buffers values. After this call, 259e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // the stream must be ready to produce all buffers for registration with 260e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // HAL. 261e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual status_t configureQueueLocked() = 0; 262e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 263e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // Get the total number of buffers in the queue 264e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk virtual size_t getBufferCountLocked() = 0; 265e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 266e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk private: 267e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk uint32_t oldUsage; 268e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk uint32_t oldMaxBuffers; 269e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 270e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk // Gets all buffers from endpoint and registers them with the HAL. 271e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk status_t registerBuffersLocked(camera3_device *hal3Device); 272e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 273e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk void fireBufferListenersLocked(const camera3_stream_buffer& buffer, 274e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk bool acquired, bool output); 275e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk List<wp<Camera3StreamBufferListener> > mBufferListenerList; 276e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 277e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}; // class Camera3Stream 278e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 279e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}; // namespace camera3 280e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 281e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk}; // namespace android 282e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk 283e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk#endif 284e7ae69f4a70f1813cf8086ebd9714192c635300aAlex Sakhartchouk