13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistribution and use in source and binary forms, with or without 43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * modification, are permitted provided that the following conditions are 53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * met: 63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * * Redistributions of source code must retain the above copyright 73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * notice, this list of conditions and the following disclaimer. 83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * * Redistributions in binary form must reproduce the above 93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * copyright notice, this list of conditions and the following 103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * disclaimer in the documentation and/or other materials provided 113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * with the distribution. 123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * * Neither the name of The Linux Foundation nor the names of its 133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * contributors may be used to endorse or promote products derived 143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from this software without specific prior written permission. 153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */ 293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef __QCAMERA3_CHANNEL_H__ 313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define __QCAMERA3_CHANNEL_H__ 323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies 343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/List.h> 353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Mutex.h> 363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Vector.h> 373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "gralloc_priv.h" 385fa10dc0236b995fbcc9a74bb7dcb06f283411b5Thierry Strudel#include <sys/stat.h> 393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies 403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "cam_intf.h" 413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "cam_types.h" 423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "hardware/camera3.h" 433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3HALHeader.h" 443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3Mem.h" 453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3PostProc.h" 463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3Stream.h" 473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3StreamMem.h" 483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 49e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen#include "HdrPlusClient.h" 50e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" { 523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_interface.h" 533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_jpeg_interface.h" 543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace android; 573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define MIN_STREAMING_BUFFER_NUM 7+11 593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define QCAMERA_DUMP_FRM_PREVIEW 1 613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define QCAMERA_DUMP_FRM_VIDEO (1<<1) 62cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel#define QCAMERA_DUMP_FRM_INPUT_JPEG (1<<2) 633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define QCAMERA_DUMP_FRM_CALLBACK (1<<3) 64cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel#define QCAMERA_DUMP_FRM_OUTPUT_JPEG (1<<5) 653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define QCAMERA_DUMP_FRM_INPUT_REPROCESS (1<<6) 663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef int64_t nsecs_t; 683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera { 703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef void (*channel_cb_routine)(mm_camera_super_buf_t *metadata, 723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_buffer_t *buffer, 733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frame_number, bool isInputBuffer, 743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata); 75c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 76c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudeltypedef void (*channel_cb_buffer_err)(QCamera3Channel* ch, uint32_t frameNumber, 77c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel camera3_buffer_status_t err, 78c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel void *userdata); 79c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3Channel 813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel(uint32_t cam_handle, 843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 87c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buf_err, 883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, uint32_t numBuffers); 913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual ~QCamera3Channel(); 923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t start(); 943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t stop(); 953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t setBatchSize(uint32_t); 963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t queueBatchBuf(); 973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t setPerFrameMapUnmap(bool enable); 983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 997650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev virtual int32_t setBundleInfo(const cam_bundle_config_t &bundleInfo); 1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual uint32_t getStreamTypeMask(); 1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t getStreamID(uint32_t streamMask); 1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void destroy(); 1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType) = 0; 1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t request(buffer_handle_t * /*buffer*/, 106c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel uint32_t /*frameNumber*/, 107c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel int &/*indexUsed*/){ return 0;}; 1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t request(buffer_handle_t * /*buffer*/, 1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t /*frameNumber*/, 1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_buffer_t* /*pInputBuffer*/, 111c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t* /*metadata*/, 112e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel int & /*indexUsed*/, 113e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel __unused bool internalRequest = false, 114e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel __unused bool meteringOnly = false){ return 0;}; 1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream) = 0; 1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t registerBuffer(buffer_handle_t *buffer, cam_is_type_t isType) = 0; 1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual QCamera3StreamMem *getStreamBufs(uint32_t len) = 0; 1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs() = 0; 1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t flush(); 1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *getStreamByHandle(uint32_t streamHandle); 1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t getMyHandle() const {return m_handle;}; 1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t getNumOfStreams() const {return m_numStreams;}; 1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t getNumBuffers() const {return mNumBuffers;}; 1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *getStreamByIndex(uint32_t index); 1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static void streamCbRoutine(mm_camera_super_buf_t *super_frame, 1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream, void *userdata); 1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void dumpYUV(mm_camera_buf_def_t *frame, cam_dimension_t dim, 1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_frame_len_offset_t offset, uint8_t name); 133bb03f5c78b9d86c6802d55e44bec7aa37612ab35Shuzhen Wang static bool isUBWCEnabled(); 1342896d129511c499aef15b8162df05fa299860f59Thierry Strudel void setUBWCEnabled(bool val); 135bb03f5c78b9d86c6802d55e44bec7aa37612ab35Shuzhen Wang static cam_format_t getStreamDefaultFormat(cam_stream_type_t type, 136c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee uint32_t width, uint32_t height, bool forcePreviewUBWC, cam_is_type_t isType); 137c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t timeoutFrame(__unused uint32_t frameNumber) = 0; 1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13949c4c6b9370de83553cb9f8bc59de058c540b4cbEmilian Peev void setNRMode(uint8_t nrMode) { mNRMode = nrMode; } 14049c4c6b9370de83553cb9f8bc59de058c540b4cbEmilian Peev uint8_t getNRMode() { return mNRMode; } 14149c4c6b9370de83553cb9f8bc59de058c540b4cbEmilian Peev 1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *mUserData; 1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t mPaddingInfo; 1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *mStreams[MAX_STREAM_NUM_IN_BUNDLE]; 1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t m_numStreams; 1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprotected: 1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t addStream(cam_stream_type_t streamType, 1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t streamFormat, 1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t streamDim, 1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_rotation_t streamRotation, 1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t minStreamBufnum, 1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocessMask, 1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_is_type_t isType, 1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t batchSize = 0); 1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t allocateStreamInfoBuf(camera3_stream_t *stream); 1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t m_camHandle; 1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *m_camOps; 1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool m_bIsActive; 1622896d129511c499aef15b8162df05fa299860f59Thierry Strudel bool m_bUBWCenable; 1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t m_handle; 1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_notify_t mDataCB; 1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3HeapMemory *mStreamInfoBuf; 1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine mChannelCB; 172c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err mChannelCbBufErr; 1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //cam_padding_info_t *mPaddingInfo; 1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t mPostProcMask; 1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mYUVDump; 1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_is_type_t mIsType; 1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mNumBuffers; 1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel /* Enable unmapping of buffer before issuing buffer callback. Default value 1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * for this flag is true and is selectively set to false for the usecases 1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * such as HFR to avoid any performance hit due to mapping/unmapping */ 1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mPerFrameMapUnmapEnable; 1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mFrmNum; 1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mDumpFrmCnt; 1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mSkipMode; 1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mDumpSkipCnt; 18649c4c6b9370de83553cb9f8bc59de058c540b4cbEmilian Peev uint8_t mNRMode; 187063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang bool mMapStreamBuffers; // Whether to mmap all stream buffers 1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3ProcessingChannel is used to handle all streams that are directly 1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * generated by hardware and given to frameworks without any postprocessing at HAL. 1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * It also handles input streams that require reprocessing by hardware and then 1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * returned to frameworks. */ 1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3ProcessingChannel : public QCamera3Channel 1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3ProcessingChannel(uint32_t cam_handle, 1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 201c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buffer_err, 2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_t *stream, 2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t stream_type, 2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *metadataChannel, 2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numBuffers = MAX_INFLIGHT_REQUESTS); 2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~QCamera3ProcessingChannel(); 2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t request(buffer_handle_t *buffer, 2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frameNumber, 2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_buffer_t* pInputBuffer, 216e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel metadata_buffer_t* metadata, int &indexUsed, 217e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel __unused bool internalRequest, __unused bool meteringOnly); 2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual QCamera3StreamMem *getStreamBufs(uint32_t len); 2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs(); 2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t registerBuffer(buffer_handle_t *buffer, cam_is_type_t isType); 22314d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen // Register a buffer and get the buffer def for the registered buffer. 22414d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen virtual int32_t registerBufferAndGetBufDef(buffer_handle_t *buffer, mm_camera_buf_def_t *frame); 22514d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen // Unregister a buffer. 22614d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen virtual void unregisterBuffer(mm_camera_buf_def_t *frame); 2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t stop(); 2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual reprocess_type_t getReprocessType() = 0; 2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void reprocessCbRoutine(buffer_handle_t *resultBuffer, 2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t resultFrameNumber); 2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t queueReprocMetadata(mm_camera_super_buf_t *metadata); 235e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen virtual int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame); 2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t translateStreamTypeAndFormat(camera3_stream_t *stream, 2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t &streamType, 2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t &streamFormat); 2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t setReprocConfig(reprocess_config_t &reproc_cfg, 2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_buffer_t *pInputBuffer, 2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *metadata, 2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t streamFormat, cam_dimension_t dim); 2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t setFwkInputPPData(qcamera_fwk_input_pp_data_t *src_frame, 2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_buffer_t *pInputBuffer, 2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel reprocess_config_t *reproc_cfg, 2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *metadata, 2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buffer_handle_t *output_buffer, 2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frameNumber); 2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t checkStreamCbErrors(mm_camera_super_buf_t *super_frame, 2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t getStreamSize(cam_dimension_t &dim); 252c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t timeoutFrame(uint32_t frameNumber); 25340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev virtual int32_t postprocFail(qcamera_hal3_pp_buffer_t *ppBuffer); 2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3PostProcessor m_postprocessor; // post processor 2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void showDebugFPS(int32_t streamType); 2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2588c0646dcd6b49732bb13d8786cc2c2149c1b180fEino-Ville Talvala int32_t releaseOfflineMemory(uint32_t resultFrameNumber); 2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprotected: 2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t mDebugFPS; 2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int mFrameCount; 2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int mLastFrameCount; 2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel nsecs_t mLastFpsTime; 2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool isWNREnabled() {return m_bWNROn;}; 2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void startPostProc(const reprocess_config_t &reproc_cfg); 2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void issueChannelCb(buffer_handle_t *resultBuffer, 2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t resultFrameNumber); 2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem mMemory; //output buffer allocated by fwk 2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_t *mCamera3Stream; 2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mNumBufs; 2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t mStreamType; 2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t mStreamFormat; 2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t mIntent; 2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mPostProcStarted; 277f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen reprocess_type_t mReprocessType; // Only valid when mPostProcStarted is true. 2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mInputBufferConfig; // Set when the processing channel is configured 2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // for processing input(framework) buffers 2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *m_pMetaChannel; 2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *mMetaFrame; 2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem mOfflineMemory; //reprocessing input buffer 2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem mOfflineMetaMemory; //reprocessing metadata buffer 2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel List<uint32_t> mFreeOfflineMetaBuffersList; 2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex mFreeOfflineMetaBuffersLock; 287c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel android::List<mm_camera_super_buf_t *> mOutOfSequenceBuffers; 2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool m_bWNROn; 2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3RegularChannel is used to handle all streams that are directly 2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * generated by hardware and given to frameworks without any postprocessing at HAL. 2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Examples are: all IMPLEMENTATION_DEFINED streams, CPU_READ streams. */ 2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3RegularChannel : public QCamera3ProcessingChannel 2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3RegularChannel(uint32_t cam_handle, 3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 304c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buffer_err, 3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_t *stream, 3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t stream_type, 3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *metadataChannel, 3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numBuffers = MAX_INFLIGHT_REQUESTS); 3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual ~QCamera3RegularChannel(); 3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t setBatchSize(uint32_t batchSize); 3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual uint32_t getStreamTypeMask(); 3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t queueBatchBuf(); 3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel using QCamera3ProcessingChannel::request; 320c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber, 321c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel int &indexUsed); 3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual reprocess_type_t getReprocessType(); 3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t initialize(struct private_handle_t *priv_handle); 3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mBatchSize; 3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_rotation_t mRotation; 3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3MetadataChannel is for metadata stream generated by camera daemon. */ 3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3MetadataChannel : public QCamera3Channel 3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3MetadataChannel(uint32_t cam_handle, 3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 339c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buffer_err, 3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numBuffers = MIN_STREAMING_BUFFER_NUM); 3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual ~QCamera3MetadataChannel(); 3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 348c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber, 349c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel int &indexUsed); 3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual QCamera3StreamMem *getStreamBufs(uint32_t le); 3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs(); 3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/, cam_is_type_t /*isType*/) 3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { return NO_ERROR; }; 357c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t timeoutFrame(__unused uint32_t frameNumber) {return NO_ERROR; }; 3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 359662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev void enableDepthData(bool enable) { mDepthDataPresent = enable; } 360662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev 3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem *mMemory; 363662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev bool mDepthDataPresent; 3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3RawChannel is for opaqueu/cross-platform raw stream containing 3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * vendor specific bayer data or 16-bit unpacked bayer data */ 3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3RawChannel : public QCamera3RegularChannel 3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3RawChannel(uint32_t cam_handle, 3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 375c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buffer_err, 3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_t *stream, 3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *metadataChannel, 3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool raw_16 = false, 3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numBuffers = MAX_INFLIGHT_REQUESTS); 3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual ~QCamera3RawChannel(); 3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual reprocess_type_t getReprocessType(); 3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mRawDump; 3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mIsRaw16; 3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void dumpRawSnapshot(mm_camera_buf_def_t *frame); 3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void convertLegacyToRaw16(mm_camera_buf_def_t *frame); 3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void convertMipiToRaw16(mm_camera_buf_def_t *frame); 4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* 4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * QCamera3RawDumpChannel is for internal use only for Raw dump 4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */ 4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3RawDumpChannel : public QCamera3Channel 4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3RawDumpChannel(uint32_t cam_handle, 4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t rawDumpSize, 4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, uint32_t numBuffers = 3U); 4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual ~QCamera3RawDumpChannel(); 4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual QCamera3StreamMem *getStreamBufs(uint32_t le); 4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs(); 4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/, cam_is_type_t /*isType*/) 4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { return NO_ERROR; }; 424c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t timeoutFrame(__unused uint32_t frameNumber) {return NO_ERROR;}; 425c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber, 426c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel int &indexUsed); 4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void dumpRawSnapshot(mm_camera_buf_def_t *frame); 4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t mDim; 4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mRawDump; 4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem *mMemory; 4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4378e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen/* 4388e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen * QCamera3HdrPlusRawSrcChannel is for internal use only for providing RAW input buffers to HDR+ 4398e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen * client for prototyping Paintbox HDR+. 4408e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen */ 4418e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen 4428e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chenclass QCamera3HdrPlusRawSrcChannel : public QCamera3RawDumpChannel 4438e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen{ 4448e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chenpublic: 445e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen QCamera3HdrPlusRawSrcChannel( 446e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen uint32_t cam_handle, 4478e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen uint32_t channel_handle, 4488e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen mm_camera_ops_t *cam_ops, 4498e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen cam_dimension_t rawDumpSize, 4508e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen cam_padding_info_t *paddingInfo, 4518e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen void *userData, 452e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen cam_feature_mask_t postprocess_mask, 453e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen std::shared_ptr<HdrPlusClient> hdrPlusClient, 454e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen uint32_t hdrPlusStreamId, // HDR+ stream ID for RAW input 455e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen uint32_t numBuffers = 3U); 4568e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen virtual ~QCamera3HdrPlusRawSrcChannel(); 4578e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen 4588e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 4598e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen QCamera3Stream *stream) override; 460e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 461e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chenprivate: 462e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // Send a RAW frame to HDR+ service as HDR+ input buffers. 463e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen void sendRawToHdrPlusService(mm_camera_buf_def_t *frame); 464e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen std::shared_ptr<HdrPlusClient> mHdrPlusClient; 465e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // HDR+ stream ID. 466e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen uint32_t mHdrPlusStreamId; 467e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 4688e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen}; 4698e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen 4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3YUVChannel is used to handle flexible YUV streams that are directly 4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * generated by hardware and given to frameworks without any postprocessing at HAL. 4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * It is also used to handle input buffers that generate YUV outputs */ 4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3YUVChannel : public QCamera3ProcessingChannel 4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3YUVChannel(uint32_t cam_handle, 4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 480c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buffer_err, 4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_t *stream, 4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t stream_type, 4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *metadataChannel); 4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~QCamera3YUVChannel(); 4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel using QCamera3ProcessingChannel::request; 4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t request(buffer_handle_t *buffer, 4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frameNumber, 4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_buffer_t* pInputBuffer, 493c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t* metadata, bool &needMetadata, 494e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel int &indexUsed, bool internalRequest, bool meteringOnly); 4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual reprocess_type_t getReprocessType(); 4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs(); 4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void reprocessCbRoutine(buffer_handle_t *resultBuffer, 5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t resultFrameNumber); 50140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev virtual int32_t postprocFail(qcamera_hal3_pp_buffer_t *ppBuffer); 5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel typedef struct { 5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frameNumber; 5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool offlinePpFlag; 5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buffer_handle_t *output; 5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *callback_buffer; 5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } PpInfo; 5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Whether offline postprocessing is required for this channel 5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mBypass; 5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mFrameLen; 5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Current edge, noise, and crop region setting 5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_edge_application_t mEdgeMode; 5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mNoiseRedMode; 5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_crop_region_t mCropRegion; 5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Mutex to protect mOfflinePpFlagMap and mFreeHeapBufferList 5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex mOfflinePpLock; 5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Map between free number and whether the request needs to be 5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // postprocessed. 5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel List<PpInfo> mOfflinePpInfoList; 5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Heap buffer index list 5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel List<uint32_t> mFreeHeapBufferList; 5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool needsFramePostprocessing(metadata_buffer_t* meta); 5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t handleOfflinePpCallback(uint32_t resultFrameNumber, 5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Vector<mm_camera_super_buf_t *>& pendingCbs); 532c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel mm_camera_super_buf_t* getNextPendingCbBuffer(); 5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3PicChannel is for JPEG stream, which contains a YUV stream generated 5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * by the hardware, and encoded to a JPEG stream */ 5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3PicChannel : public QCamera3ProcessingChannel 5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3PicChannel(uint32_t cam_handle, 5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 544c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buffer_err, 5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_t *stream, 5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool is4KVideo, 5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool isInputStreamConfigured, 5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *metadataChannel, 5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numBuffers = MAX_INFLIGHT_REQUESTS); 5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~QCamera3PicChannel(); 5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t flush(); 5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t request(buffer_handle_t *buffer, 5583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t frameNumber, 5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera3_stream_buffer_t* pInputBuffer, 560c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel metadata_buffer_t* metadata, 561e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel int &indexUsed, bool internalRequest, bool meteringOnly); 5623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual QCamera3StreamMem *getStreamBufs(uint32_t le); 5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs(); 5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual reprocess_type_t getReprocessType(); 568c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t timeoutFrame(uint32_t frameNumber); 5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Exif *getExifData(metadata_buffer_t *metadata, 5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_settings_t *jpeg_settings); 5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void overrideYuvSize(uint32_t width, uint32_t height); 5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static void jpegEvtHandle(jpeg_job_status_t status, 5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t /*client_hdl*/, 5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t jobId, 5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_jpeg_output_t *p_output, 5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata); 5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 5793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userdata); 5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 581e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // Reprocessing is done with the metadata. This function frees the metadata or returns the 582e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // metadata to the metadata channel. 583e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen int32_t metadataBufDone(mm_camera_super_buf_t *recvd_frame) override; 584e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 585e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // Get a YUV buffer for a request from camera service. 586e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen int32_t getYuvBufferForRequest(mm_camera_buf_def_t *frame, uint32_t frameNumber); 587e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 588e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // Return a YUV buffer (from getYuvBufferForRequest) and request jpeg encoding. 589e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen int32_t returnYuvBufferAndEncode(mm_camera_buf_def_t *frame, 590e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen buffer_handle_t *outBuffer, uint32_t frameNumber, 591e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen std::shared_ptr<metadata_buffer_t> metadata); 592e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 593e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // Return a YUV buffer (from getYuvBufferForRequest) without requesting jpeg encoding. 594e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen int32_t returnYuvBuffer(mm_camera_buf_def_t *frame); 595e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t queueJpegSetting(uint32_t out_buf_index, metadata_buffer_t *metadata); 5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t m_max_pic_dim; 6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mNumSnapshotBufs; 6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mYuvWidth, mYuvHeight; 6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t mCurrentBufIndex; 6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mInputBufferHint; 6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem *mYuvMemory; 6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Keep a list of free buffers 6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex mFreeBuffersLock; 6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel List<uint32_t> mFreeBufferList; 6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mFrameLen; 612e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen 613e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // The metadata passed in via returnYuvBufferAndEncode and is allocated externally. 614e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen // These should not be returned to metadata channel. 615e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen Mutex mPendingExternalMetadataLock; 616e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen std::vector<std::shared_ptr<metadata_buffer_t>> mPendingExternalMetadata; 6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// reprocess channel class 6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3ReprocessChannel : public QCamera3Channel 6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3ReprocessChannel(uint32_t cam_handle, 6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 6263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel channel_cb_routine cb_routine, 627c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel channel_cb_buffer_err cb_buffer_err, 6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, void *ch_hdl); 6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3ReprocessChannel(); 6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual ~QCamera3ReprocessChannel(); 6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // offline reprocess 6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t start(); 6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t stop(); 6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t doReprocessOffline(qcamera_fwk_input_pp_data_t *frame, 6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool isPriorityFrame = false); 6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t doReprocess(int buf_fd,void *buffer, size_t buf_length, int32_t &ret_val, 6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_super_buf_t *meta_buf); 6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t overrideMetadata(qcamera_hal3_pp_buffer_t *pp_buffer, 6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *meta_buffer, 6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpeg_settings_t *jpeg_settings, 6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel qcamera_fwk_input_pp_data_t &fwk_frame); 6443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t overrideFwkMetadata(qcamera_fwk_input_pp_data_t *frame); 6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual QCamera3StreamMem *getStreamBufs(uint32_t len); 6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs(); 6473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t unmapOfflineBuffers(bool all); 6493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t bufDone(mm_camera_super_buf_t *recvd_frame); 6503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static void dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void* userdata); 6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config, 6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const reprocess_config_t &src_config, 6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_is_type_t is_type, 6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *pMetaChannel); 6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *getStreamBySrcHandle(uint32_t srcHandle); 6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *getSrcStreamBySrcHandle(uint32_t srcHandle); 6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t registerBuffer(buffer_handle_t * buffer, cam_is_type_t isType); 661c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t timeoutFrame(__unused uint32_t frameNumber) {return NO_ERROR;}; 6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *inputChHandle; 6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel typedef struct { 6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream; 6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_mapping_buf_type type; 6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t index; 6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } OfflineBuffer; 6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t resetToCamPerfNormal(uint32_t frameNumber); 6745c4e9f590ee6371b2dc3b63a7640a732d1f011bcEmilian Peev Mutex mOfflineBuffersLock; // Lock for offline buffers 6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel android::List<OfflineBuffer> mOfflineBuffers; 6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel android::List<OfflineBuffer> mOfflineMetaBuffers; 6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t mOfflineBuffersIndex; 6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t mOfflineMetaIndex; 6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mFrameLen; 6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex mFreeBuffersLock; // Lock for free heap buffers 6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel List<int32_t> mFreeBufferList; // Free heap buffers list 6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel reprocess_type_t mReprocessType; 6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t mSrcStreamHandles[MAX_STREAM_NUM_IN_BUNDLE]; 6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3ProcessingChannel *m_pSrcChannel; // ptr to source channel for reprocess 6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Channel *m_pMetaChannel; 6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem *mMemory; 6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem mGrallocMemory; 6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Vector<uint32_t> mPriorityFrames; 6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex mPriorityFramesLock; 6903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool mReprocessPerfMode; 6913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 6923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3SupportChannel is for HAL internal consumption only */ 6953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelclass QCamera3SupportChannel : public QCamera3Channel 6963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 6973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelpublic: 6983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3SupportChannel(uint32_t cam_handle, 6993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t channel_handle, 7003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops, 7013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, 7023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t postprocess_mask, 7033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t streamType, 7043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t *dim, 7053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t streamFormat, 7063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t hw_analysis_supported, 7073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_color_filter_arrangement_t color_arrangement, 7083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData, 7093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t numBuffers = MIN_STREAMING_BUFFER_NUM 7103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ); 7113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual ~QCamera3SupportChannel(); 7123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t initialize(cam_is_type_t isType); 7143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 715c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t request(buffer_handle_t *buffer, uint32_t frameNumber, 716c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel int &indexUsed); 7173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void streamCbRoutine(mm_camera_super_buf_t *super_frame, 7183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3Stream *stream); 7193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual QCamera3StreamMem *getStreamBufs(uint32_t le); 7213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual void putStreamBufs(); 7223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel virtual int32_t registerBuffer(buffer_handle_t * /*buffer*/, cam_is_type_t /*isType*/) 7233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { return NO_ERROR; }; 724c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel virtual int32_t timeoutFrame(__unused uint32_t frameNumber) {return NO_ERROR;}; 7253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static cam_dimension_t kDim; 7273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelprivate: 7283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCamera3StreamMem *mMemory; 7293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_dimension_t mDim; 7303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t mStreamType; 7313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_format_t mStreamFormat; 732c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee uint8_t mHwAnalysisSupported; 733c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee cam_color_filter_arrangement_t mColorArrangement; 7343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; 7353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7367650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevclass QCamera3DepthChannel : public QCamera3ProcessingChannel { 7377650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevpublic: 7387650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev 7397650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev QCamera3DepthChannel(QCamera3DepthChannel const&) = delete; 7407650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev QCamera3DepthChannel& operator=(QCamera3DepthChannel const&) = delete; 7417650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev 7427650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev QCamera3DepthChannel(uint32_t cam_handle, 7437650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev uint32_t channel_handle, 7447650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev mm_camera_ops_t *cam_ops, 7457650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev channel_cb_routine cb_routine, 7467650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev channel_cb_buffer_err cb_buf_err, 7477650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev cam_padding_info_t *paddingInfo, 7487650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev cam_feature_mask_t postprocess_mask, 7497650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev void *userData, uint32_t numBuffers, 7507650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev camera3_stream_t *stream, 7517650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev QCamera3Channel *metadataChannel) : 7527650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev QCamera3ProcessingChannel(cam_handle, channel_handle, cam_ops, 7537650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev cb_routine, cb_buf_err, paddingInfo, userData, stream, 7547650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev CAM_STREAM_TYPE_DEFAULT, postprocess_mask, 7557650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev metadataChannel, numBuffers), 7567650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev mStream(stream), mGrallocMem(0) {} 7577650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev ~QCamera3DepthChannel(); 7587650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev 7597650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t mapBuffer(buffer_handle_t *buffer, uint32_t frameNumber); 7607650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t populateDepthData(const cam_depth_data_t &data, 7617650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev uint32_t frameNumber); 7627650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev buffer_handle_t *getOldestFrame(uint32_t &frameNumber); 7637650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t unmapBuffer(uint32_t frameNumber); 7647650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t unmapAllBuffers(); 7657650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev camera3_stream_t *getStream() { return mStream; } 7667650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev 7677650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t start() override { return NO_ERROR; }; 7687650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t stop() override { return NO_ERROR; }; 7697650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t setBatchSize(uint32_t) override { return NO_ERROR; } 7707650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t queueBatchBuf() override { return NO_ERROR; } 7717650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t setPerFrameMapUnmap(bool) override { return NO_ERROR; } 7727650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev uint32_t getStreamTypeMask() override { return 0; }; 7737650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t initialize(cam_is_type_t) { return NO_ERROR; } 7747650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev void streamCbRoutine(mm_camera_super_buf_t *, QCamera3Stream *) override {} 7757650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t registerBuffer(buffer_handle_t *, cam_is_type_t) override 7767650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev { return NO_ERROR; } 7777650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev QCamera3StreamMem *getStreamBufs(uint32_t) override { return NULL; } 7787650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev void putStreamBufs() override {} 7797650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t timeoutFrame(uint32_t) override { return NO_ERROR; } 7807650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t flush() override { return NO_ERROR; } 7817650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev reprocess_type_t getReprocessType() override { return REPROCESS_TYPE_NONE; } 7827650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev int32_t setBundleInfo(const cam_bundle_config_t &) override 7837650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev { return NO_ERROR; } 7847650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev 7857650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevprivate: 7867650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev camera3_stream_t *mStream; 7877650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev QCamera3GrallocMemory mGrallocMem; 7887650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev}; 7897650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev 7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace qcamera 7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif /* __QCAMERA_CHANNEL_H__ */ 793