QCamera3Channel.h revision 7ee407aa1024789089aad411c372c79423699976
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 virtual int32_t registerBuffers(uint32_t num_buffers, 71 buffer_handle_t **buffers) = 0; 72 virtual int32_t initialize() = 0; 73 virtual int32_t request(buffer_handle_t * /*buffer*/, 74 uint32_t /*frameNumber*/){ return 0;}; 75 virtual int32_t request(buffer_handle_t * /*buffer*/, 76 uint32_t /*frameNumber*/, 77 jpeg_settings_t* /*mJpegSettings*/, 78 mm_camera_buf_def_t* /*pInputBuffer*/, 79 QCamera3Channel* /*pInputChannel*/){ return 0;}; 80 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 81 QCamera3Stream *stream) = 0; 82 83 virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 84 virtual void putStreamBufs() = 0; 85 86 QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 87 uint32_t getMyHandle() const {return m_handle;}; 88 uint8_t getNumOfStreams() const {return m_numStreams;}; 89 QCamera3Stream *getStreamByIndex(uint8_t index); 90 91 static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 92 QCamera3Stream *stream, void *userdata); 93 void *mUserData; 94 cam_padding_info_t *mPaddingInfo; 95 QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 96 uint8_t m_numStreams; 97protected: 98 99 virtual int32_t init(mm_camera_channel_attr_t *attr, 100 mm_camera_buf_notify_t dataCB); 101 int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 102 103 uint32_t m_camHandle; 104 mm_camera_ops_t *m_camOps; 105 bool m_bIsActive; 106 107 uint32_t m_handle; 108 109 110 mm_camera_buf_notify_t mDataCB; 111 112 113 QCamera3HeapMemory *mStreamInfoBuf; 114 channel_cb_routine mChannelCB; 115 //cam_padding_info_t *mPaddingInfo; 116}; 117 118/* QCamera3RegularChannel is used to handle all streams that are directly 119 * generated by hardware and given to frameworks without any postprocessing at HAL. 120 * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 121class QCamera3RegularChannel : public QCamera3Channel 122{ 123public: 124 QCamera3RegularChannel(uint32_t cam_handle, 125 mm_camera_ops_t *cam_ops, 126 channel_cb_routine cb_routine, 127 cam_padding_info_t *paddingInfo, 128 void *userData, 129 camera3_stream_t *stream); 130 QCamera3RegularChannel(uint32_t cam_handle, 131 mm_camera_ops_t *cam_ops, 132 channel_cb_routine cb_routine, 133 cam_padding_info_t *paddingInfo, 134 void *userData, 135 camera3_stream_t *stream, 136 uint32_t width, uint32_t height); 137 virtual ~QCamera3RegularChannel(); 138 139 virtual int32_t initialize(); 140 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 141 virtual int32_t registerBuffers(uint32_t num_buffers, 142 buffer_handle_t **buffers); 143 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 144 QCamera3Stream *stream); 145 146 virtual QCamera3Memory *getStreamBufs(uint32_t le); 147 virtual void putStreamBufs(); 148 mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer); 149 150public: 151 static int kMaxBuffers; 152private: 153 camera3_stream_t *mCamera3Stream; 154 uint32_t mNumBufs; 155 buffer_handle_t **mCamera3Buffers; 156 157 QCamera3GrallocMemory *mMemory; 158 // width and height of internal stream may be different than what's 159 // specified in camera3_stream_t. For example: ZSL stream size is 160 // always the active region size, but internally we use the JPEG 161 // size. 162 uint32_t mWidth, mHeight; 163}; 164 165/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 166class QCamera3MetadataChannel : public QCamera3Channel 167{ 168public: 169 QCamera3MetadataChannel(uint32_t cam_handle, 170 mm_camera_ops_t *cam_ops, 171 channel_cb_routine cb_routine, 172 cam_padding_info_t *paddingInfo, 173 void *userData); 174 virtual ~QCamera3MetadataChannel(); 175 176 virtual int32_t initialize(); 177 178 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 179 virtual int32_t registerBuffers(uint32_t num_buffers, 180 buffer_handle_t **buffers); 181 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 182 QCamera3Stream *stream); 183 184 virtual QCamera3Memory *getStreamBufs(uint32_t le); 185 virtual void putStreamBufs(); 186 187private: 188 QCamera3HeapMemory *mMemory; 189}; 190 191/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 192 * by the hardware, and encoded to a JPEG stream */ 193class QCamera3PicChannel : public QCamera3Channel 194{ 195public: 196 QCamera3PicChannel(uint32_t cam_handle, 197 mm_camera_ops_t *cam_ops, 198 channel_cb_routine cb_routine, 199 cam_padding_info_t *paddingInfo, 200 void *userData, 201 camera3_stream_t *stream); 202 ~QCamera3PicChannel(); 203 204 virtual int32_t initialize(); 205 206 virtual int32_t request(buffer_handle_t *buffer, 207 uint32_t frameNumber, jpeg_settings_t* mJpegSettings, 208 mm_camera_buf_def_t* pInputBuffer,QCamera3Channel* pInputChannel); 209 virtual int32_t registerBuffers(uint32_t num_buffers, 210 buffer_handle_t **buffers); 211 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 212 QCamera3Stream *stream); 213 214 virtual QCamera3Memory *getStreamBufs(uint32_t le); 215 virtual void putStreamBufs(); 216 bool needReprocess(); 217 bool isWNREnabled() {return m_bWNROn;}; 218 bool needOnlineRotation(); 219 void getThumbnailSize(cam_dimension_t &dim); 220 int getJpegQuality(); 221 int getJpegRotation(); 222 bool isRawSnapshot(); 223 QCamera3Exif *getExifData(); 224 static void jpegEvtHandle(jpeg_job_status_t status, 225 uint32_t /*client_hdl*/, 226 uint32_t jobId, 227 mm_jpeg_output_t *p_output, 228 void *userdata); 229 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 230 void *userdata); 231 void queueMetadata(mm_camera_super_buf_t *metadata_buf); 232 233public: 234 static int kMaxBuffers; 235 QCamera3PostProcessor m_postprocessor; // post processor 236private: 237 camera3_stream_t *mCamera3Stream; 238 uint32_t mNumBufs; 239 buffer_handle_t **mCamera3Buffers; 240 jpeg_settings_t* mJpegSettings; 241 int32_t mCurrentBufIndex; 242 bool m_bWNROn; 243 244 245 QCamera3GrallocMemory *mMemory; 246 QCamera3HeapMemory *mYuvMemory; 247}; 248 249// reprocess channel class 250class QCamera3ReprocessChannel : public QCamera3Channel 251{ 252public: 253 QCamera3ReprocessChannel(uint32_t cam_handle, 254 mm_camera_ops_t *cam_ops, 255 channel_cb_routine cb_routine, 256 cam_padding_info_t *paddingInfo, 257 void *userData, void *ch_hdl); 258 QCamera3ReprocessChannel(); 259 virtual ~QCamera3ReprocessChannel(); 260 // online reprocess 261 int32_t doReprocess(mm_camera_super_buf_t *frame, 262 mm_camera_super_buf_t *meta_frame); 263 // offline reprocess 264 int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val, 265 mm_camera_super_buf_t *meta_buf); 266 virtual int32_t registerBuffers(uint32_t num_buffers, buffer_handle_t **buffers); 267 virtual QCamera3Memory *getStreamBufs(uint32_t len); 268 virtual void putStreamBufs(); 269 virtual int32_t initialize(); 270 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 271 QCamera3Stream *stream); 272 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 273 void* userdata); 274 int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &config, 275 QCamera3Channel *pSrcChannel, 276 QCamera3Channel *pMetaChannel); 277 QCamera3Stream *getStreamBySourceHandle(uint32_t srcHandle); 278public: 279 void *picChHandle; 280private: 281 uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE]; 282 QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess 283 QCamera3Channel *m_pMetaChannel; 284 mm_camera_super_buf_t *m_metaFrame; 285 QCamera3HeapMemory *mMemory; 286}; 287 288}; // namespace qcamera 289 290#endif /* __QCAMERA_CHANNEL_H__ */ 291