QCamera3PostProc.h revision 7ee407aa1024789089aad411c372c79423699976
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 14
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, QCamera3PicChannel *pSrcChannel);
102    int32_t stop();
103    int32_t processData(mm_camera_super_buf_t *frame);
104    int32_t processRawData(mm_camera_super_buf_t *frame);
105    int32_t processPPData(mm_camera_super_buf_t *frame);
106    int32_t processAuxiliaryData(mm_camera_buf_def_t *frame,
107        QCamera3Channel* pAuxiliaryChannel);
108    int32_t processPPMetadata(mm_camera_super_buf_t *frame);
109    int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt);
110    qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId);
111    void releaseJpegJobData(qcamera_jpeg_data_t *job);
112
113private:
114    int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
115    mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt);
116    mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt);
117    int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm,
118                                  QCamera3Stream *main_stream,
119                                  QCamera3Stream *thumb_stream);
120    int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data,
121                       uint8_t &needNewSess);
122    void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
123    static void releaseNotifyData(void *user_data, void *cookie);
124    int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame);
125
126    static void releaseJpegData(void *data, void *user_data);
127    static void releasePPInputData(void *data, void *user_data);
128    static void releaseOngoingPPData(void *data, void *user_data);
129
130    static void *dataProcessRoutine(void *data);
131
132private:
133    QCamera3PicChannel         *m_parent;
134    jpeg_encode_callback_t     mJpegCB;
135    void *                     mJpegUserData;
136    mm_jpeg_ops_t              mJpegHandle;
137    uint32_t                   mJpegClientHandle;
138    uint32_t                   mJpegSessionId;
139
140    QCamera3Exif *             m_pJpegExifObj;
141    int8_t                     m_bThumbnailNeeded;
142    QCamera3Memory             *mJpegMem;
143    int                        mJpegMemIndex;
144    QCamera3ReprocessChannel *  m_pReprocChannel;
145
146    QCameraQueue m_inputPPQ;            // input queue for postproc
147    QCameraQueue m_ongoingPPQ;          // ongoing postproc queue
148    QCameraQueue m_inputJpegQ;          // input jpeg job queue
149    QCameraQueue m_ongoingJpegQ;        // ongoing jpeg job queue
150    QCameraQueue m_inputRawQ;           // input raw job queue
151    QCameraQueue m_inputMetaQ;          //input meta queue
152    QCameraCmdThread m_dataProcTh;      // thread for data processing
153
154     pthread_mutex_t mReprocJobLock;
155};
156
157}; // namespace qcamera
158
159#endif /* __QCamera3_POSTPROC_H__ */
160