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> 346cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang#include <utils/List.h> 35340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Stream.h" 36340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include "QCamera3Mem.h" 373ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru#include "QCamera3PostProc.h" 383ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru#include "QCamera3HALHeader.h" 3909e9b7dbfe8306a993d859b12530300300899f61Shuzhen Wang#include "utils/Vector.h" 40340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 41340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangextern "C" { 42340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#include <mm_camera_interface.h> 43340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang} 44340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 45340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangusing namespace android; 46340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 47340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangnamespace qcamera { 48340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 4969c21b5cfa0d1ecd34c7e52f124346649c97303aTanmaya Godboletypedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata, 50dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang camera3_stream_buffer_t *buffer, 51dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang uint32_t frame_number, void *userdata); 52340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 53340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3Channel 54340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 55340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 56340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Channel(uint32_t cam_handle, 57340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *cam_ops, 58dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang channel_cb_routine cb_routine, 59dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang cam_padding_info_t *paddingInfo, 60dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang void *userData); 61340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Channel(); 62340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual ~QCamera3Channel(); 6365717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 6465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang int32_t addStream(cam_stream_type_t streamType, 65340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_format_t streamFormat, 66340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang cam_dimension_t streamDim, 67dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang uint8_t minStreamBufnum); 686c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t start(); 696cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang virtual int32_t stop(); 7065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 7165717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 72102ec43246e5c36c50d8b897e79a9ae979ac949cNagesh Subba Reddy uint32_t getStreamTypeMask(); 736625718416009d7330af77764c5fc24104d0ff20Shuzhen Wang uint32_t getStreamID(uint32_t streamMask); 743ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru virtual int32_t initialize() = 0; 75f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang virtual int32_t request(buffer_handle_t * /*buffer*/, 76f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang uint32_t /*frameNumber*/){ return 0;}; 77f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang virtual int32_t request(buffer_handle_t * /*buffer*/, 78f2139106633e7f52d1f47f3ef8397925673dc69dShuzhen Wang uint32_t /*frameNumber*/, 7971ae6fc1f1ac135689beac90e5c237ff5196f379Shuzhen Wang mm_camera_buf_def_t* /*pInputBuffer*/, 80ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang metadata_buffer_t* /*metadata*/){ return 0;}; 81340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 82340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream) = 0; 83340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 846c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t registerBuffer(buffer_handle_t *buffer) = 0; 8565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t len) = 0; 8665717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void putStreamBufs() = 0; 8765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 88340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 89340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t getMyHandle() const {return m_handle;}; 90340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint8_t getNumOfStreams() const {return m_numStreams;}; 91340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *getStreamByIndex(uint8_t index); 92340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 93340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 94340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream, void *userdata); 951a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani void *mUserData; 961a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani cam_padding_info_t *mPaddingInfo; 971a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 981a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani uint8_t m_numStreams; 99340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprotected: 100340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 1013ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru virtual int32_t init(mm_camera_channel_attr_t *attr, 102dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang mm_camera_buf_notify_t dataCB); 103340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 104340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 105340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t m_camHandle; 106340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *m_camOps; 107340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang bool m_bIsActive; 108340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 109340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t m_handle; 1101a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani 1111a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani 112340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_buf_notify_t mDataCB; 1131a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani 114340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 115340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3HeapMemory *mStreamInfoBuf; 116340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang channel_cb_routine mChannelCB; 1171a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani //cam_padding_info_t *mPaddingInfo; 118340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 119340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 120340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3RegularChannel is used to handle all streams that are directly 121340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * generated by hardware and given to frameworks without any postprocessing at HAL. 122340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 123340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3RegularChannel : public QCamera3Channel 124340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 125340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 126340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3RegularChannel(uint32_t cam_handle, 127340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *cam_ops, 128340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang channel_cb_routine cb_routine, 129dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang cam_padding_info_t *paddingInfo, 130dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang void *userData, 1316c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang camera3_stream_t *stream, 1326c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang cam_stream_type_t stream_type); 133340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual ~QCamera3RegularChannel(); 134340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 1356c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t start(); 1363ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru virtual int32_t initialize(); 137dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 13865717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 13965717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang QCamera3Stream *stream); 14065717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 141286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t len); 1422d2e8ed6d371c5350d20445fcfb722b54faf227aMansoor Aftab virtual void putStreamBufs() {}; 14371ae6fc1f1ac135689beac90e5c237ff5196f379Shuzhen Wang mm_camera_buf_def_t* getInternalFormatBuffer(buffer_handle_t* buffer); 1446c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t registerBuffer(buffer_handle_t *buffer); 145340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 146340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 147340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static int kMaxBuffers; 14884057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftabprotected: 14909e9b7dbfe8306a993d859b12530300300899f61Shuzhen Wang QCamera3GrallocMemory mMemory; 150340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate: 151340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_t *mCamera3Stream; 152340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t mNumBufs; 1536c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang 1546c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang cam_stream_type_t mStreamType; // Stream type 155340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 156340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 157340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 158340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3MetadataChannel : public QCamera3Channel 159340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 160340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 161340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3MetadataChannel(uint32_t cam_handle, 162340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang mm_camera_ops_t *cam_ops, 163dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang channel_cb_routine cb_routine, 164dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang cam_padding_info_t *paddingInfo, 165dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang void *userData); 166340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual ~QCamera3MetadataChannel(); 167340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 1683ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru virtual int32_t initialize(); 169340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 170dfc11f0de9ece725b93b36073f1c8bcae59a162eShuzhen Wang virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 1716c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 1726c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang QCamera3Stream *stream); 1736c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang 174286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t len); 1756c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual void putStreamBufs(); 1766c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 1776c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang { return NO_ERROR; }; 1786c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang 1796c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wangprivate: 1806c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang QCamera3HeapMemory *mMemory; 1816c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang}; 1826c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang 1836c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang/* QCameraRawChannel is for Dumping raw stream generated by camera daemon. */ 1846c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wangclass QCameraRawChannel : public QCamera3Channel 1856c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang{ 1866c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wangpublic: 1876c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang QCameraRawChannel(uint32_t cam_handle, 1886c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang mm_camera_ops_t *cam_ops, 1896c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang channel_cb_routine cb_routine, 1906c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang cam_padding_info_t *paddingInfo, 1916c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang void *userData, 1926c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang cam_dimension_t *raw_dim); 1936c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual ~QCameraRawChannel(); 1946c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang 1956c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t initialize(); 1966c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang 1976c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 198340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual int32_t registerBuffers(uint32_t num_buffers, 199340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang buffer_handle_t **buffers); 200340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 201340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3Stream *stream); 202340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 203286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t len); 20465717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void putStreamBufs(); 2056c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang void dumpRawSnapshot(mm_camera_buf_def_t *frame); 2066c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 2076c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang { return NO_ERROR; }; 20869c21b5cfa0d1ecd34c7e52f124346649c97303aTanmaya Godbole 209340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate: 210340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3HeapMemory *mMemory; 2116c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang uint32_t mWidth, mHeight; 2126c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang uint32_t mMaxBuffers; 213340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 214340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 21584057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab/* QCamera3RawChannel is for opaqueu/cross-platform raw stream containing 21684057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab * vendor specific bayer data or 16-bit unpacked bayer data */ 21784057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftabclass QCamera3RawChannel : public QCamera3RegularChannel 21852658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab{ 21952658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftabpublic: 22084057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab QCamera3RawChannel(uint32_t cam_handle, 22152658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab mm_camera_ops_t *cam_ops, 22252658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab channel_cb_routine cb_routine, 22352658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab cam_padding_info_t *paddingInfo, 22452658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab void *userData, 22584057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab camera3_stream_t *stream, 22684057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab bool raw_16 = false); 22784057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab virtual ~QCamera3RawChannel(); 22852658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab 22952658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 23052658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab QCamera3Stream *stream); 23152658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab 23284057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab 23384057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftabpublic: 23484057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab static int kMaxBuffers; 23552658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab 23652658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftabprivate: 23784057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab bool mRawDump; 23884057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab bool mIsRaw16; 23984057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab 24084057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab void dumpRawSnapshot(mm_camera_buf_def_t *frame); 24184057fd7ba35c0b35c7ab8ab1d5b3068e0c8eb26Mansoor Aftab void convertToRaw16(mm_camera_buf_def_t *frame); 24252658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab}; 24352658833b8a8ee9a4bc9e7b24c70730dcab074eeMansoor Aftab 244340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 245340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang * by the hardware, and encoded to a JPEG stream */ 246340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangclass QCamera3PicChannel : public QCamera3Channel 247340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang{ 248340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 249340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3PicChannel(uint32_t cam_handle, 2503ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru mm_camera_ops_t *cam_ops, 2513ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru channel_cb_routine cb_routine, 2523ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru cam_padding_info_t *paddingInfo, 2533ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru void *userData, 2543ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru camera3_stream_t *stream); 255340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang ~QCamera3PicChannel(); 256340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 2573ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru virtual int32_t initialize(); 258f01d050546971cfea3f84aeb8be9e270471f127eShuzhen Wang virtual int32_t stop(); 2593ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru virtual int32_t request(buffer_handle_t *buffer, 260ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang uint32_t frameNumber, 261ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang mm_camera_buf_def_t* pInputBuffer, 262ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang metadata_buffer_t* metadata); 263340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 2643ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru QCamera3Stream *stream); 26565717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 266286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t len); 26765717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang virtual void putStreamBufs(); 268ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang 2691a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani bool isWNREnabled() {return m_bWNROn;}; 2703ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru bool needOnlineRotation(); 271ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang QCamera3Exif *getExifData(metadata_buffer_t *metadata, 272ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang jpeg_settings_t *jpeg_settings); 273ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang void overrideYuvSize(uint32_t width, uint32_t height); 2743ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru static void jpegEvtHandle(jpeg_job_status_t status, 2753ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru uint32_t /*client_hdl*/, 2763ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru uint32_t jobId, 2773ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru mm_jpeg_output_t *p_output, 2783ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru void *userdata); 279e803115f5c8573703e3b00a3f8741bf3816b8f23Mansoor Aftab static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 280e803115f5c8573703e3b00a3f8741bf3816b8f23Mansoor Aftab void *userdata); 281ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang int32_t queueReprocMetadata(metadata_buffer_t *metadata); 2826c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t registerBuffer(buffer_handle_t *buffer); 283ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang 284ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wangprivate: 285ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang int32_t queueJpegSetting(int32_t out_buf_index, metadata_buffer_t *metadata); 28665717e762ce17a3531e47732dd133ba6fa290474Shuzhen Wang 287340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangpublic: 288340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang static int kMaxBuffers; 2891a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3PostProcessor m_postprocessor; // post processor 290340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wangprivate: 291340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang camera3_stream_t *mCamera3Stream; 292340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang uint32_t mNumBufs; 293b6424056f1221af718daa26e0dc441b8d3cd15e5Apurva Rajguru int32_t mCurrentBufIndex; 2941a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani bool m_bWNROn; 295ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang uint32_t mYuvWidth, mYuvHeight; 2963ab16af7eb740d44ac36d570aab1e9a56b800313Apurva Rajguru 29709e9b7dbfe8306a993d859b12530300300899f61Shuzhen Wang QCamera3GrallocMemory mMemory; 298340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang QCamera3HeapMemory *mYuvMemory; 29939e17326969dfb6ba9af2efcefe36987d353029aMansoor Aftab QCamera3Channel *m_pMetaChannel; 30039e17326969dfb6ba9af2efcefe36987d353029aMansoor Aftab mm_camera_super_buf_t *mMetaFrame; 301ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang 3021a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani}; 3031a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani 3041a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani// reprocess channel class 3051a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudaniclass QCamera3ReprocessChannel : public QCamera3Channel 3061a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani{ 3071a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudanipublic: 3081a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3ReprocessChannel(uint32_t cam_handle, 3091a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani mm_camera_ops_t *cam_ops, 3101a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani channel_cb_routine cb_routine, 3111a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani cam_padding_info_t *paddingInfo, 3121a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani void *userData, void *ch_hdl); 3131a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3ReprocessChannel(); 3141a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani virtual ~QCamera3ReprocessChannel(); 3151a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani // online reprocess 3161a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani int32_t doReprocess(mm_camera_super_buf_t *frame, 3171a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani mm_camera_super_buf_t *meta_frame); 318ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang int32_t doReprocessOffline(mm_camera_super_buf_t *frame, 319ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang metadata_buffer_t *metadata); 3201a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani // offline reprocess 3211a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani int32_t doReprocess(int buf_fd, uint32_t buf_length, int32_t &ret_val, 3221a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani mm_camera_super_buf_t *meta_buf); 3231a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani virtual QCamera3Memory *getStreamBufs(uint32_t len); 3241a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani virtual void putStreamBufs(); 3251a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani virtual int32_t initialize(); 3261a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 3271a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3Stream *stream); 3286cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang virtual int32_t stop(); 3291a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 3301a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani void* userdata); 331ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config, 3321a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3Channel *pSrcChannel, 3331a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3Channel *pMetaChannel); 334ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang QCamera3Stream *getStreamBySrcHandle(uint32_t srcHandle); 335ca8b4c43d60647bed9ec89fa9971c6d98639d492Shuzhen Wang QCamera3Stream *getSrcStreamBySrcHandle(uint32_t srcHandle); 3368991e1387b323f2cd4003c0703dc28db5ee5cb87Mansoor Aftab int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame); 3376c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 3386c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang { return NO_ERROR; }; 3396c7b41439f7cb210446d265d474f20842e0672a1Shuzhen Wang 3401a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudanipublic: 3411a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani void *picChHandle; 3421a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudaniprivate: 3436cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang typedef struct { 3446cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang QCamera3Stream *stream; 3456cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang cam_mapping_buf_type type; 3466cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang int index; 3476cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang } OfflineBuffer; 3486cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang 3496cf5dcb42d1e0159890f67cdeba1b5e926776e7dShuzhen Wang android::List<OfflineBuffer> mOfflineBuffers; 3501a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE]; 3511a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3Channel *m_pSrcChannel; // ptr to source channel for reprocess 3521a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3Channel *m_pMetaChannel; 3531a0205e643b429af30e6151defcb7f4061c0b46cAjay Dudani QCamera3HeapMemory *mMemory; 354340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; 355340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 356286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang/* QCamera3SupportChannel is for HAL internal consumption only */ 357286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wangclass QCamera3SupportChannel : public QCamera3Channel 358286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang{ 359286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wangpublic: 360286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang QCamera3SupportChannel(uint32_t cam_handle, 361286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang mm_camera_ops_t *cam_ops, 362286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang cam_padding_info_t *paddingInfo, 363286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang void *userData); 364286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual ~QCamera3SupportChannel(); 365286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang 366286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual int32_t initialize(); 367286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang 368286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber); 369286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 370286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang QCamera3Stream *stream); 371286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang 372286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual QCamera3Memory *getStreamBufs(uint32_t le); 373286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual void putStreamBufs(); 374286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/) 375286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang { return NO_ERROR; }; 376286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang 377286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang static cam_dimension_t kDim; 378286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wangprivate: 379286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang QCamera3HeapMemory *mMemory; 380286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang}; 381286bfce6bc725cc0f46b95b408a27d48cb914e0dShuzhen Wang 382340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang}; // namespace qcamera 383340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang 384340e0caad7fc85ee8387229e2ad1463bfe12df4eShuzhen Wang#endif /* __QCAMERA_CHANNEL_H__ */ 385