1 /* Copyright (c) 2012-2016, The Linux Foundation. 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 __QCAMERA_POSTPROC_H__
31 #define __QCAMERA_POSTPROC_H__
32 
33 // Camera dependencies
34 #include "QCamera2HWI.h"
35 
36 extern "C" {
37 #include "mm_camera_interface.h"
38 #include "mm_jpeg_interface.h"
39 }
40 
41 #define MAX_JPEG_BURST 2
42 #define CAM_PP_CHANNEL_MAX 8
43 
44 namespace qcamera {
45 
46 class QCameraExif;
47 class QCamera2HardwareInterface;
48 
49 typedef struct {
50     uint32_t jobId;                  // job ID
51     uint32_t client_hdl;             // handle of jpeg client (obtained when open jpeg)
52     mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel
53                                      //after done)
54     mm_camera_super_buf_t *src_reproc_frame; // original source
55                                              //frame for reproc if not NULL
56     metadata_buffer_t *metadata;     // source frame metadata
57     bool reproc_frame_release;       // false release original buffer, true don't release it
58     mm_camera_buf_def_t *src_reproc_bufs;
59     QCameraExif *pJpegExifObj;
60     uint8_t offline_buffer;
61     mm_camera_buf_def_t *offline_reproc_buf; //HAL processed buffer
62 } qcamera_jpeg_data_t;
63 
64 
65 typedef struct {
66     int8_t reprocCount;
67     mm_camera_super_buf_t *src_frame;    // source frame that needs post process
68     mm_camera_super_buf_t *src_reproc_frame;// source frame (need to be
69                                             //returned back to kernel after done)
70 }qcamera_pp_request_t;
71 
72 typedef struct {
73     uint32_t jobId;                  // job ID
74     int8_t reprocCount;              //Current pass count
75     int8_t ppChannelIndex;           //Reprocess channel object index
76     mm_camera_super_buf_t *src_frame;// source frame
77     bool reproc_frame_release;       // false release original buffer
78                                      // true don't release it
79     mm_camera_buf_def_t *src_reproc_bufs;
80     mm_camera_super_buf_t *src_reproc_frame;// source frame (need to be
81                                             //returned back to kernel after done)
82     uint8_t offline_buffer;
83     mm_camera_buf_def_t *offline_reproc_buf; //HAL processed buffer
84 } qcamera_pp_data_t;
85 
86 typedef struct {
87     uint32_t jobId;                  // job ID (obtained when start_jpeg_job)
88     jpeg_job_status_t status;        // jpeg encoding status
89     mm_jpeg_output_t out_data;         // ptr to jpeg output buf
90 } qcamera_jpeg_evt_payload_t;
91 
92 typedef struct {
93     camera_memory_t *        data;     // ptr to data memory struct
94     mm_camera_super_buf_t *  frame;    // ptr to frame
95     QCameraMemory *          streamBufs; //ptr to stream buffers
96     bool                     unlinkFile; // unlink any stored buffers on error
97 } qcamera_release_data_t;
98 
99 typedef struct {
100     int32_t                  msg_type; // msg type of data notify
101     camera_memory_t *        data;     // ptr to data memory struct
102     unsigned int             index;    // index of the buf in the whole buffer
103     camera_frame_metadata_t *metadata; // ptr to meta data
104     qcamera_release_data_t   release_data; // any data needs to be release after notify
105 } qcamera_data_argm_t;
106 
107 #define MAX_EXIF_TABLE_ENTRIES 17
108 class QCameraExif
109 {
110 public:
111     QCameraExif();
112     virtual ~QCameraExif();
113 
114     int32_t addEntry(exif_tag_id_t tagid,
115                      exif_tag_type_t type,
116                      uint32_t count,
117                      void *data);
getNumOfEntries()118     uint32_t getNumOfEntries() {return m_nNumEntries;};
getEntries()119     QEXIF_INFO_DATA *getEntries() {return m_Entries;};
120 
121 private:
122     QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES];  // exif tags for JPEG encoder
123     uint32_t  m_nNumEntries;                            // number of valid entries
124 };
125 
126 class QCameraPostProcessor
127 {
128 public:
129     QCameraPostProcessor(QCamera2HardwareInterface *cam_ctrl);
130     virtual ~QCameraPostProcessor();
131 
132     int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data);
133     int32_t deinit();
134     int32_t start(QCameraChannel *pSrcChannel);
135     int32_t stop();
136     bool validatePostProcess(mm_camera_super_buf_t *frame);
137     int32_t processData(mm_camera_super_buf_t *frame);
138     int32_t processRawData(mm_camera_super_buf_t *frame);
139     int32_t processPPData(mm_camera_super_buf_t *frame);
140     int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt);
141     int32_t getJpegPaddingReq(cam_padding_info_t &padding_info);
142     QCameraReprocessChannel * getReprocChannel(uint8_t index);
getJpegMemOpt()143     inline bool getJpegMemOpt() {return mJpegMemOpt;}
setJpegMemOpt(bool val)144     inline void setJpegMemOpt(bool val) {mJpegMemOpt = val;}
145     int32_t setJpegHandle(mm_jpeg_ops_t *pJpegHandle,
146             mm_jpeg_mpo_ops_t* pJpegMpoHandle, uint32_t clientHandle);
147     int32_t createJpegSession(QCameraChannel *pSrcChannel);
148 
getPPChannelCount()149     int8_t getPPChannelCount() {return mPPChannelCount;};
150     mm_camera_buf_def_t *getOfflinePPInputBuffer(
151             mm_camera_super_buf_t *src_frame);
152     QCameraMemory *mOfflineDataBufs;
153 
154 private:
155     int32_t sendDataNotify(int32_t msg_type,
156             camera_memory_t *data,
157             uint8_t index,
158             camera_frame_metadata_t *metadata,
159             qcamera_release_data_t *release_data,
160             uint32_t super_buf_frame_idx = 0);
161     int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2);
162     qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId);
163     mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt);
164     mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt);
165     int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm,
166                                   QCameraStream *main_stream,
167                                   QCameraStream *thumb_stream);
168     int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data,
169                        uint8_t &needNewSess);
170     int32_t queryStreams(QCameraStream **main,
171             QCameraStream **thumb,
172             QCameraStream **reproc,
173             mm_camera_buf_def_t **main_image,
174             mm_camera_buf_def_t **thumb_image,
175             mm_camera_super_buf_t *main_frame,
176             mm_camera_super_buf_t *reproc_frame);
177     int32_t syncStreamParams(mm_camera_super_buf_t *frame,
178             mm_camera_super_buf_t *reproc_frame);
179     void releaseSuperBuf(mm_camera_super_buf_t *super_buf);
180     void releaseSuperBuf(mm_camera_super_buf_t *super_buf,
181             cam_stream_type_t stream_type);
182     static void releaseNotifyData(void *user_data,
183                                   void *cookie,
184                                   int32_t cb_status);
185     void releaseJpegJobData(qcamera_jpeg_data_t *job);
186     static void releaseSaveJobData(void *data, void *user_data);
187     static void releaseRawData(void *data, void *user_data);
188     int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame);
189 
190     static void releaseJpegData(void *data, void *user_data);
191     static void releasePPInputData(void *data, void *user_data);
192     static void releaseOngoingPPData(void *data, void *user_data);
193 
194     static void *dataProcessRoutine(void *data);
195     static void *dataSaveRoutine(void *data);
196 
197     int32_t setYUVFrameInfo(mm_camera_super_buf_t *recvd_frame);
198     static bool matchJobId(void *data, void *user_data, void *match_data);
199     static int getJpegMemory(omx_jpeg_ouput_buf_t *out_buf);
200     static int releaseJpegMemory(omx_jpeg_ouput_buf_t *out_buf);
201 
202     int32_t doReprocess();
203     int32_t stopCapture();
204 private:
205     QCamera2HardwareInterface *m_parent;
206     jpeg_encode_callback_t     mJpegCB;
207     void *                     mJpegUserData;
208     mm_jpeg_ops_t              mJpegHandle;
209     mm_jpeg_mpo_ops_t          mJpegMpoHandle; // handle for mpo composition for dualcam
210     uint32_t                   mJpegClientHandle;
211     uint32_t                   mJpegSessionId;
212 
213     void *                     m_pJpegOutputMem[MM_JPEG_MAX_BUF];
214     QCameraExif *              m_pJpegExifObj;
215     uint32_t                   m_bThumbnailNeeded;
216 
217     int8_t                     mPPChannelCount;
218     QCameraReprocessChannel    *mPPChannels[CAM_PP_CHANNEL_MAX];
219 
220     camera_memory_t *          m_DataMem; // save frame mem pointer
221 
222     int8_t                     m_bInited; // if postproc is inited
223 
224     QCameraQueue m_inputPPQ;            // input queue for postproc
225     QCameraQueue m_ongoingPPQ;          // ongoing postproc queue
226     QCameraQueue m_inputJpegQ;          // input jpeg job queue
227     QCameraQueue m_ongoingJpegQ;        // ongoing jpeg job queue
228     QCameraQueue m_inputRawQ;           // input raw job queue
229     QCameraQueue m_inputSaveQ;          // input save job queue
230     QCameraCmdThread m_dataProcTh;      // thread for data processing
231     QCameraCmdThread m_saveProcTh;      // thread for storing buffers
232     uint32_t mSaveFrmCnt;               // save frame counter
233     static const char *STORE_LOCATION;  // path for storing buffers
234     bool mUseSaveProc;                  // use store thread
235     bool mUseJpegBurst;                 // use jpeg burst encoding mode
236     bool mJpegMemOpt;
237     uint32_t   m_JpegOutputMemCount;
238     uint8_t mNewJpegSessionNeeded;
239     int32_t m_bufCountPPQ;
240     Vector<mm_camera_buf_def_t *> m_InputMetadata; // store input metadata buffers for AOST cases
241     size_t m_PPindex;                   // counter for each incoming AOST buffer
242     pthread_mutex_t m_reprocess_lock;   // lock to ensure reprocess job is not freed early.
243 
244 public:
245     cam_dimension_t m_dst_dim;
246 };
247 
248 }; // namespace qcamera
249 
250 #endif /* __QCAMERA_POSTPROC_H__ */
251