QCamera3Channel.h revision e51f34f22df3bb9ad5f34ab77d900d6a1faad588
1/* Copyright (c) 2012-2015, 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#include "utils/Vector.h" 39#include <utils/List.h> 40 41extern "C" { 42#include <mm_camera_interface.h> 43} 44 45using namespace android; 46 47#define MIN_STREAMING_BUFFER_NUM 7+11 48 49namespace qcamera { 50 51typedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata, 52 camera3_stream_buffer_t *buffer, 53 uint32_t frame_number, void *userdata); 54class QCamera3Channel 55{ 56public: 57 QCamera3Channel(uint32_t cam_handle, 58 mm_camera_ops_t *cam_ops, 59 channel_cb_routine cb_routine, 60 cam_padding_info_t *paddingInfo, 61 uint32_t postprocess_mask, 62 void *userData, uint32_t numBuffers); 63 QCamera3Channel(); 64 virtual ~QCamera3Channel(); 65 66 int32_t addStream(cam_stream_type_t streamType, 67 cam_format_t streamFormat, 68 cam_dimension_t streamDim, 69 cam_rotation_t streamRotation, 70 uint8_t minStreamBufnum, 71 uint32_t postprocessMask, 72 cam_is_type_t isType); 73 virtual int32_t start(); 74 virtual int32_t stop(); 75 int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 76 77 uint32_t getStreamTypeMask(); 78 uint32_t getStreamID(uint32_t streamMask); 79 virtual int32_t initialize(cam_is_type_t isType) = 0; 80 virtual int32_t request(buffer_handle_t * /*buffer*/, 81 uint32_t /*frameNumber*/){ return 0;}; 82 virtual int32_t request(buffer_handle_t * /*buffer*/, 83 uint32_t /*frameNumber*/, 84 camera3_stream_buffer_t* /*pInputBuffer*/, 85 metadata_buffer_t* /*metadata*/){ return 0;}; 86 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 87 QCamera3Stream *stream) = 0; 88 89 virtual int32_t registerBuffer(buffer_handle_t *buffer, cam_is_type_t isType) = 0; 90 virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 91 virtual void putStreamBufs() = 0; 92 93 QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 94 uint32_t getMyHandle() const {return m_handle;}; 95 uint32_t getNumOfStreams() const {return m_numStreams;}; 96 uint32_t getNumBuffers() const {return mNumBuffers;}; 97 QCamera3Stream *getStreamByIndex(uint32_t index); 98 99 static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 100 QCamera3Stream *stream, void *userdata); 101 void dumpYUV(mm_camera_buf_def_t *frame, cam_dimension_t dim, 102 cam_frame_len_offset_t offset, uint8_t name); 103 104 void *mUserData; 105 cam_padding_info_t *mPaddingInfo; 106 QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 107 uint32_t m_numStreams; 108protected: 109 110 virtual int32_t init(mm_camera_channel_attr_t *attr, 111 mm_camera_buf_notify_t dataCB); 112 int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 113 114 uint32_t m_camHandle; 115 mm_camera_ops_t *m_camOps; 116 bool m_bIsActive; 117 118 uint32_t m_handle; 119 120 121 mm_camera_buf_notify_t mDataCB; 122 123 124 QCamera3HeapMemory *mStreamInfoBuf; 125 channel_cb_routine mChannelCB; 126 //cam_padding_info_t *mPaddingInfo; 127 uint32_t mPostProcMask; 128 uint8_t mYUVDump; 129 cam_is_type_t mIsType; 130 uint32_t mNumBuffers; 131}; 132 133/* QCamera3RegularChannel is used to handle all streams that are directly 134 * generated by hardware and given to frameworks without any postprocessing at HAL. 135 * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 136class QCamera3RegularChannel : public QCamera3Channel 137{ 138public: 139 QCamera3RegularChannel(uint32_t cam_handle, 140 mm_camera_ops_t *cam_ops, 141 channel_cb_routine cb_routine, 142 cam_padding_info_t *paddingInfo, 143 void *userData, 144 camera3_stream_t *stream, 145 cam_stream_type_t stream_type, 146 uint32_t postprocess_mask, 147 uint32_t numBuffers = MAX_INFLIGHT_REQUESTS); 148 149 virtual ~QCamera3RegularChannel(); 150 151 virtual int32_t start(); 152 virtual int32_t initialize(cam_is_type_t isType); 153 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 154 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 155 QCamera3Stream *stream); 156 157 virtual QCamera3Memory *getStreamBufs(uint32_t le); 158 virtual void putStreamBufs(); 159 virtual int32_t registerBuffer(buffer_handle_t *buffer, cam_is_type_t isType); 160 161protected: 162 QCamera3GrallocMemory mMemory; 163private: 164 int32_t initialize(struct private_handle_t *priv_handle); 165 166 camera3_stream_t *mCamera3Stream; 167 uint8_t mNumBufs; 168 cam_stream_type_t mStreamType; // Stream type 169 cam_rotation_t mRotation; 170}; 171 172/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 173class QCamera3MetadataChannel : public QCamera3Channel 174{ 175public: 176 QCamera3MetadataChannel(uint32_t cam_handle, 177 mm_camera_ops_t *cam_ops, 178 channel_cb_routine cb_routine, 179 cam_padding_info_t *paddingInfo, 180 uint32_t postprocess_mask, 181 void *userData, 182 uint32_t numBuffers = MIN_STREAMING_BUFFER_NUM); 183 virtual ~QCamera3MetadataChannel(); 184 185 virtual int32_t initialize(cam_is_type_t isType); 186 187 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 188 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 189 QCamera3Stream *stream); 190 191 virtual QCamera3Memory *getStreamBufs(uint32_t le); 192 virtual void putStreamBufs(); 193 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/, cam_is_type_t /*isType*/) 194 { return NO_ERROR; }; 195 196private: 197 QCamera3HeapMemory *mMemory; 198}; 199 200/* QCamera3RawChannel is for opaqueu/cross-platform raw stream containing 201 * vendor specific bayer data or 16-bit unpacked bayer data */ 202class QCamera3RawChannel : public QCamera3RegularChannel 203{ 204public: 205 QCamera3RawChannel(uint32_t cam_handle, 206 mm_camera_ops_t *cam_ops, 207 channel_cb_routine cb_routine, 208 cam_padding_info_t *paddingInfo, 209 void *userData, 210 camera3_stream_t *stream, 211 uint32_t postprocess_mask, 212 bool raw_16 = false, 213 uint32_t numBuffers = MAX_INFLIGHT_REQUESTS); 214 virtual ~QCamera3RawChannel(); 215 216 virtual int32_t initialize(cam_is_type_t isType); 217 218 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 219 QCamera3Stream *stream); 220 221private: 222 bool mRawDump; 223 bool mIsRaw16; 224 225 void dumpRawSnapshot(mm_camera_buf_def_t *frame); 226 void convertLegacyToRaw16(mm_camera_buf_def_t *frame); 227 void convertMipiToRaw16(mm_camera_buf_def_t *frame); 228}; 229 230/* 231 * QCamera3RawDumpChannel is for internal use only for Raw dump 232 */ 233 234class QCamera3RawDumpChannel : public QCamera3Channel 235{ 236public: 237 QCamera3RawDumpChannel(uint32_t cam_handle, 238 mm_camera_ops_t *cam_ops, 239 cam_dimension_t rawDumpSize, 240 cam_padding_info_t *paddingInfo, 241 void *userData, 242 uint32_t postprocess_mask, uint32_t numBuffers = 3U); 243 virtual ~QCamera3RawDumpChannel(); 244 virtual int32_t initialize(cam_is_type_t isType); 245 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 246 QCamera3Stream *stream); 247 virtual QCamera3Memory *getStreamBufs(uint32_t le); 248 virtual void putStreamBufs(); 249 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/, cam_is_type_t /*isType*/) 250 { return NO_ERROR; }; 251 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 252 void dumpRawSnapshot(mm_camera_buf_def_t *frame); 253 254public: 255 cam_dimension_t mDim; 256 257private: 258 bool mRawDump; 259 QCamera3HeapMemory *mMemory; 260}; 261 262/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 263 * by the hardware, and encoded to a JPEG stream */ 264class QCamera3PicChannel : public QCamera3Channel 265{ 266public: 267 QCamera3PicChannel(uint32_t cam_handle, 268 mm_camera_ops_t *cam_ops, 269 channel_cb_routine cb_routine, 270 cam_padding_info_t *paddingInfo, 271 void *userData, 272 camera3_stream_t *stream, 273 uint32_t postprocess_mask, 274 bool is4KVideo, 275 QCamera3Channel *metadataChannel, 276 uint32_t numBuffers = MAX_INFLIGHT_REQUESTS); 277 ~QCamera3PicChannel(); 278 279 virtual int32_t initialize(cam_is_type_t isType); 280 virtual int32_t stop(); 281 virtual int32_t request(buffer_handle_t *buffer, 282 uint32_t frameNumber, 283 camera3_stream_buffer_t* pInputBuffer, 284 metadata_buffer_t* metadata); 285 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 286 QCamera3Stream *stream); 287 288 virtual QCamera3Memory *getStreamBufs(uint32_t le); 289 virtual void putStreamBufs(); 290 291 bool isWNREnabled() {return m_bWNROn;}; 292 bool needOnlineRotation(); 293 int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame); 294 QCamera3Exif *getExifData(metadata_buffer_t *metadata, 295 jpeg_settings_t *jpeg_settings); 296 void overrideYuvSize(uint32_t width, uint32_t height); 297 static void jpegEvtHandle(jpeg_job_status_t status, 298 uint32_t /*client_hdl*/, 299 uint32_t jobId, 300 mm_jpeg_output_t *p_output, 301 void *userdata); 302 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 303 void *userdata); 304 virtual int32_t registerBuffer(buffer_handle_t *buffer, cam_is_type_t isType); 305 int32_t queueReprocMetadata(mm_camera_super_buf_t *metadata); 306 307private: 308 int32_t queueJpegSetting(uint32_t out_buf_index, metadata_buffer_t *metadata); 309 310public: 311 QCamera3PostProcessor m_postprocessor; // post processor 312 cam_dimension_t m_max_pic_dim; 313 314private: 315 camera3_stream_t *mCamera3Stream; 316 uint32_t mNumBufsRegistered; 317 uint32_t mNumSnapshotBufs; 318 uint32_t mYuvWidth, mYuvHeight; 319 uint32_t mCurrentBufIndex; 320 cam_stream_type_t mStreamType; 321 cam_format_t mStreamFormat; 322 bool m_bWNROn; 323 bool mPostProcStarted; 324 bool mInputBufferConfig; // Set when the picture channel is configured 325 // for processing input(framework) buffers 326 327 QCamera3GrallocMemory mMemory; 328 QCamera3HeapMemory *mYuvMemory; 329 QCamera3Channel *m_pMetaChannel; 330 mm_camera_super_buf_t *mMetaFrame; 331 QCamera3GrallocMemory mOfflineMemory; 332 QCamera3HeapMemory mOfflineMetaMemory; 333 334 // Keep a list of free buffers 335 Mutex mFreeBuffersLock; 336 List<uint32_t> mFreeBufferList; 337}; 338 339// reprocess channel class 340class QCamera3ReprocessChannel : public QCamera3Channel 341{ 342public: 343 QCamera3ReprocessChannel(uint32_t cam_handle, 344 mm_camera_ops_t *cam_ops, 345 channel_cb_routine cb_routine, 346 cam_padding_info_t *paddingInfo, 347 uint32_t postprocess_mask, 348 void *userData, void *ch_hdl); 349 QCamera3ReprocessChannel(); 350 virtual ~QCamera3ReprocessChannel(); 351 // offline reprocess 352 int32_t doReprocessOffline(qcamera_fwk_input_pp_data_t *frame); 353 int32_t doReprocess(int buf_fd, size_t buf_length, int32_t &ret_val, 354 mm_camera_super_buf_t *meta_buf); 355 int32_t extractFrameCropAndRotation(mm_camera_super_buf_t *frame, 356 mm_camera_buf_def_t *meta_buffer, 357 jpeg_settings_t *jpeg_settings, 358 qcamera_fwk_input_pp_data_t &fwk_frame); 359 int32_t extractCrop(qcamera_fwk_input_pp_data_t *frame); 360 virtual QCamera3Memory *getStreamBufs(uint32_t len); 361 virtual void putStreamBufs(); 362 virtual int32_t initialize(cam_is_type_t isType); 363 int32_t unmapOfflineBuffers(bool all); 364 virtual int32_t stop(); 365 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 366 QCamera3Stream *stream); 367 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 368 void* userdata); 369 int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config, 370 const reprocess_config_t &src_config, 371 cam_is_type_t is_type, 372 QCamera3Channel *pMetaChannel); 373 QCamera3Stream *getStreamBySrcHandle(uint32_t srcHandle); 374 QCamera3Stream *getSrcStreamBySrcHandle(uint32_t srcHandle); 375 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/, cam_is_type_t /*isType*/) 376 { return NO_ERROR; }; 377 378public: 379 void *picChHandle; 380private: 381 typedef struct { 382 QCamera3Stream *stream; 383 cam_mapping_buf_type type; 384 uint32_t index; 385 } OfflineBuffer; 386 387 android::List<OfflineBuffer> mOfflineBuffers; 388 android::List<OfflineBuffer> mOfflineMetaBuffers; 389 int32_t mOfflineBuffersIndex; 390 int32_t mOfflineMetaIndex; 391 uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE]; 392 QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess 393 QCamera3Channel *m_pMetaChannel; 394 QCamera3HeapMemory *mMemory; 395}; 396 397 398/* QCamera3SupportChannel is for HAL internal consumption only */ 399class QCamera3SupportChannel : public QCamera3Channel 400{ 401public: 402 QCamera3SupportChannel(uint32_t cam_handle, 403 mm_camera_ops_t *cam_ops, 404 cam_padding_info_t *paddingInfo, 405 uint32_t postprocess_mask, 406 cam_stream_type_t streamType, 407 cam_dimension_t *dim, 408 void *userData, 409 uint32_t numBuffers = MIN_STREAMING_BUFFER_NUM); 410 virtual ~QCamera3SupportChannel(); 411 412 virtual int32_t initialize(cam_is_type_t isType); 413 414 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 415 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 416 QCamera3Stream *stream); 417 418 virtual QCamera3Memory *getStreamBufs(uint32_t le); 419 virtual void putStreamBufs(); 420 virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/, cam_is_type_t /*isType*/) 421 { return NO_ERROR; }; 422 423 static cam_dimension_t kDim; 424private: 425 QCamera3HeapMemory *mMemory; 426 cam_dimension_t mDim; 427 cam_stream_type_t mStreamType; 428}; 429 430}; // namespace qcamera 431 432#endif /* __QCAMERA_CHANNEL_H__ */ 433