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_STREAM_H__ 31340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#define __QCAMERA3_STREAM_H__ 32340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 33340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <hardware/camera3.h> 34340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCameraCmdThread.h" 35340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Mem.h" 36340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 37340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangextern "C" { 38340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <mm_camera_interface.h> 39340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang} 40340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 41340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangnamespace qcamera { 42340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 43340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Stream; 4465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wangclass QCamera3Channel; 4565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 46340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangtypedef void (*stream_cb_routine)(mm_camera_super_buf_t *frame, 47340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream, 48340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang void *userdata); 49340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 50340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Stream 51340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 52340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 53340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream(uint32_t camHandle, 54340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t chId, 55340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *camOps, 56340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_padding_info_t *paddingInfo, 5765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang QCamera3Channel *channel); 58340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual ~QCamera3Stream(); 59340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t init(cam_stream_type_t streamType, 60340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_format_t streamFormat, 61340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_dimension_t streamDim, 621a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani cam_stream_reproc_config_t* reprocess_config, 63340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t minStreamBufNum, 64340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang stream_cb_routine stream_cb, 65340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang void *userdata); 66340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t bufDone(int index); 67340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t processDataNotify(mm_camera_super_buf_t *bufs); 68340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t start(); 69340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t stop(); 70340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 71340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, void *userdata); 72340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static void *dataProcRoutine(void *data); 73340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t getMyHandle() const {return mHandle;} 74102ec43246e5c36c50d8b897e79a9ae979ac949cNagesh Subba Reddy cam_stream_type_t getMyType() const; 75340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t getFrameOffset(cam_frame_len_offset_t &offset); 76340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t getFrameDimension(cam_dimension_t &dim); 77340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t getFormat(cam_format_t &fmt); 7871ae6fc1f1ac135689beac90e5c237ff5196f379Shuzhen Wang mm_camera_buf_def_t* getInternalFormatBuffer(int index); 79340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Memory *getStreamBufs() {return mStreamBufs;}; 80340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t getMyServerID(); 81340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 82340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t mapBuf(uint8_t buf_type, uint32_t buf_idx, 83340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t plane_idx, int fd, uint32_t size); 84340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t unmapBuf(uint8_t buf_type, uint32_t buf_idx, int32_t plane_idx); 85340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t setParameter(cam_stream_parm_buffer_t ¶m); 86340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 870ebd059771a510273a57e8a28924fdb8e506ca5aShuzhen Wang static void releaseFrameData(void *data, void *user_data); 880ebd059771a510273a57e8a28924fdb8e506ca5aShuzhen Wang 89340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate: 90340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t mCamHandle; 91340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t mChannelHandle; 92340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t mHandle; // stream handle from mm-camera-interface 93340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *mCamOps; 94340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_stream_info_t *mStreamInfo; // ptr to stream info buf 95340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_stream_mem_vtbl_t mMemVtbl; 966c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang mm_camera_map_unmap_ops_tbl_t *mMemOps; 97340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t mNumBufs; 98340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang stream_cb_routine mDataCB; 99340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang void *mUserData; 100340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 101340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCameraQueue mDataQ; 102340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCameraCmdThread mProcTh; // thread for dataCB 103340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 104340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3HeapMemory *mStreamInfoBuf; 105340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Memory *mStreamBufs; 106340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_buf_def_t *mBufDefs; 107340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_frame_len_offset_t mFrameLenOffset; 108340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_padding_info_t mPaddingInfo; 10965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang QCamera3Channel *mChannel; 110340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 111340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static int32_t get_bufs( 112340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_frame_len_offset_t *offset, 113340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t *num_bufs, 114340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t **initial_reg_flag, 115340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_buf_def_t **bufs, 116340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_map_unmap_ops_tbl_t *ops_tbl, 117340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang void *user_data); 118340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static int32_t put_bufs( 119340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_map_unmap_ops_tbl_t *ops_tbl, 120340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang void *user_data); 12102e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang static int32_t invalidate_buf(int index, void *user_data); 12202e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang static int32_t clean_invalidate_buf(int index, void *user_data); 123340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 124340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t getBufs(cam_frame_len_offset_t *offset, 125340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t *num_bufs, 126340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t **initial_reg_flag, 127340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_buf_def_t **bufs, 128340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_map_unmap_ops_tbl_t *ops_tbl); 129340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t putBufs(mm_camera_map_unmap_ops_tbl_t *ops_tbl); 13002e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang int32_t invalidateBuf(int index); 13102e8a5e96bc13c0cd6dbced159668864c894b7efShuzhen Wang int32_t cleanInvalidateBuf(int index); 132340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 133340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 134340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 135340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; // namespace qcamera 136340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 137340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#endif /* __QCAMERA3_STREAM_H__ */ 138