QCamera3Channel.h revision c14c36c12f3fe65c209f99e43e2863ac71202e32
1/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30#ifndef __QCAMERA3_CHANNEL_H__ 31#define __QCAMERA3_CHANNEL_H__ 32 33#include <hardware/camera3.h> 34#include "QCamera3Stream.h" 35#include "QCamera3Mem.h" 36#include "QCamera3PostProc.h" 37#include "QCamera3HALHeader.h" 38 39extern "C" { 40#include <mm_camera_interface.h> 41} 42 43using namespace android; 44 45namespace qcamera { 46 47typedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata, 48 camera3_stream_buffer_t *buffer, 49 uint32_t frame_number, void *userdata); 50 51class QCamera3Channel 52{ 53public: 54 QCamera3Channel(uint32_t cam_handle, 55 mm_camera_ops_t *cam_ops, 56 channel_cb_routine cb_routine, 57 cam_padding_info_t *paddingInfo, 58 void *userData); 59 QCamera3Channel(); 60 virtual ~QCamera3Channel(); 61 62 int32_t addStream(cam_stream_type_t streamType, 63 cam_format_t streamFormat, 64 cam_dimension_t streamDim, 65 uint8_t minStreamBufnum); 66 int32_t start(); 67 int32_t stop(); 68 int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 69 70 uint32_t getStreamTypeMask(); 71 72 virtual int32_t registerBuffers(uint32_t num_buffers, 73 buffer_handle_t **buffers) = 0; 74 virtual int32_t initialize() = 0; 75 virtual int32_t request(buffer_handle_t * /*buffer*/, 76 uint32_t /*frameNumber*/){ return 0;}; 77 virtual int32_t request(buffer_handle_t * /*buffer*/, 78 uint32_t /*frameNumber*/, 79 jpeg_settings_t* /*mJpegSettings*/, 80 mm_camera_buf_def_t* /*pInputBuffer*/, 81 QCamera3Channel* /*pInputChannel*/){ return 0;}; 82 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 83 QCamera3Stream *stream) = 0; 84 85 virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 86 virtual void putStreamBufs() = 0; 87 88 QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 89 uint32_t getMyHandle() const {return m_handle;}; 90 uint8_t getNumOfStreams() const {return m_numStreams;}; 91 QCamera3Stream *getStreamByIndex(uint8_t index); 92 93 static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 94 QCamera3Stream *stream, void *userdata); 95 void *mUserData; 96 cam_padding_info_t *mPaddingInfo; 97 QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 98 uint8_t m_numStreams; 99protected: 100 101 virtual int32_t init(mm_camera_channel_attr_t *attr, 102 mm_camera_buf_notify_t dataCB); 103 int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 104 105 uint32_t m_camHandle; 106 mm_camera_ops_t *m_camOps; 107 bool m_bIsActive; 108 109 uint32_t m_handle; 110 111 112 mm_camera_buf_notify_t mDataCB; 113 114 115 QCamera3HeapMemory *mStreamInfoBuf; 116 channel_cb_routine mChannelCB; 117 //cam_padding_info_t *mPaddingInfo; 118}; 119 120/* QCamera3RegularChannel is used to handle all streams that are directly 121 * generated by hardware and given to frameworks without any postprocessing at HAL. 122 * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 123class QCamera3RegularChannel : public QCamera3Channel 124{ 125public: 126 QCamera3RegularChannel(uint32_t cam_handle, 127 mm_camera_ops_t *cam_ops, 128 channel_cb_routine cb_routine, 129 cam_padding_info_t *paddingInfo, 130 void *userData, 131 camera3_stream_t *stream); 132 QCamera3RegularChannel(uint32_t cam_handle, 133 mm_camera_ops_t *cam_ops, 134 channel_cb_routine cb_routine, 135 cam_padding_info_t *paddingInfo, 136 void *userData, 137 camera3_stream_t *stream, 138 uint32_t width, uint32_t height); 139 virtual ~QCamera3RegularChannel(); 140 141 virtual int32_t initialize(); 142 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 143 virtual int32_t registerBuffers(uint32_t num_buffers, 144 buffer_handle_t **buffers); 145 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 146 QCamera3Stream *stream); 147 148 virtual QCamera3Memory *getStreamBufs(uint32_t le); 149 virtual void putStreamBufs(); 150 mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer); 151 152public: 153 static int kMaxBuffers; 154private: 155 camera3_stream_t *mCamera3Stream; 156 uint32_t mNumBufs; 157 buffer_handle_t **mCamera3Buffers; 158 159 QCamera3GrallocMemory *mMemory; 160 // width and height of internal stream may be different than what's 161 // specified in camera3_stream_t. For example: ZSL stream size is 162 // always the active region size, but internally we use the JPEG 163 // size. 164 uint32_t mWidth, mHeight; 165}; 166 167/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 168class QCamera3MetadataChannel : public QCamera3Channel 169{ 170public: 171 QCamera3MetadataChannel(uint32_t cam_handle, 172 mm_camera_ops_t *cam_ops, 173 channel_cb_routine cb_routine, 174 cam_padding_info_t *paddingInfo, 175 void *userData); 176 virtual ~QCamera3MetadataChannel(); 177 178 virtual int32_t initialize(); 179 180 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 181 virtual int32_t registerBuffers(uint32_t num_buffers, 182 buffer_handle_t **buffers); 183 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 184 QCamera3Stream *stream); 185 186 virtual QCamera3Memory *getStreamBufs(uint32_t le); 187 virtual void putStreamBufs(); 188 189private: 190 QCamera3HeapMemory *mMemory; 191}; 192 193/* QCameraRawChannel is for Dumping raw stream generated by camera daemon. */ 194class QCameraRawChannel : public QCamera3Channel 195{ 196public: 197 QCameraRawChannel(uint32_t cam_handle, 198 mm_camera_ops_t *cam_ops, 199 channel_cb_routine cb_routine, 200 cam_padding_info_t *paddingInfo, 201 void *userData, 202 cam_dimension_t *raw_dim); 203 virtual ~QCameraRawChannel(); 204 205 virtual int32_t initialize(); 206 207 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 208 virtual int32_t registerBuffers(uint32_t num_buffers, 209 buffer_handle_t **buffers); 210 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 211 QCamera3Stream *stream); 212 213 virtual QCamera3Memory *getStreamBufs(uint32_t le); 214 virtual void putStreamBufs(); 215 void dumpRawSnapshot(mm_camera_buf_def_t *frame); 216 217private: 218 QCamera3HeapMemory *mMemory; 219 uint32_t mWidth, mHeight; 220 uint32_t mMaxBuffers; 221}; 222 223 224/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 225 * by the hardware, and encoded to a JPEG stream */ 226class QCamera3PicChannel : public QCamera3Channel 227{ 228public: 229 QCamera3PicChannel(uint32_t cam_handle, 230 mm_camera_ops_t *cam_ops, 231 channel_cb_routine cb_routine, 232 cam_padding_info_t *paddingInfo, 233 void *userData, 234 camera3_stream_t *stream); 235 ~QCamera3PicChannel(); 236 237 virtual int32_t initialize(); 238 239 virtual int32_t request(buffer_handle_t *buffer, 240 uint32_t frameNumber, jpeg_settings_t* mJpegSettings, 241 mm_camera_buf_def_t* pInputBuffer,QCamera3Channel* pInputChannel); 242 virtual int32_t registerBuffers(uint32_t num_buffers, 243 buffer_handle_t **buffers); 244 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 245 QCamera3Stream *stream); 246 247 virtual QCamera3Memory *getStreamBufs(uint32_t le); 248 virtual void putStreamBufs(); 249 bool isWNREnabled() {return m_bWNROn;}; 250 bool needOnlineRotation(); 251 void getThumbnailSize(cam_dimension_t &dim); 252 int getJpegQuality(); 253 int getJpegRotation(); 254 bool isRawSnapshot(); 255 QCamera3Exif *getExifData(); 256 static void jpegEvtHandle(jpeg_job_status_t status, 257 uint32_t /*client_hdl*/, 258 uint32_t jobId, 259 mm_jpeg_output_t *p_output, 260 void *userdata); 261 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 262 void *userdata); 263 void queueMetadata(mm_camera_super_buf_t *metadata_buf, 264 QCamera3Channel *pMetaChannel, 265 bool relinquish); 266 267public: 268 static int kMaxBuffers; 269 QCamera3PostProcessor m_postprocessor; // post processor 270 cam_dimension_t m_max_pic_dim; 271 272private: 273 camera3_stream_t *mCamera3Stream; 274 uint32_t mNumBufs; 275 buffer_handle_t **mCamera3Buffers; 276 jpeg_settings_t* mJpegSettings; 277 int32_t mCurrentBufIndex; 278 bool m_bWNROn; 279 280 281 QCamera3GrallocMemory *mMemory; 282 QCamera3HeapMemory *mYuvMemory; 283 QCamera3Channel *m_pMetaChannel; 284 mm_camera_super_buf_t *mMetaFrame; 285}; 286 287// reprocess channel class 288class QCamera3ReprocessChannel : public QCamera3Channel 289{ 290public: 291 QCamera3ReprocessChannel(uint32_t cam_handle, 292 mm_camera_ops_t *cam_ops, 293 channel_cb_routine cb_routine, 294 cam_padding_info_t *paddingInfo, 295 void *userData, void *ch_hdl); 296 QCamera3ReprocessChannel(); 297 virtual ~QCamera3ReprocessChannel(); 298 // online reprocess 299 int32_t doReprocess(mm_camera_super_buf_t *frame, 300 mm_camera_super_buf_t *meta_frame); 301 // offline reprocess 302 int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val, 303 mm_camera_super_buf_t *meta_buf); 304 virtual int32_t registerBuffers(uint32_t num_buffers, buffer_handle_t **buffers); 305 virtual QCamera3Memory *getStreamBufs(uint32_t len); 306 virtual void putStreamBufs(); 307 virtual int32_t initialize(); 308 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 309 QCamera3Stream *stream); 310 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 311 void* userdata); 312 int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &config, 313 QCamera3Channel *pSrcChannel, 314 QCamera3Channel *pMetaChannel); 315 QCamera3Stream *getStreamBySourceHandle(uint32_t srcHandle); 316 int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame); 317public: 318 void *picChHandle; 319private: 320 uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE]; 321 QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess 322 QCamera3Channel *m_pMetaChannel; 323 QCamera3HeapMemory *mMemory; 324}; 325 326}; // namespace qcamera 327 328#endif /* __QCAMERA_CHANNEL_H__ */ 329