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