17f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 27f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 37f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * Redistribution and use in source and binary forms, with or without 47f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * modification, are permitted provided that the following conditions are 57f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * met: 67f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * * Redistributions of source code must retain the above copyright 77f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * notice, this list of conditions and the following disclaimer. 87f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * * Redistributions in binary form must reproduce the above 97f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * copyright notice, this list of conditions and the following 107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * disclaimer in the documentation and/or other materials provided 117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * with the distribution. 127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * * Neither the name of The Linux Foundation nor the names of its 137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * contributors may be used to endorse or promote products derived 147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * from this software without specific prior written permission. 157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He * 287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He */ 297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#ifndef __QCamera3_POSTPROC_H__ 317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define __QCamera3_POSTPROC_H__ 327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He// Camera dependencies 347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "camera3.h" 357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "QCamera3HALHeader.h" 367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "QCameraCmdThread.h" 377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "QCameraQueue.h" 387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heextern "C" { 407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_camera_interface.h" 417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#include "mm_jpeg_interface.h" 427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} 437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Henamespace qcamera { 457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass QCamera3Exif; 477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass QCamera3ProcessingChannel; 487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass QCamera3ReprocessChannel; 497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass QCamera3Stream; 507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass QCamera3StreamMem; 517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hetypedef struct { 537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He camera3_stream_buffer_t src_frame;// source frame 547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_buf_def_t metadata_buffer; 557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_buf_def_t input_buffer; 567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He reprocess_config_t reproc_config; 577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buffer_handle_t *output_buffer; 587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t frameNumber; 597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} qcamera_fwk_input_pp_data_t; 607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hetypedef struct { 627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t jobId; // job ID 637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t client_hdl; // handle of jpeg client (obtained when open jpeg) 647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL 667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He qcamera_fwk_input_pp_data_t *fwk_frame; // source framework buffer 677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He qcamera_fwk_input_pp_data_t *fwk_src_buffer; // original framework source frame for reproc 687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3Exif *pJpegExifObj; 697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He metadata_buffer_t *metadata; 707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_super_buf_t *src_metadata; 717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He jpeg_settings_t *jpeg_settings; 727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} qcamera_hal3_jpeg_data_t; 737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hetypedef struct { 757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t jobId; // job ID 767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He qcamera_fwk_input_pp_data_t *fwk_src_frame;// source frame 787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He metadata_buffer_t *metadata; 797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He jpeg_settings_t *jpeg_settings; 807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_super_buf_t *src_metadata; 817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} qcamera_hal3_pp_data_t; 827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hetypedef struct { 847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_camera_super_buf_t *input; 857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buffer_handle_t *output; 867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t frameNumber; 877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He} qcamera_hal3_pp_buffer_t; 887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#define MAX_HAL3_EXIF_TABLE_ENTRIES 23 907f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass QCamera3Exif 917f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 927f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hepublic: 937f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3Exif(); 947f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He virtual ~QCamera3Exif(); 957f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 967f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t addEntry(exif_tag_id_t tagid, 977f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He exif_tag_type_t type, 987f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t count, 997f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void *data); 1007f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t getNumOfEntries() {return m_nNumEntries;}; 1017f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QEXIF_INFO_DATA *getEntries() {return m_Entries;}; 1027f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1037f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heprivate: 1047f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QEXIF_INFO_DATA m_Entries[MAX_HAL3_EXIF_TABLE_ENTRIES]; // exif tags for JPEG encoder 1057f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t m_nNumEntries; // number of valid entries 1067f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}; 1077f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1087f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heclass QCamera3PostProcessor 1097f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He{ 1107f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Hepublic: 1117f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3PostProcessor(QCamera3ProcessingChannel *ch_ctrl); 1127f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He virtual ~QCamera3PostProcessor(); 1137f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1147f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t init(QCamera3StreamMem *mMemory); 1157f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t initJpeg(jpeg_encode_callback_t jpeg_cb, 1167f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He cam_dimension_t *m_max_pic_dim, 1177f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void *user_data); 1187f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t deinit(); 1197f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t start(const reprocess_config_t &config); 1207f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t stop(); 1217f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t flush(); 1227f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t processData(qcamera_fwk_input_pp_data_t *frame); 1237f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t processData(mm_camera_super_buf_t *input, 1247f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He buffer_handle_t *output, uint32_t frameNumber); 1257f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t processData(mm_camera_super_buf_t *input); 1267f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t processPPData(mm_camera_super_buf_t *frame); 1277f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t processPPMetadata(mm_camera_super_buf_t *reproc_meta); 1287f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t processJpegSettingData(jpeg_settings_t *jpeg_settings); 1297f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He qcamera_hal3_pp_data_t *dequeuePPJob(uint32_t frameNumber); 1307f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He qcamera_hal3_jpeg_data_t *findJpegJobByJobId(uint32_t jobId); 1317f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void releaseJpegJobData(qcamera_hal3_jpeg_data_t *job); 1327f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t releaseOfflineBuffers(bool all); 1337f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void releasePPJobData(qcamera_hal3_pp_data_t *job); 1347f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1357f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heprivate: 1367f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2); 1377f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt); 1387f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt); 1397f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t getJpegEncodeConfig(mm_jpeg_encode_params_t& encode_parm, 1407f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3Stream *main_stream, 1417f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He jpeg_settings_t *jpeg_settings); 1427f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t getFWKJpegEncodeConfig(mm_jpeg_encode_params_t& encode_parm, 1437f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He qcamera_fwk_input_pp_data_t *frame, 1447f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He jpeg_settings_t *jpeg_settings); 1457f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3Exif * getExifData(metadata_buffer_t *metadata, 1467f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He jpeg_settings_t *jpeg_settings); 1477f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t encodeData(qcamera_hal3_jpeg_data_t *jpeg_job_data, 1487f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t &needNewSess); 1497f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t encodeFWKData(qcamera_hal3_jpeg_data_t *jpeg_job_data, 1507f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint8_t &needNewSess); 1517f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void releaseSuperBuf(mm_camera_super_buf_t *super_buf); 1527f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He static void releaseNotifyData(void *user_data, void *cookie); 1537f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame); 1547f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1557f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He static void releaseJpegData(void *data, void *user_data); 1567f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He static void releasePPInputData(void *data, void *user_data); 1577f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He static void releaseMetadata(void *data, void *user_data); 1587f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He static void releaseOngoingPPData(void *data, void *user_data); 1597f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1607f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He static void *dataProcessRoutine(void *data); 1617f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1627f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun Heprivate: 1637f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3ProcessingChannel *m_parent; 1647f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He jpeg_encode_callback_t mJpegCB; 1657f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He void * mJpegUserData; 1667f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He mm_jpeg_ops_t mJpegHandle; 1677f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t mJpegClientHandle; 1687f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t mJpegSessionId; 1697f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1707f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He uint32_t m_bThumbnailNeeded; 1717f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3StreamMem *mOutputMem; 1727f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCamera3ReprocessChannel * m_pReprocChannel; 1737f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1747f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_inputPPQ; // input queue for postproc 1757f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_inputFWKPPQ; // framework input queue for postproc 1767f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_ongoingPPQ; // ongoing postproc queue 1777f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_inputJpegQ; // input jpeg job queue 1787f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_ongoingJpegQ; // ongoing jpeg job queue 1797f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_inputRawQ; // input raw job queue 1807f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_inputMetaQ; // input meta queue 1817f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraQueue m_jpegSettingsQ; // input jpeg setting queue 1827f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He QCameraCmdThread m_dataProcTh; // thread for data processing 1837f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1847f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He pthread_mutex_t mReprocJobLock; 1857f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}; 1867f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1877f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He}; // namespace qcamera 1887f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He 1897f47f6bd7178f8bf54cf78a003a52c3f4585158cZhijun He#endif /* __QCamera3_POSTPROC_H__ */ 190