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