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 <utils/List.h> 35 #include "QCamera3Stream.h" 36 #include "QCamera3Mem.h" 37 #include "QCamera3PostProc.h" 38 #include "QCamera3HALHeader.h" 39 #include "utils/Vector.h" 40 41 extern "C" { 42 #include <mm_camera_interface.h> 43 } 44 45 using namespace android; 46 47 namespace qcamera { 48 49 typedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata, 50 camera3_stream_buffer_t *buffer, 51 uint32_t frame_number, void *userdata); 52 53 class QCamera3Channel 54 { 55 public: 56 QCamera3Channel(uint32_t cam_handle, 57 mm_camera_ops_t *cam_ops, 58 channel_cb_routine cb_routine, 59 cam_padding_info_t *paddingInfo, 60 void *userData); 61 QCamera3Channel(); 62 virtual ~QCamera3Channel(); 63 64 int32_t addStream(cam_stream_type_t streamType, 65 cam_format_t streamFormat, 66 cam_dimension_t streamDim, 67 uint8_t minStreamBufnum); 68 virtual int32_t start(); 69 virtual int32_t stop(); 70 int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 71 72 uint32_t getStreamTypeMask(); 73 uint32_t getStreamID(uint32_t streamMask); 74 virtual int32_t initialize() = 0; request(buffer_handle_t *,uint32_t)75 virtual int32_t request(buffer_handle_t * /*buffer*/, 76 uint32_t /*frameNumber*/){ return 0;}; request(buffer_handle_t *,uint32_t,mm_camera_buf_def_t *,metadata_buffer_t *)77 virtual int32_t request(buffer_handle_t * /*buffer*/, 78 uint32_t /*frameNumber*/, 79 mm_camera_buf_def_t* /*pInputBuffer*/, 80 metadata_buffer_t* /*metadata*/){ return 0;}; 81 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 82 QCamera3Stream *stream) = 0; 83 84 virtual int32_t registerBuffer(buffer_handle_t *buffer) = 0; 85 virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 86 virtual void putStreamBufs() = 0; 87 88 QCamera3Stream *getStreamByHandle(uint32_t streamHandle); getMyHandle()89 uint32_t getMyHandle() const {return m_handle;}; getNumOfStreams()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; 99 protected: 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. */ 123 class QCamera3RegularChannel : public QCamera3Channel 124 { 125 public: 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 cam_stream_type_t stream_type); 133 virtual ~QCamera3RegularChannel(); 134 135 virtual int32_t start(); 136 virtual int32_t initialize(); 137 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 138 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 139 QCamera3Stream *stream); 140 141 virtual QCamera3Memory *getStreamBufs(uint32_t len); putStreamBufs()142 virtual void putStreamBufs() {}; 143 mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer); 144 virtual int32_t registerBuffer(buffer_handle_t *buffer); 145 146 public: 147 static int kMaxBuffers; 148 protected: 149 QCamera3GrallocMemory mMemory; 150 private: 151 camera3_stream_t *mCamera3Stream; 152 uint32_t mNumBufs; 153 154 cam_stream_type_t mStreamType; // Stream type 155 }; 156 157 /* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 158 class QCamera3MetadataChannel : public QCamera3Channel 159 { 160 public: 161 QCamera3MetadataChannel(uint32_t cam_handle, 162 mm_camera_ops_t *cam_ops, 163 channel_cb_routine cb_routine, 164 cam_padding_info_t *paddingInfo, 165 void *userData); 166 virtual ~QCamera3MetadataChannel(); 167 168 virtual int32_t initialize(); 169 170 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 171 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 172 QCamera3Stream *stream); 173 174 virtual QCamera3Memory *getStreamBufs(uint32_t len); 175 virtual void putStreamBufs(); registerBuffer(buffer_handle_t *)176 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 177 { return NO_ERROR; }; 178 179 private: 180 QCamera3HeapMemory *mMemory; 181 }; 182 183 /* QCameraRawChannel is for Dumping raw stream generated by camera daemon. */ 184 class QCameraRawChannel : public QCamera3Channel 185 { 186 public: 187 QCameraRawChannel(uint32_t cam_handle, 188 mm_camera_ops_t *cam_ops, 189 channel_cb_routine cb_routine, 190 cam_padding_info_t *paddingInfo, 191 void *userData, 192 cam_dimension_t *raw_dim); 193 virtual ~QCameraRawChannel(); 194 195 virtual int32_t initialize(); 196 197 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 198 virtual int32_t registerBuffers(uint32_t num_buffers, 199 buffer_handle_t **buffers); 200 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 201 QCamera3Stream *stream); 202 203 virtual QCamera3Memory *getStreamBufs(uint32_t len); 204 virtual void putStreamBufs(); 205 void dumpRawSnapshot(mm_camera_buf_def_t *frame); registerBuffer(buffer_handle_t *)206 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 207 { return NO_ERROR; }; 208 209 private: 210 QCamera3HeapMemory *mMemory; 211 uint32_t mWidth, mHeight; 212 uint32_t mMaxBuffers; 213 }; 214 215 /* QCamera3RawChannel is for opaqueu/cross-platform raw stream containing 216 * vendor specific bayer data or 16-bit unpacked bayer data */ 217 class QCamera3RawChannel : public QCamera3RegularChannel 218 { 219 public: 220 QCamera3RawChannel(uint32_t cam_handle, 221 mm_camera_ops_t *cam_ops, 222 channel_cb_routine cb_routine, 223 cam_padding_info_t *paddingInfo, 224 void *userData, 225 camera3_stream_t *stream, 226 bool raw_16 = false); 227 virtual ~QCamera3RawChannel(); 228 229 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 230 QCamera3Stream *stream); 231 232 233 public: 234 static int kMaxBuffers; 235 236 private: 237 bool mRawDump; 238 bool mIsRaw16; 239 240 void dumpRawSnapshot(mm_camera_buf_def_t *frame); 241 void convertToRaw16(mm_camera_buf_def_t *frame); 242 }; 243 244 /* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 245 * by the hardware, and encoded to a JPEG stream */ 246 class QCamera3PicChannel : public QCamera3Channel 247 { 248 public: 249 QCamera3PicChannel(uint32_t cam_handle, 250 mm_camera_ops_t *cam_ops, 251 channel_cb_routine cb_routine, 252 cam_padding_info_t *paddingInfo, 253 void *userData, 254 camera3_stream_t *stream); 255 ~QCamera3PicChannel(); 256 257 virtual int32_t initialize(); 258 virtual int32_t stop(); 259 virtual int32_t request(buffer_handle_t *buffer, 260 uint32_t frameNumber, 261 mm_camera_buf_def_t* pInputBuffer, 262 metadata_buffer_t* metadata); 263 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 264 QCamera3Stream *stream); 265 266 virtual QCamera3Memory *getStreamBufs(uint32_t len); 267 virtual void putStreamBufs(); 268 isWNREnabled()269 bool isWNREnabled() {return m_bWNROn;}; 270 bool needOnlineRotation(); 271 QCamera3Exif *getExifData(metadata_buffer_t *metadata, 272 jpeg_settings_t *jpeg_settings); 273 void overrideYuvSize(uint32_t width, uint32_t height); 274 static void jpegEvtHandle(jpeg_job_status_t status, 275 uint32_t /*client_hdl*/, 276 uint32_t jobId, 277 mm_jpeg_output_t *p_output, 278 void *userdata); 279 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 280 void *userdata); 281 int32_t queueReprocMetadata(metadata_buffer_t *metadata); 282 virtual int32_t registerBuffer(buffer_handle_t *buffer); 283 284 private: 285 int32_t queueJpegSetting(int32_t out_buf_index, metadata_buffer_t *metadata); 286 287 public: 288 static int kMaxBuffers; 289 QCamera3PostProcessor m_postprocessor; // post processor 290 private: 291 camera3_stream_t *mCamera3Stream; 292 uint32_t mNumBufs; 293 int32_t mCurrentBufIndex; 294 bool m_bWNROn; 295 uint32_t mYuvWidth, mYuvHeight; 296 297 QCamera3GrallocMemory mMemory; 298 QCamera3HeapMemory *mYuvMemory; 299 QCamera3Channel *m_pMetaChannel; 300 mm_camera_super_buf_t *mMetaFrame; 301 302 }; 303 304 // reprocess channel class 305 class QCamera3ReprocessChannel : public QCamera3Channel 306 { 307 public: 308 QCamera3ReprocessChannel(uint32_t cam_handle, 309 mm_camera_ops_t *cam_ops, 310 channel_cb_routine cb_routine, 311 cam_padding_info_t *paddingInfo, 312 void *userData, void *ch_hdl); 313 QCamera3ReprocessChannel(); 314 virtual ~QCamera3ReprocessChannel(); 315 // online reprocess 316 int32_t doReprocess(mm_camera_super_buf_t *frame, 317 mm_camera_super_buf_t *meta_frame); 318 int32_t doReprocessOffline(mm_camera_super_buf_t *frame, 319 metadata_buffer_t *metadata); 320 // offline reprocess 321 int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val, 322 mm_camera_super_buf_t *meta_buf); 323 virtual QCamera3Memory *getStreamBufs(uint32_t len); 324 virtual void putStreamBufs(); 325 virtual int32_t initialize(); 326 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 327 QCamera3Stream *stream); 328 virtual int32_t stop(); 329 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 330 void* userdata); 331 int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config, 332 QCamera3Channel *pSrcChannel, 333 QCamera3Channel *pMetaChannel); 334 QCamera3Stream *getStreamBySrcHandle(uint32_t srcHandle); 335 QCamera3Stream *getSrcStreamBySrcHandle(uint32_t srcHandle); 336 int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame); registerBuffer(buffer_handle_t *)337 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 338 { return NO_ERROR; }; 339 340 public: 341 void *picChHandle; 342 private: 343 typedef struct { 344 QCamera3Stream *stream; 345 cam_mapping_buf_type type; 346 int index; 347 } OfflineBuffer; 348 349 android::List<OfflineBuffer> mOfflineBuffers; 350 uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE]; 351 QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess 352 QCamera3Channel *m_pMetaChannel; 353 QCamera3HeapMemory *mMemory; 354 }; 355 356 /* QCamera3SupportChannel is for HAL internal consumption only */ 357 class QCamera3SupportChannel : public QCamera3Channel 358 { 359 public: 360 QCamera3SupportChannel(uint32_t cam_handle, 361 mm_camera_ops_t *cam_ops, 362 cam_padding_info_t *paddingInfo, 363 void *userData); 364 virtual ~QCamera3SupportChannel(); 365 366 virtual int32_t initialize(); 367 368 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 369 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 370 QCamera3Stream *stream); 371 372 virtual QCamera3Memory *getStreamBufs(uint32_t le); 373 virtual void putStreamBufs(); registerBuffer(buffer_handle_t *)374 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 375 { return NO_ERROR; }; 376 377 static cam_dimension_t kDim; 378 private: 379 QCamera3HeapMemory *mMemory; 380 }; 381 382 }; // namespace qcamera 383 384 #endif /* __QCAMERA_CHANNEL_H__ */ 385