166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *
366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * Redistribution and use in source and binary forms, with or without
466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * modification, are permitted provided that the following conditions are
566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * met:
666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *     * Redistributions of source code must retain the above copyright
766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *       notice, this list of conditions and the following disclaimer.
866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *     * Redistributions in binary form must reproduce the above
966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *       copyright notice, this list of conditions and the following
1066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *       disclaimer in the documentation and/or other materials provided
1166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *       with the distribution.
1266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *     * Neither the name of The Linux Foundation nor the names of its
1366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *       contributors may be used to endorse or promote products derived
1466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *       from this software without specific prior written permission.
1566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *
1666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *
2866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru */
2966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
3066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#ifndef __QCamera3_POSTPROC_H__
3166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#define __QCamera3_POSTPROC_H__
3266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
3366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruextern "C" {
3466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <mm_camera_interface.h>
3566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <mm_jpeg_interface.h>
3666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru}
3766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru//#include "QCamera3HWI.h"
3866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCameraQueue.h"
3966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCameraCmdThread.h"
4066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
4166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurunamespace qcamera {
4266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Exif;
4466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Channel;
4566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3PicChannel;
467ee407aa1024789089aad411c372c79423699976Ajay Dudaniclass QCamera3ReprocessChannel;
4766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Stream;
4866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Memory;
4966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
5066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct {
5166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t jobId;                  // job ID
5266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t client_hdl;             // handle of jpeg client (obtained when open jpeg)
5366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
5466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL
55c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    mm_camera_super_buf_t *aux_frame;// source frame but from different stream
56c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    QCamera3Channel *aux_channel;
5766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_jpeg_data_t;
5866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
5966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct {
6066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t jobId;                  // job ID
6166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
6266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_pp_data_t;
6366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
6466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct {
6566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_camera_super_buf_t *frame;    // source frame that needs post process
6666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_pp_request_t;
6766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
6866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct {
6966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t jobId;                  // job ID (obtained when start_jpeg_job)
7066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    jpeg_job_status_t status;        // jpeg encoding status
7166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_jpeg_output_t out_data;         // ptr to jpeg output buf
7266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_jpeg_evt_payload_t;
7366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
74842d685aa593c35533b607d3c3f6ccd74d801fa3Sungmin Choi#define MAX_EXIF_TABLE_ENTRIES 17
7566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Exif
7666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{
7766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurupublic:
7866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCamera3Exif();
7966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    virtual ~QCamera3Exif();
8066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
8166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t addEntry(exif_tag_id_t tagid,
8266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                     exif_tag_type_t type,
8366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                     uint32_t count,
8466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                     void *data);
8566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t getNumOfEntries() {return m_nNumEntries;};
8666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QEXIF_INFO_DATA *getEntries() {return m_Entries;};
8766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
8866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruprivate:
8966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES];  // exif tags for JPEG encoder
9066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t  m_nNumEntries;                            // number of valid entries
9166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru};
9266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
9366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3PostProcessor
9466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{
9566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurupublic:
9666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCamera3PostProcessor(QCamera3PicChannel *ch_ctrl);
9766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    virtual ~QCamera3PostProcessor();
9866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
9966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data);
10066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t deinit();
101d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab    int32_t start(QCamera3Memory *mMemory, int index,
102d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab                  QCamera3Channel *pInputChannel);
10366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t stop();
10466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t processData(mm_camera_super_buf_t *frame);
10566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t processRawData(mm_camera_super_buf_t *frame);
10666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t processPPData(mm_camera_super_buf_t *frame);
107c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang    int32_t processAuxiliaryData(mm_camera_buf_def_t *frame,
108c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang        QCamera3Channel* pAuxiliaryChannel);
1097ee407aa1024789089aad411c372c79423699976Ajay Dudani    int32_t processPPMetadata(mm_camera_super_buf_t *frame);
11066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt);
11166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId);
11266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    void releaseJpegJobData(qcamera_jpeg_data_t *job);
11366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
11466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruprivate:
11566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
11666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt);
11766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt);
11866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm,
11966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                                  QCamera3Stream *main_stream,
12066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru                                  QCamera3Stream *thumb_stream);
12166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data,
1227a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani                       uint8_t &needNewSess, mm_camera_super_buf_t *p_metaFrame);
12366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
12466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    static void releaseNotifyData(void *user_data, void *cookie);
12566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame);
12666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
12766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    static void releaseJpegData(void *data, void *user_data);
12866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    static void releasePPInputData(void *data, void *user_data);
12966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    static void releaseOngoingPPData(void *data, void *user_data);
13066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
13166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    static void *dataProcessRoutine(void *data);
13266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
13366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruprivate:
13466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCamera3PicChannel         *m_parent;
13566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    jpeg_encode_callback_t     mJpegCB;
13666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    void *                     mJpegUserData;
13766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    mm_jpeg_ops_t              mJpegHandle;
13866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t                   mJpegClientHandle;
13966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    uint32_t                   mJpegSessionId;
14066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
14166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCamera3Exif *             m_pJpegExifObj;
14266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    int8_t                     m_bThumbnailNeeded;
143a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru    QCamera3Memory             *mJpegMem;
144a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru    int                        mJpegMemIndex;
1457ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCamera3ReprocessChannel *  m_pReprocChannel;
14666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
14766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCameraQueue m_inputPPQ;            // input queue for postproc
14866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCameraQueue m_ongoingPPQ;          // ongoing postproc queue
14966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCameraQueue m_inputJpegQ;          // input jpeg job queue
15066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCameraQueue m_ongoingJpegQ;        // ongoing jpeg job queue
15166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCameraQueue m_inputRawQ;           // input raw job queue
1527ee407aa1024789089aad411c372c79423699976Ajay Dudani    QCameraQueue m_inputMetaQ;          //input meta queue
15366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru    QCameraCmdThread m_dataProcTh;      // thread for data processing
1547ee407aa1024789089aad411c372c79423699976Ajay Dudani
1557ee407aa1024789089aad411c372c79423699976Ajay Dudani     pthread_mutex_t mReprocJobLock;
15666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru};
15766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
15866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru}; // namespace qcamera
15966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru
16066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#endif /* __QCamera3_POSTPROC_H__ */
161