QCamera3Channel.h revision e6ab32d89cf169705236988f0f74309f914c88b7
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 37extern "C" { 38#include <mm_camera_interface.h> 39} 40 41using namespace android; 42 43namespace qcamera { 44 45typedef void (*channel_cb_routine)(metadata_buffer_t *metadata, 46 camera3_stream_buffer_t *buffer, 47 uint32_t frame_number, void *userdata); 48 49class QCamera3Channel 50{ 51public: 52 QCamera3Channel(uint32_t cam_handle, 53 mm_camera_ops_t *cam_ops, 54 channel_cb_routine cb_routine, 55 cam_padding_info_t *paddingInfo, 56 void *userData); 57 QCamera3Channel(); 58 virtual ~QCamera3Channel(); 59 60 int32_t addStream(cam_stream_type_t streamType, 61 cam_format_t streamFormat, 62 cam_dimension_t streamDim, 63 uint8_t minStreamBufnum); 64 int32_t start(); 65 int32_t stop(); 66 int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 67 68 virtual int32_t registerBuffers(uint32_t num_buffers, 69 buffer_handle_t **buffers) = 0; 70 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber) = 0; 71 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 72 QCamera3Stream *stream) = 0; 73 74 virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 75 virtual void putStreamBufs() = 0; 76 77 QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 78 uint32_t getMyHandle() const {return m_handle;}; 79 uint8_t getNumOfStreams() const {return m_numStreams;}; 80 QCamera3Stream *getStreamByIndex(uint8_t index); 81 82 static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 83 QCamera3Stream *stream, void *userdata); 84protected: 85 86 virtual int32_t init(mm_camera_channel_attr_t *attr, 87 mm_camera_buf_notify_t dataCB); 88 int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 89 90 uint32_t m_camHandle; 91 mm_camera_ops_t *m_camOps; 92 bool m_bIsActive; 93 94 uint32_t m_handle; 95 uint8_t m_numStreams; 96 QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 97 mm_camera_buf_notify_t mDataCB; 98 void *mUserData; 99 100 QCamera3HeapMemory *mStreamInfoBuf; 101 channel_cb_routine mChannelCB; 102 cam_padding_info_t *mPaddingInfo; 103}; 104 105/* QCamera3RegularChannel is used to handle all streams that are directly 106 * generated by hardware and given to frameworks without any postprocessing at HAL. 107 * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 108class QCamera3RegularChannel : public QCamera3Channel 109{ 110public: 111 QCamera3RegularChannel(uint32_t cam_handle, 112 mm_camera_ops_t *cam_ops, 113 channel_cb_routine cb_routine, 114 cam_padding_info_t *paddingInfo, 115 void *userData, 116 camera3_stream_t *stream); 117 virtual ~QCamera3RegularChannel(); 118 119 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 120 virtual int32_t registerBuffers(uint32_t num_buffers, 121 buffer_handle_t **buffers); 122 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 123 QCamera3Stream *stream); 124 125 virtual QCamera3Memory *getStreamBufs(uint32_t le); 126 virtual void putStreamBufs(); 127 128public: 129 static int kMaxBuffers; 130private: 131 camera3_stream_t *mCamera3Stream; 132 uint32_t mNumBufs; 133 buffer_handle_t **mCamera3Buffers; 134 135 QCamera3GrallocMemory *mMemory; 136}; 137 138/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 139class QCamera3MetadataChannel : public QCamera3Channel 140{ 141public: 142 QCamera3MetadataChannel(uint32_t cam_handle, 143 mm_camera_ops_t *cam_ops, 144 channel_cb_routine cb_routine, 145 cam_padding_info_t *paddingInfo, 146 void *userData); 147 virtual ~QCamera3MetadataChannel(); 148 149 int32_t initialize(); 150 151 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 152 virtual int32_t registerBuffers(uint32_t num_buffers, 153 buffer_handle_t **buffers); 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#ifdef FAKE_FRAME_NUMBERS 160 uint32_t startingFrameNumber; 161#endif 162 163private: 164 QCamera3HeapMemory *mMemory; 165}; 166 167/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 168 * by the hardware, and encoded to a JPEG stream */ 169class QCamera3PicChannel : public QCamera3Channel 170{ 171public: 172 QCamera3PicChannel(uint32_t cam_handle, 173 mm_camera_ops_t *cam_ops, 174 channel_cb_routine cb_routine, 175 cam_padding_info_t *paddingInfo, 176 void *userData, 177 camera3_stream_t *stream); 178 ~QCamera3PicChannel(); 179 180 virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 181 virtual int32_t registerBuffers(uint32_t num_buffers, 182 buffer_handle_t **buffers); 183 virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 184 QCamera3Stream *stream); 185 186 virtual QCamera3Memory *getStreamBufs(uint32_t le); 187 virtual void putStreamBufs(); 188 189public: 190 static int kMaxBuffers; 191private: 192 camera3_stream_t *mCamera3Stream; 193 uint32_t mNumBufs; 194 camera3_stream_buffer_set_t *mCamera3Buffers; 195 196 QCamera3GrallocMemory *mJpegMemory; 197 QCamera3HeapMemory *mYuvMemory; 198}; 199 200}; // namespace qcamera 201 202#endif /* __QCAMERA_CHANNEL_H__ */ 203