1 /* Copyright (c) 2012-2014, 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 __QCAMERA_POSTPROC_H__ 31 #define __QCAMERA_POSTPROC_H__ 32 33 extern "C" { 34 #include <mm_camera_interface.h> 35 #include <mm_jpeg_interface.h> 36 } 37 #include "QCamera2HWI.h" 38 39 #define MAX_JPEG_BURST 2 40 41 namespace qcamera { 42 43 class QCameraExif; 44 45 typedef struct { 46 uint32_t jobId; // job ID 47 uint32_t client_hdl; // handle of jpeg client (obtained when open jpeg) 48 mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 49 mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL 50 metadata_buffer_t *metadata; // source frame metadata 51 bool reproc_frame_release; // false release original buffer, true don't release it 52 mm_camera_buf_def_t *src_reproc_bufs; 53 QCameraExif *pJpegExifObj; 54 } qcamera_jpeg_data_t; 55 56 typedef struct { 57 uint32_t jobId; // job ID 58 mm_camera_super_buf_t *src_frame;// source frame 59 bool reproc_frame_release; // false release original buffer 60 // true don't release it 61 mm_camera_buf_def_t *src_reproc_bufs; 62 } qcamera_pp_data_t; 63 64 typedef struct { 65 uint32_t jobId; // job ID (obtained when start_jpeg_job) 66 jpeg_job_status_t status; // jpeg encoding status 67 mm_jpeg_output_t out_data; // ptr to jpeg output buf 68 } qcamera_jpeg_evt_payload_t; 69 70 typedef struct { 71 camera_memory_t * data; // ptr to data memory struct 72 mm_camera_super_buf_t * frame; // ptr to frame 73 QCameraMemory * streamBufs; //ptr to stream buffers 74 bool unlinkFile; // unlink any stored buffers on error 75 } qcamera_release_data_t; 76 77 typedef struct { 78 int32_t msg_type; // msg type of data notify 79 camera_memory_t * data; // ptr to data memory struct 80 unsigned int index; // index of the buf in the whole buffer 81 camera_frame_metadata_t *metadata; // ptr to meta data 82 qcamera_release_data_t release_data; // any data needs to be release after notify 83 } qcamera_data_argm_t; 84 85 #define MAX_EXIF_TABLE_ENTRIES 17 86 class QCameraExif 87 { 88 public: 89 QCameraExif(); 90 virtual ~QCameraExif(); 91 92 int32_t addEntry(exif_tag_id_t tagid, 93 exif_tag_type_t type, 94 uint32_t count, 95 void *data); getNumOfEntries()96 uint32_t getNumOfEntries() {return m_nNumEntries;}; getEntries()97 QEXIF_INFO_DATA *getEntries() {return m_Entries;}; 98 99 private: 100 QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES]; // exif tags for JPEG encoder 101 uint32_t m_nNumEntries; // number of valid entries 102 }; 103 104 class QCameraPostProcessor 105 { 106 public: 107 QCameraPostProcessor(QCamera2HardwareInterface *cam_ctrl); 108 virtual ~QCameraPostProcessor(); 109 110 int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data); 111 int32_t deinit(); 112 int32_t start(QCameraChannel *pSrcChannel); 113 int32_t stop(); 114 int32_t processData(mm_camera_super_buf_t *frame); 115 int32_t processRawData(mm_camera_super_buf_t *frame); 116 int32_t processPPData(mm_camera_super_buf_t *frame); 117 int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt); 118 int32_t getJpegPaddingReq(cam_padding_info_t &padding_info); getReprocChannel()119 QCameraReprocessChannel * getReprocChannel() {return m_pReprocChannel;}; getJpegMemOpt()120 inline bool getJpegMemOpt() {return mJpegMemOpt;} 121 122 private: 123 int32_t sendDataNotify(int32_t msg_type, 124 camera_memory_t *data, 125 uint8_t index, 126 camera_frame_metadata_t *metadata, 127 qcamera_release_data_t *release_data); 128 int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2); 129 qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId); 130 mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt); 131 mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt); 132 int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm, 133 QCameraStream *main_stream, 134 QCameraStream *thumb_stream); 135 int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data, 136 uint8_t &needNewSess); 137 int32_t queryStreams(QCameraStream **main, 138 QCameraStream **thumb, 139 QCameraStream **reproc, 140 mm_camera_buf_def_t **main_image, 141 mm_camera_buf_def_t **thumb_image, 142 mm_camera_super_buf_t *main_frame, 143 mm_camera_super_buf_t *reproc_frame); 144 int32_t syncStreamParams(mm_camera_super_buf_t *frame, 145 mm_camera_super_buf_t *reproc_frame); 146 void releaseSuperBuf(mm_camera_super_buf_t *super_buf); 147 static void releaseNotifyData(void *user_data, 148 void *cookie, 149 int32_t cb_status); 150 void releaseJpegJobData(qcamera_jpeg_data_t *job); 151 static void releaseSaveJobData(void *data, void *user_data); 152 static void releaseRawData(void *data, void *user_data); 153 int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame); 154 155 static void releaseJpegData(void *data, void *user_data); 156 static void releasePPInputData(void *data, void *user_data); 157 static void releaseOngoingPPData(void *data, void *user_data); 158 159 static void *dataProcessRoutine(void *data); 160 static void *dataSaveRoutine(void *data); 161 162 int32_t setYUVFrameInfo(mm_camera_super_buf_t *recvd_frame); 163 static bool matchJobId(void *data, void *user_data, void *match_data); 164 static int getJpegMemory(omx_jpeg_ouput_buf_t *out_buf); 165 166 int32_t reprocess(qcamera_pp_data_t *pp_job); 167 int32_t stopCapture(); 168 169 private: 170 QCamera2HardwareInterface *m_parent; 171 jpeg_encode_callback_t mJpegCB; 172 void * mJpegUserData; 173 mm_jpeg_ops_t mJpegHandle; 174 uint32_t mJpegClientHandle; 175 uint32_t mJpegSessionId; 176 177 void * m_pJpegOutputMem[MM_JPEG_MAX_BUF]; 178 QCameraExif * m_pJpegExifObj; 179 int8_t m_bThumbnailNeeded; 180 QCameraReprocessChannel * m_pReprocChannel; 181 182 int8_t m_bInited; // if postproc is inited 183 184 QCameraQueue m_inputPPQ; // input queue for postproc 185 QCameraQueue m_ongoingPPQ; // ongoing postproc queue 186 QCameraQueue m_inputJpegQ; // input jpeg job queue 187 QCameraQueue m_ongoingJpegQ; // ongoing jpeg job queue 188 QCameraQueue m_inputRawQ; // input raw job queue 189 QCameraQueue m_inputSaveQ; // input save job queue 190 QCameraCmdThread m_dataProcTh; // thread for data processing 191 QCameraCmdThread m_saveProcTh; // thread for storing buffers 192 uint32_t mSaveFrmCnt; // save frame counter 193 static const char *STORE_LOCATION; // path for storing buffers 194 bool mUseSaveProc; // use store thread 195 bool mUseJpegBurst; // use jpeg burst encoding mode 196 bool mJpegMemOpt; 197 uint32_t m_JpegOutputMemCount; 198 uint8_t mNewJpegSessionNeeded; 199 }; 200 201 }; // namespace qcamera 202 203 #endif /* __QCAMERA_POSTPROC_H__ */ 204