111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *
311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Redistribution and use in source and binary forms, with or without
411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * modification, are permitted provided that the following conditions are
511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * met:
611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *     * Redistributions of source code must retain the above copyright
711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       notice, this list of conditions and the following disclaimer.
811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *     * Redistributions in binary form must reproduce the above
911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       copyright notice, this list of conditions and the following
1011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       disclaimer in the documentation and/or other materials provided
1111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       with the distribution.
1211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *     * Neither the name of The Linux Foundation nor the names of its
1311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       contributors may be used to endorse or promote products derived
1411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *       from this software without specific prior written permission.
1511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *
1611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev *
2811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev */
2911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#ifndef __QCamera3_POSTPROC_H__
3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define __QCamera3_POSTPROC_H__
3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern "C" {
3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_camera_interface.h>
3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_jpeg_interface.h>
3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}
3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev//#include "QCamera3HWI.h"
3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCameraQueue.h"
3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCameraCmdThread.h"
4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevnamespace qcamera {
4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Exif;
4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Channel;
4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3PicChannel;
4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3ReprocessChannel;
4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Stream;
4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Memory;
4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct {
5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t jobId;                  // job ID
5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t client_hdl;             // handle of jpeg client (obtained when open jpeg)
5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL
5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_super_buf_t *aux_frame;// source frame but from different stream
5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Channel *aux_channel;
5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_jpeg_data_t;
5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct {
6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t jobId;                  // job ID
6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_pp_data_t;
6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct {
6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_camera_super_buf_t *frame;    // source frame that needs post process
6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_pp_request_t;
6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct {
6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t jobId;                  // job ID (obtained when start_jpeg_job)
7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    jpeg_job_status_t status;        // jpeg encoding status
7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_jpeg_output_t out_data;         // ptr to jpeg output buf
7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_jpeg_evt_payload_t;
7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
74c8301d02dcb437da3fd90943086d351fa739b390Mekala Natarajan#define MAX_EXIF_TABLE_ENTRIES 24
7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Exif
7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Exif();
7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3Exif();
8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t addEntry(exif_tag_id_t tagid,
8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                     exif_tag_type_t type,
8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                     uint32_t count,
8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                     void *data);
8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t getNumOfEntries() {return m_nNumEntries;};
8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QEXIF_INFO_DATA *getEntries() {return m_Entries;};
8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES];  // exif tags for JPEG encoder
9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t  m_nNumEntries;                            // number of valid entries
9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3PostProcessor
9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{
9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic:
9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3PostProcessor(QCamera3PicChannel *ch_ctrl);
9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    virtual ~QCamera3PostProcessor();
9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data);
10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t deinit();
101a03e87e9da27810736220335a10c8b1e848ed261Ed Tam    int32_t start(QCamera3Memory *mMemory, int index, QCamera3PicChannel *pSrcChannel);
10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t stop();
10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t processData(mm_camera_super_buf_t *frame);
10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t processRawData(mm_camera_super_buf_t *frame);
10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t processPPData(mm_camera_super_buf_t *frame);
10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t processAuxiliaryData(mm_camera_buf_def_t *frame,
10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev        QCamera3Channel* pAuxiliaryChannel);
10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t processPPMetadata(mm_camera_super_buf_t *frame);
10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt);
11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId);
11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void releaseJpegJobData(qcamera_jpeg_data_t *job);
11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt);
11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt);
11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm,
11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                  QCamera3Stream *main_stream,
11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                                  QCamera3Stream *thumb_stream);
12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data,
12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev                       uint8_t &needNewSess);
12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void releaseNotifyData(void *user_data, void *cookie);
12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame);
12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void releaseJpegData(void *data, void *user_data);
12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void releasePPInputData(void *data, void *user_data);
12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void releaseOngoingPPData(void *data, void *user_data);
12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    static void *dataProcessRoutine(void *data);
13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate:
13311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3PicChannel         *m_parent;
13411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    jpeg_encode_callback_t     mJpegCB;
13511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    void *                     mJpegUserData;
13611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    mm_jpeg_ops_t              mJpegHandle;
13711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t                   mJpegClientHandle;
13811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    uint32_t                   mJpegSessionId;
13911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
14011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Exif *             m_pJpegExifObj;
14111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int8_t                     m_bThumbnailNeeded;
14211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3Memory             *mJpegMem;
14311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    int                        mJpegMemIndex;
14411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCamera3ReprocessChannel *  m_pReprocChannel;
14511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
14611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraQueue m_inputPPQ;            // input queue for postproc
14711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraQueue m_ongoingPPQ;          // ongoing postproc queue
14811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraQueue m_inputJpegQ;          // input jpeg job queue
14911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraQueue m_ongoingJpegQ;        // ongoing jpeg job queue
15011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraQueue m_inputRawQ;           // input raw job queue
15111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraQueue m_inputMetaQ;          //input meta queue
15211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev    QCameraCmdThread m_dataProcTh;      // thread for data processing
15311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
15411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev     pthread_mutex_t mReprocJobLock;
15511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev};
15611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
15711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; // namespace qcamera
15811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev
15911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#endif /* __QCamera3_POSTPROC_H__ */
160