16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Redistribution and use in source and binary forms, with or without
46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * modification, are permitted provided that the following conditions are
56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * met:
66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions of source code must retain the above copyright
76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       notice, this list of conditions and the following disclaimer.
86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Redistributions in binary form must reproduce the above
96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       copyright notice, this list of conditions and the following
106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       disclaimer in the documentation and/or other materials provided
116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       with the distribution.
126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *     * Neither the name of The Linux Foundation nor the names of its
136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       contributors may be used to endorse or promote products derived
146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *       from this software without specific prior written permission.
156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev */
296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifndef __QCAMERA_POSTPROC_H__
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define __QCAMERA_POSTPROC_H__
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevextern "C" {
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <mm_camera_interface.h>
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <mm_jpeg_interface.h>
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h"
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera {
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevclass QCameraExif;
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t jobId;                  // job ID
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t client_hdl;             // handle of jpeg client (obtained when open jpeg)
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_jpeg_data_t;
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t jobId;                  // job ID
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_pp_data_t;
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_super_buf_t *frame;    // source frame that needs post process
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_pp_request_t;
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t jobId;                  // job ID (obtained when start_jpeg_job)
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    jpeg_job_status_t status;        // jpeg encoding status
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_output_t out_data;         // ptr to jpeg output buf
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_jpeg_evt_payload_t;
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    camera_memory_t *        data;     // ptr to data memory struct
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_super_buf_t *  frame;    // ptr to frame
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_release_data_t;
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct {
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t                  msg_type; // msg type of data notify
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    camera_memory_t *        data;     // ptr to data memory struct
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    unsigned int             index;    // index of the buf in the whole buffer
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    camera_frame_metadata_t *metadata; // ptr to meta data
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_release_data_t   release_data; // any data needs to be release after notify
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_data_argm_t;
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
78842d685aa593c35533b607d3c3f6ccd74d801fa3Sungmin Choi#define MAX_EXIF_TABLE_ENTRIES 17
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevclass QCameraExif
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevpublic:
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraExif();
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    virtual ~QCameraExif();
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t addEntry(exif_tag_id_t tagid,
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                     exif_tag_type_t type,
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                     uint32_t count,
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                     void *data);
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t getNumOfEntries() {return m_nNumEntries;};
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QEXIF_INFO_DATA *getEntries() {return m_Entries;};
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevprivate:
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES];  // exif tags for JPEG encoder
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t  m_nNumEntries;                            // number of valid entries
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev};
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevclass QCameraPostProcessor
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevpublic:
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraPostProcessor(QCamera2HardwareInterface *cam_ctrl);
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    virtual ~QCameraPostProcessor();
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data);
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t deinit();
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t start(QCameraChannel *pSrcChannel);
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t stop();
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t processData(mm_camera_super_buf_t *frame);
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t processRawData(mm_camera_super_buf_t *frame);
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t processPPData(mm_camera_super_buf_t *frame);
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt);
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t getJpegPaddingReq(cam_padding_info_t &padding_info);
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevprivate:
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t sendDataNotify(int32_t msg_type,
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           camera_memory_t *data,
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           uint8_t index,
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           camera_frame_metadata_t *metadata,
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           qcamera_release_data_t *release_data);
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId);
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt);
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt);
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm,
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  QCameraStream *main_stream,
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  QCameraStream *thumb_stream);
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data,
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       uint8_t &needNewSess);
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    static void releaseNotifyData(void *user_data, void *cookie);
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    void releaseJpegJobData(qcamera_jpeg_data_t *job);
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame);
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    static void releaseJpegData(void *data, void *user_data);
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    static void releasePPInputData(void *data, void *user_data);
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    static void releaseOngoingPPData(void *data, void *user_data);
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    static void *dataProcessRoutine(void *data);
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevprivate:
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *m_parent;
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    jpeg_encode_callback_t     mJpegCB;
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    void *                     mJpegUserData;
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_ops_t              mJpegHandle;
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t                   mJpegClientHandle;
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t                   mJpegSessionId;
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStreamMemory *      m_pJpegOutputMem;
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraExif *              m_pJpegExifObj;
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int8_t                     m_bThumbnailNeeded;
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraReprocessChannel *  m_pReprocChannel;
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraQueue m_inputPPQ;            // input queue for postproc
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraQueue m_ongoingPPQ;          // ongoing postproc queue
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraQueue m_inputJpegQ;          // input jpeg job queue
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraQueue m_ongoingJpegQ;        // ongoing jpeg job queue
1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraQueue m_inputRawQ;           // input raw job queue
1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraCmdThread m_dataProcTh;      // thread for data processing
1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev};
1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera
1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif /* __QCAMERA_POSTPROC_H__ */
163