QCamera3Channel.h revision 65717e762ce17a3531e47732dd133ba6fa290474
1340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 2340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * 3340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * Redistribution and use in source and binary forms, with or without 4340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * modification, are permitted provided that the following conditions are 5340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * met: 6340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * * Redistributions of source code must retain the above copyright 7340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * notice, this list of conditions and the following disclaimer. 8340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * * Redistributions in binary form must reproduce the above 9340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * copyright notice, this list of conditions and the following 10340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * disclaimer in the documentation and/or other materials provided 11340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * with the distribution. 12340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * * Neither the name of The Linux Foundation nor the names of its 13340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * contributors may be used to endorse or promote products derived 14340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * from this software without specific prior written permission. 15340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * 16340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * 28340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang */ 29340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 30340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#ifndef __QCAMERA3_CHANNEL_H__ 31340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#define __QCAMERA3_CHANNEL_H__ 32340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 33340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <hardware/camera3.h> 34340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Stream.h" 35340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Mem.h" 36340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 37340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangextern "C" { 38340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <mm_camera_interface.h> 39340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang} 40340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 41340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangusing namespace android; 42340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 43340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangnamespace qcamera { 44340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 45340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangtypedef void (*channel_cb_routine)(mm_camera_buf_def_t *frame, 46340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_buffer_t *buffer, void *userdata); 47340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 48340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Channel 49340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 50340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 51340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Channel(uint32_t cam_handle, 52340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *cam_ops, 53340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang channel_cb_routine cb_routine); 54340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Channel(); 55340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual ~QCamera3Channel(); 5665717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 5765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang int32_t addStream(cam_stream_type_t streamType, 58340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_format_t streamFormat, 59340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_dimension_t streamDim, 60340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t minStreamBufnum, 6165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang cam_padding_info_t *paddingInfo); 6265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang int32_t start(); 6365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang int32_t stop(); 6465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 6565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 66340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t registerBuffers(uint32_t num_buffers, 67340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang buffer_handle_t **buffers) = 0; 6865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual int32_t request(const camera3_stream_buffer_t *buffer) = 0; 69340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 70340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream) = 0; 71340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 7265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 7365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void putStreamBufs() = 0; 7465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 75340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 76340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t getMyHandle() const {return m_handle;}; 77340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t getNumOfStreams() const {return m_numStreams;}; 78340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *getStreamByIndex(uint8_t index); 79340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 80340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 81340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream, void *userdata); 82340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprotected: 83340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 84340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t init(mm_camera_channel_attr_t *attr, 85340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_buf_notify_t dataCB, // data CB for channel data 86340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_padding_info_t *paddingInfo, 87340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang void *userData); 88340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 89340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 90340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t m_camHandle; 91340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *m_camOps; 92340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang bool m_bIsActive; 93340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 94340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t m_handle; 95340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t m_numStreams; 96340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 97340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_buf_notify_t mDataCB; 98340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang void *mUserData; 99340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 100340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3HeapMemory *mStreamInfoBuf; 101340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang channel_cb_routine mChannelCB; 102340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_padding_info_t *mPaddingInfo; 103340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 104340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 105340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3RegularChannel is used to handle all streams that are directly 106340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * generated by hardware and given to frameworks without any postprocessing at HAL. 107340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 108340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3RegularChannel : public QCamera3Channel 109340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 110340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 111340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3RegularChannel(uint32_t cam_handle, 112340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *cam_ops, 113340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang channel_cb_routine cb_routine, 114340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_t *stream); 115340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual ~QCamera3RegularChannel(); 116340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 11765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual int32_t request(const camera3_stream_buffer_t *buffer); 11865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual int32_t registerBuffers(uint32_t num_buffers, 11965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang buffer_handle_t **buffers); 12065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 12165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang QCamera3Stream *stream); 12265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 12365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t le); 12465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void putStreamBufs(); 125340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 126340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 127340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static int kMaxBuffers; 128340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate: 129340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_t *mCamera3Stream; 130340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t mNumBufs; 13165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang buffer_handle_t **mCamera3Buffers; 132340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 133340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3GrallocMemory *mMemory; 134340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 135340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 136340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 137340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3MetadataChannel : public QCamera3Channel 138340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 139340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 140340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3MetadataChannel(uint32_t cam_handle, 141340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *cam_ops, 142340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang channel_cb_routine cb_routine); 143340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual ~QCamera3MetadataChannel(); 144340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 145340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t initialize(); 146340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 14765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual int32_t request(const camera3_stream_buffer_t *buffer); 148340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t registerBuffers(uint32_t num_buffers, 149340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang buffer_handle_t **buffers); 150340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 151340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream); 152340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 15365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t le); 15465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void putStreamBufs(); 15565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 156340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate: 157340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3HeapMemory *mMemory; 15865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang bool mStarted; 159340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 160340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 161340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 162340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * by the hardware, and encoded to a JPEG stream */ 163340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3PicChannel : public QCamera3Channel 164340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 165340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 166340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3PicChannel(uint32_t cam_handle, 167340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *cam_ops, 168340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang channel_cb_routine cb_routine, 169340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_t *stream); 170340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang ~QCamera3PicChannel(); 171340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 17265717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual int32_t request(const camera3_stream_buffer_t *buffer); 173340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t registerBuffers(uint32_t num_buffers, 174340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang buffer_handle_t **buffers); 175340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 176340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream); 17765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 17865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t le); 17965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void putStreamBufs(); 18065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 181340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 182340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static int kMaxBuffers; 183340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate: 184340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_t *mCamera3Stream; 185340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t mNumBufs; 186340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_buffer_set_t *mCamera3Buffers; 187340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 188340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3GrallocMemory *mJpegMemory; 189340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3HeapMemory *mYuvMemory; 190340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 191340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 192340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; // namespace qcamera 193340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 194340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#endif /* __QCAMERA_CHANNEL_H__ */ 195