Camera3OutputStream.h revision 5d677d1f0879d5101e38df480a38228a64d63959
1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ANDROID_SERVERS_CAMERA3_OUTPUT_STREAM_H 18#define ANDROID_SERVERS_CAMERA3_OUTPUT_STREAM_H 19 20#include <utils/RefBase.h> 21#include <gui/IProducerListener.h> 22#include <gui/Surface.h> 23 24#include "Camera3Stream.h" 25#include "Camera3IOStreamBase.h" 26#include "Camera3OutputStreamInterface.h" 27#include "Camera3BufferManager.h" 28 29namespace android { 30 31namespace camera3 { 32 33class Camera3BufferManager; 34 35/** 36 * Stream info structure that holds the necessary stream info for buffer manager to use for 37 * buffer allocation and management. 38 */ 39struct StreamInfo { 40 int streamId; 41 int streamSetId; 42 uint32_t width; 43 uint32_t height; 44 uint32_t format; 45 android_dataspace dataSpace; 46 uint32_t combinedUsage; 47 size_t totalBufferCount; 48 bool isConfigured; 49 StreamInfo(int id = CAMERA3_STREAM_ID_INVALID, 50 int setId = CAMERA3_STREAM_SET_ID_INVALID, 51 uint32_t w = 0, 52 uint32_t h = 0, 53 uint32_t fmt = 0, 54 android_dataspace ds = HAL_DATASPACE_UNKNOWN, 55 uint32_t usage = 0, 56 size_t bufferCount = 0, 57 bool configured = false) : 58 streamId(id), 59 streamSetId(setId), 60 width(w), 61 height(h), 62 format(fmt), 63 dataSpace(ds), 64 combinedUsage(usage), 65 totalBufferCount(bufferCount), 66 isConfigured(configured){} 67}; 68 69/** 70 * A class for managing a single stream of output data from the camera device. 71 */ 72class Camera3OutputStream : 73 public Camera3IOStreamBase, 74 public Camera3OutputStreamInterface { 75 public: 76 /** 77 * Set up a stream for formats that have 2 dimensions, such as RAW and YUV. 78 * A valid stream set id needs to be set to support buffer sharing between multiple 79 * streams. 80 */ 81 Camera3OutputStream(int id, sp<Surface> consumer, 82 uint32_t width, uint32_t height, int format, 83 android_dataspace dataSpace, camera3_stream_rotation_t rotation, 84 nsecs_t timestampOffset, int setId = CAMERA3_STREAM_SET_ID_INVALID); 85 86 /** 87 * Set up a stream for formats that have a variable buffer size for the same 88 * dimensions, such as compressed JPEG. 89 * A valid stream set id needs to be set to support buffer sharing between multiple 90 * streams. 91 */ 92 Camera3OutputStream(int id, sp<Surface> consumer, 93 uint32_t width, uint32_t height, size_t maxSize, int format, 94 android_dataspace dataSpace, camera3_stream_rotation_t rotation, 95 nsecs_t timestampOffset, int setId = CAMERA3_STREAM_SET_ID_INVALID); 96 97 /** 98 * Set up a stream with deferred consumer for formats that have 2 dimensions, such as 99 * RAW and YUV. The consumer must be set before using this stream for output. A valid 100 * stream set id needs to be set to support buffer sharing between multiple streams. 101 */ 102 Camera3OutputStream(int id, uint32_t width, uint32_t height, int format, 103 uint32_t consumerUsage, android_dataspace dataSpace, 104 camera3_stream_rotation_t rotation, nsecs_t timestampOffset, 105 int setId = CAMERA3_STREAM_SET_ID_INVALID); 106 107 virtual ~Camera3OutputStream(); 108 109 /** 110 * Camera3Stream interface 111 */ 112 113 virtual void dump(int fd, const Vector<String16> &args) const; 114 115 /** 116 * Set the transform on the output stream; one of the 117 * HAL_TRANSFORM_* / NATIVE_WINDOW_TRANSFORM_* constants. 118 */ 119 status_t setTransform(int transform); 120 121 /** 122 * Return if this output stream is for video encoding. 123 */ 124 bool isVideoStream() const; 125 /** 126 * Return if this output stream is consumed by hardware composer. 127 */ 128 bool isConsumedByHWComposer() const; 129 130 /** 131 * Return if the consumer configuration of this stream is deferred. 132 */ 133 virtual bool isConsumerConfigurationDeferred() const; 134 135 /** 136 * Set the consumer surface to the output stream. 137 */ 138 virtual status_t setConsumer(sp<Surface> consumer); 139 140 class BufferReleasedListener : public BnProducerListener { 141 public: 142 BufferReleasedListener(wp<Camera3OutputStream> parent) : mParent(parent) {} 143 144 /** 145 * Implementation of IProducerListener, used to notify this stream that the consumer 146 * has returned a buffer and it is ready to return to Camera3BufferManager for reuse. 147 */ 148 virtual void onBufferReleased(); 149 150 private: 151 wp<Camera3OutputStream> mParent; 152 }; 153 154 /** 155 * Set the graphic buffer manager to get/return the stream buffers. 156 * 157 * It is only legal to call this method when stream is in STATE_CONSTRUCTED state. 158 */ 159 status_t setBufferManager(sp<Camera3BufferManager> bufferManager); 160 161 protected: 162 Camera3OutputStream(int id, camera3_stream_type_t type, 163 uint32_t width, uint32_t height, int format, 164 android_dataspace dataSpace, camera3_stream_rotation_t rotation, 165 int setId = CAMERA3_STREAM_SET_ID_INVALID); 166 167 /** 168 * Note that we release the lock briefly in this function 169 */ 170 virtual status_t returnBufferCheckedLocked( 171 const camera3_stream_buffer &buffer, 172 nsecs_t timestamp, 173 bool output, 174 /*out*/ 175 sp<Fence> *releaseFenceOut); 176 177 virtual status_t disconnectLocked(); 178 179 sp<Surface> mConsumer; 180 181 private: 182 int mTransform; 183 184 virtual status_t setTransformLocked(int transform); 185 186 bool mTraceFirstBuffer; 187 188 // Name of Surface consumer 189 String8 mConsumerName; 190 191 // Whether consumer assumes MONOTONIC timestamp 192 bool mUseMonoTimestamp; 193 194 /** 195 * GraphicBuffer manager this stream is registered to. Used to replace the buffer 196 * allocation/deallocation role of BufferQueue. 197 */ 198 sp<Camera3BufferManager> mBufferManager; 199 200 /** 201 * Buffer released listener, used to notify the buffer manager that a buffer is released 202 * from consumer side. 203 */ 204 sp<BufferReleasedListener> mBufferReleasedListener; 205 206 /** 207 * Flag indicating if the buffer manager is used to allocate the stream buffers 208 */ 209 bool mUseBufferManager; 210 211 /** 212 * Timestamp offset for video and hardware composer consumed streams 213 */ 214 nsecs_t mTimestampOffset; 215 216 /** 217 * Consumer end point usage flag set by the constructor for the deferred 218 * consumer case. 219 */ 220 uint32_t mConsumerUsage; 221 222 /** 223 * Internal Camera3Stream interface 224 */ 225 virtual status_t getBufferLocked(camera3_stream_buffer *buffer); 226 virtual status_t returnBufferLocked( 227 const camera3_stream_buffer &buffer, 228 nsecs_t timestamp); 229 230 virtual status_t configureQueueLocked(); 231 232 virtual status_t getEndpointUsage(uint32_t *usage) const; 233 234}; // class Camera3OutputStream 235 236} // namespace camera3 237 238} // namespace android 239 240#endif 241