QCamera3Channel.h revision 0b88c64b2bcc2a557f8a405f5c0fd767bd6e7111
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 virtual int32_t start(); 67 int32_t stop(); 68 int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 69 70 uint32_t getStreamTypeMask(); 71 uint32_t getStreamID(uint32_t streamMask); 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 mm_camera_buf_def_t* /*pInputBuffer*/, 78 metadata_buffer_t* /*metadata*/){ return 0;}; 79 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 80 QCamera3Stream *stream) = 0; 81 82 virtual int32_t registerBuffer(buffer_handle_t *buffer) = 0; 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 cam_stream_type_t stream_type); 131 virtual ~QCamera3RegularChannel(); 132 133 virtual int32_t start(); 134 virtual int32_t initialize(); 135 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 136 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 137 QCamera3Stream *stream); 138 139 virtual QCamera3Memory *getStreamBufs(uint32_t le); 140 virtual void putStreamBufs(); 141 mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer); 142 virtual int32_t registerBuffer(buffer_handle_t *buffer); 143 144public: 145 static int kMaxBuffers; 146protected: 147 QCamera3GrallocMemory *mMemory; 148private: 149 camera3_stream_t *mCamera3Stream; 150 uint32_t mNumBufs; 151 uint32_t mRegisteredBuffers; 152 buffer_handle_t **mCamera3Buffers; 153 154 cam_stream_type_t mStreamType; // Stream type 155}; 156 157/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 158class QCamera3MetadataChannel : public QCamera3Channel 159{ 160public: 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 le); 175 virtual void putStreamBufs(); 176 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 177 { return NO_ERROR; }; 178 179private: 180 QCamera3HeapMemory *mMemory; 181}; 182 183/* QCameraRawChannel is for Dumping raw stream generated by camera daemon. */ 184class QCameraRawChannel : public QCamera3Channel 185{ 186public: 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 le); 204 virtual void putStreamBufs(); 205 void dumpRawSnapshot(mm_camera_buf_def_t *frame); 206 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 207 { return NO_ERROR; }; 208 209private: 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 */ 217class QCamera3RawChannel : public QCamera3RegularChannel 218{ 219public: 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 233public: 234 static int kMaxBuffers; 235 236private: 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 */ 246class QCamera3PicChannel : public QCamera3Channel 247{ 248public: 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 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 le); 267 virtual void putStreamBufs(); 268 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 284private: 285 int32_t queueJpegSetting(int32_t out_buf_index, metadata_buffer_t *metadata); 286 287public: 288 static int kMaxBuffers; 289 QCamera3PostProcessor m_postprocessor; // post processor 290private: 291 camera3_stream_t *mCamera3Stream; 292 uint32_t mNumBufs; 293 buffer_handle_t **mCamera3Buffers; 294 int32_t mCurrentBufIndex; 295 bool m_bWNROn; 296 uint32_t mYuvWidth, mYuvHeight; 297 uint32_t mRegisteredBuffers; 298 299 QCamera3GrallocMemory *mMemory; 300 QCamera3HeapMemory *mYuvMemory; 301 QCamera3Channel *m_pMetaChannel; 302 mm_camera_super_buf_t *mMetaFrame; 303 304}; 305 306// reprocess channel class 307class QCamera3ReprocessChannel : public QCamera3Channel 308{ 309public: 310 QCamera3ReprocessChannel(uint32_t cam_handle, 311 mm_camera_ops_t *cam_ops, 312 channel_cb_routine cb_routine, 313 cam_padding_info_t *paddingInfo, 314 void *userData, void *ch_hdl); 315 QCamera3ReprocessChannel(); 316 virtual ~QCamera3ReprocessChannel(); 317 // online reprocess 318 int32_t doReprocess(mm_camera_super_buf_t *frame, 319 mm_camera_super_buf_t *meta_frame); 320 int32_t doReprocessOffline(mm_camera_super_buf_t *frame, 321 metadata_buffer_t *metadata); 322 // offline reprocess 323 int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val, 324 mm_camera_super_buf_t *meta_buf); 325 virtual QCamera3Memory *getStreamBufs(uint32_t len); 326 virtual void putStreamBufs(); 327 virtual int32_t initialize(); 328 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 329 QCamera3Stream *stream); 330 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 331 void* userdata); 332 int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config, 333 QCamera3Channel *pSrcChannel, 334 QCamera3Channel *pMetaChannel); 335 QCamera3Stream *getStreamBySrcHandle(uint32_t srcHandle); 336 QCamera3Stream *getSrcStreamBySrcHandle(uint32_t srcHandle); 337 int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame); 338 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 339 { return NO_ERROR; }; 340 341public: 342 void *picChHandle; 343private: 344 uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE]; 345 QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess 346 QCamera3Channel *m_pMetaChannel; 347 QCamera3HeapMemory *mMemory; 348}; 349 350}; // namespace qcamera 351 352#endif /* __QCAMERA_CHANNEL_H__ */ 353