QCamera3Channel.h revision b66f295ef24aea24873bcf80cee589835338e2a1
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*/){ return 0;}; 78 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 79 QCamera3Stream *stream) = 0; 80 81 virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 82 virtual void putStreamBufs() = 0; 83 84 QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 85 uint32_t getMyHandle() const {return m_handle;}; 86 uint8_t getNumOfStreams() const {return m_numStreams;}; 87 QCamera3Stream *getStreamByIndex(uint8_t index); 88 89 static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 90 QCamera3Stream *stream, void *userdata); 91protected: 92 93 virtual int32_t init(mm_camera_channel_attr_t *attr, 94 mm_camera_buf_notify_t dataCB); 95 int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 96 97 uint32_t m_camHandle; 98 mm_camera_ops_t *m_camOps; 99 bool m_bIsActive; 100 101 uint32_t m_handle; 102 uint8_t m_numStreams; 103 QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 104 mm_camera_buf_notify_t mDataCB; 105 void *mUserData; 106 107 QCamera3HeapMemory *mStreamInfoBuf; 108 channel_cb_routine mChannelCB; 109 cam_padding_info_t *mPaddingInfo; 110}; 111 112/* QCamera3RegularChannel is used to handle all streams that are directly 113 * generated by hardware and given to frameworks without any postprocessing at HAL. 114 * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 115class QCamera3RegularChannel : public QCamera3Channel 116{ 117public: 118 QCamera3RegularChannel(uint32_t cam_handle, 119 mm_camera_ops_t *cam_ops, 120 channel_cb_routine cb_routine, 121 cam_padding_info_t *paddingInfo, 122 void *userData, 123 camera3_stream_t *stream); 124 virtual ~QCamera3RegularChannel(); 125 126 virtual int32_t initialize(); 127 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 128 virtual int32_t registerBuffers(uint32_t num_buffers, 129 buffer_handle_t **buffers); 130 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 131 QCamera3Stream *stream); 132 133 virtual QCamera3Memory *getStreamBufs(uint32_t le); 134 virtual void putStreamBufs(); 135 136public: 137 static int kMaxBuffers; 138private: 139 camera3_stream_t *mCamera3Stream; 140 uint32_t mNumBufs; 141 buffer_handle_t **mCamera3Buffers; 142 143 QCamera3GrallocMemory *mMemory; 144}; 145 146/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 147class QCamera3MetadataChannel : public QCamera3Channel 148{ 149public: 150 QCamera3MetadataChannel(uint32_t cam_handle, 151 mm_camera_ops_t *cam_ops, 152 channel_cb_routine cb_routine, 153 cam_padding_info_t *paddingInfo, 154 void *userData); 155 virtual ~QCamera3MetadataChannel(); 156 157 virtual int32_t initialize(); 158 159 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 160 virtual int32_t registerBuffers(uint32_t num_buffers, 161 buffer_handle_t **buffers); 162 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 163 QCamera3Stream *stream); 164 165 virtual QCamera3Memory *getStreamBufs(uint32_t le); 166 virtual void putStreamBufs(); 167 168#ifdef FAKE_FRAME_NUMBERS 169 uint32_t startingFrameNumber; 170#endif 171 172private: 173 QCamera3HeapMemory *mMemory; 174}; 175 176/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 177 * by the hardware, and encoded to a JPEG stream */ 178class QCamera3PicChannel : public QCamera3Channel 179{ 180public: 181 QCamera3PicChannel(uint32_t cam_handle, 182 mm_camera_ops_t *cam_ops, 183 channel_cb_routine cb_routine, 184 cam_padding_info_t *paddingInfo, 185 void *userData, 186 camera3_stream_t *stream); 187 ~QCamera3PicChannel(); 188 189 virtual int32_t initialize(); 190 191 virtual int32_t request(buffer_handle_t *buffer, 192 uint32_t frameNumber, jpeg_settings_t* mJpegSettings); 193 virtual int32_t registerBuffers(uint32_t num_buffers, 194 buffer_handle_t **buffers); 195 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 196 QCamera3Stream *stream); 197 198 virtual QCamera3Memory *getStreamBufs(uint32_t le); 199 virtual void putStreamBufs(); 200 bool needOnlineRotation(); 201 void getThumbnailSize(cam_dimension_t &dim); 202 int getJpegQuality(); 203 int getJpegRotation(); 204 QCamera3Exif *getExifData(); 205 static void jpegEvtHandle(jpeg_job_status_t status, 206 uint32_t /*client_hdl*/, 207 uint32_t jobId, 208 mm_jpeg_output_t *p_output, 209 void *userdata); 210 static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 211 void *userdata); 212 213public: 214 static int kMaxBuffers; 215private: 216 camera3_stream_t *mCamera3Stream; 217 uint32_t mNumBufs; 218 buffer_handle_t **mCamera3Buffers; 219 jpeg_settings_t* mJpegSettings; 220 int32_t mCurrentBufIndex; 221 222 223 QCamera3GrallocMemory *mMemory; 224 QCamera3HeapMemory *mYuvMemory; 225 QCamera3PostProcessor m_postprocessor; // post processor 226}; 227 228}; // namespace qcamera 229 230#endif /* __QCAMERA_CHANNEL_H__ */ 231