1/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 *     * Redistributions of source code must retain the above copyright
7 *       notice, this list of conditions and the following disclaimer.
8 *     * Redistributions in binary form must reproduce the above
9 *       copyright notice, this list of conditions and the following
10 *       disclaimer in the documentation and/or other materials provided
11 *       with the distribution.
12 *     * Neither the name of The Linux Foundation nor the names of its
13 *       contributors may be used to endorse or promote products derived
14 *       from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30#ifndef __QCamera3_POSTPROC_H__
31#define __QCamera3_POSTPROC_H__
32
33extern "C" {
34#include <mm_camera_interface.h>
35#include <mm_jpeg_interface.h>
36}
37//#include "QCamera3HWI.h"
38#include "QCameraQueue.h"
39#include "QCameraCmdThread.h"
40
41namespace qcamera {
42
43class QCamera3Exif;
44class QCamera3Channel;
45class QCamera3PicChannel;
46class QCamera3ReprocessChannel;
47class QCamera3Stream;
48class QCamera3Memory;
49
50typedef struct {
51    uint32_t jobId;                  // job ID
52    uint32_t client_hdl;             // handle of jpeg client (obtained when open jpeg)
53    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
54    mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL
55    mm_camera_super_buf_t *aux_frame;// source frame but from different stream
56    QCamera3Channel *aux_channel;
57} qcamera_jpeg_data_t;
58
59typedef struct {
60    uint32_t jobId;                  // job ID
61    mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done)
62} qcamera_pp_data_t;
63
64typedef struct {
65    mm_camera_super_buf_t *frame;    // source frame that needs post process
66} qcamera_pp_request_t;
67
68typedef struct {
69    uint32_t jobId;                  // job ID (obtained when start_jpeg_job)
70    jpeg_job_status_t status;        // jpeg encoding status
71    mm_jpeg_output_t out_data;         // ptr to jpeg output buf
72} qcamera_jpeg_evt_payload_t;
73
74#define MAX_EXIF_TABLE_ENTRIES 17
75class QCamera3Exif
76{
77public:
78    QCamera3Exif();
79    virtual ~QCamera3Exif();
80
81    int32_t addEntry(exif_tag_id_t tagid,
82                     exif_tag_type_t type,
83                     uint32_t count,
84                     void *data);
85    uint32_t getNumOfEntries() {return m_nNumEntries;};
86    QEXIF_INFO_DATA *getEntries() {return m_Entries;};
87
88private:
89    QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES];  // exif tags for JPEG encoder
90    uint32_t  m_nNumEntries;                            // number of valid entries
91};
92
93class QCamera3PostProcessor
94{
95public:
96    QCamera3PostProcessor(QCamera3PicChannel *ch_ctrl);
97    virtual ~QCamera3PostProcessor();
98
99    int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data);
100    int32_t deinit();
101    int32_t start(QCamera3Memory *mMemory, int index,
102                  QCamera3Channel *pInputChannel);
103    int32_t stop();
104    int32_t processData(mm_camera_super_buf_t *frame);
105    int32_t processRawData(mm_camera_super_buf_t *frame);
106    int32_t processPPData(mm_camera_super_buf_t *frame);
107    int32_t processAuxiliaryData(mm_camera_buf_def_t *frame,
108        QCamera3Channel* pAuxiliaryChannel);
109    int32_t processPPMetadata(mm_camera_super_buf_t *frame);
110    int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt);
111    qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId);
112    void releaseJpegJobData(qcamera_jpeg_data_t *job);
113
114private:
115    int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
116    mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt);
117    mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt);
118    int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm,
119                                  QCamera3Stream *main_stream,
120                                  QCamera3Stream *thumb_stream);
121    int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data,
122                       uint8_t &needNewSess, mm_camera_super_buf_t *p_metaFrame);
123    void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
124    static void releaseNotifyData(void *user_data, void *cookie);
125    int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame);
126
127    static void releaseJpegData(void *data, void *user_data);
128    static void releasePPInputData(void *data, void *user_data);
129    static void releaseOngoingPPData(void *data, void *user_data);
130
131    static void *dataProcessRoutine(void *data);
132
133private:
134    QCamera3PicChannel         *m_parent;
135    jpeg_encode_callback_t     mJpegCB;
136    void *                     mJpegUserData;
137    mm_jpeg_ops_t              mJpegHandle;
138    uint32_t                   mJpegClientHandle;
139    uint32_t                   mJpegSessionId;
140
141    QCamera3Exif *             m_pJpegExifObj;
142    int8_t                     m_bThumbnailNeeded;
143    QCamera3Memory             *mJpegMem;
144    int                        mJpegMemIndex;
145    QCamera3ReprocessChannel *  m_pReprocChannel;
146
147    QCameraQueue m_inputPPQ;            // input queue for postproc
148    QCameraQueue m_ongoingPPQ;          // ongoing postproc queue
149    QCameraQueue m_inputJpegQ;          // input jpeg job queue
150    QCameraQueue m_ongoingJpegQ;        // ongoing jpeg job queue
151    QCameraQueue m_inputRawQ;           // input raw job queue
152    QCameraQueue m_inputMetaQ;          //input meta queue
153    QCameraCmdThread m_dataProcTh;      // thread for data processing
154
155     pthread_mutex_t mReprocJobLock;
156};
157
158}; // namespace qcamera
159
160#endif /* __QCamera3_POSTPROC_H__ */
161