166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * Redistribution and use in source and binary forms, with or without 466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * modification, are permitted provided that the following conditions are 566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * met: 666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * * Redistributions of source code must retain the above copyright 766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * notice, this list of conditions and the following disclaimer. 866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * * Redistributions in binary form must reproduce the above 966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * copyright notice, this list of conditions and the following 1066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * disclaimer in the documentation and/or other materials provided 1166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * with the distribution. 1266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * * Neither the name of The Linux Foundation nor the names of its 1366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * contributors may be used to endorse or promote products derived 1466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * from this software without specific prior written permission. 1566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 1666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 2866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru */ 2966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 3066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#ifndef __QCamera3_POSTPROC_H__ 3166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#define __QCamera3_POSTPROC_H__ 3266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 3366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruextern "C" { 3466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <mm_camera_interface.h> 3566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <mm_jpeg_interface.h> 3666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 3766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru//#include "QCamera3HWI.h" 3866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCameraQueue.h" 3966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCameraCmdThread.h" 4066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 4166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurunamespace qcamera { 4266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Exif; 4466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Channel; 4566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3PicChannel; 467ee407aa1024789089aad411c372c79423699976Ajay Dudaniclass QCamera3ReprocessChannel; 4766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Stream; 4866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Memory; 4966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 5066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct { 5166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t jobId; // job ID 5266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t client_hdl; // handle of jpeg client (obtained when open jpeg) 5366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 5466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL 55c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_super_buf_t *aux_frame;// source frame but from different stream 56c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *aux_channel; 5766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_jpeg_data_t; 5866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 5966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct { 6066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t jobId; // job ID 6166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 6266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_pp_data_t; 6366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 6466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct { 6566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_super_buf_t *frame; // source frame that needs post process 6666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_pp_request_t; 6766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 6866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurutypedef struct { 6966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t jobId; // job ID (obtained when start_jpeg_job) 7066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpeg_job_status_t status; // jpeg encoding status 7166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_jpeg_output_t out_data; // ptr to jpeg output buf 7266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} qcamera_jpeg_evt_payload_t; 7366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 74842d685aa593c35533b607d3c3f6ccd74d801fa3Sungmin Choi#define MAX_EXIF_TABLE_ENTRIES 17 7566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3Exif 7666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 7766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurupublic: 7866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Exif(); 7966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru virtual ~QCamera3Exif(); 8066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 8166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t addEntry(exif_tag_id_t tagid, 8266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru exif_tag_type_t type, 8366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t count, 8466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru void *data); 8566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t getNumOfEntries() {return m_nNumEntries;}; 8666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QEXIF_INFO_DATA *getEntries() {return m_Entries;}; 8766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 8866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruprivate: 8966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES]; // exif tags for JPEG encoder 9066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t m_nNumEntries; // number of valid entries 9166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru}; 9266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 9366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruclass QCamera3PostProcessor 9466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 9566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurupublic: 9666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3PostProcessor(QCamera3PicChannel *ch_ctrl); 9766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru virtual ~QCamera3PostProcessor(); 9866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 9966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data); 10066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t deinit(); 101d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int32_t start(QCamera3Memory *mMemory, int index, 102d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3Channel *pInputChannel); 10366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t stop(); 10466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t processData(mm_camera_super_buf_t *frame); 10566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t processRawData(mm_camera_super_buf_t *frame); 10666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t processPPData(mm_camera_super_buf_t *frame); 107c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang int32_t processAuxiliaryData(mm_camera_buf_def_t *frame, 108c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel* pAuxiliaryChannel); 1097ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t processPPMetadata(mm_camera_super_buf_t *frame); 11066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt); 11166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId); 11266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru void releaseJpegJobData(qcamera_jpeg_data_t *job); 11366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 11466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruprivate: 11566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2); 11666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt); 11766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt); 11866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm, 11966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Stream *main_stream, 12066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Stream *thumb_stream); 12166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data, 1227a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani uint8_t &needNewSess, mm_camera_super_buf_t *p_metaFrame); 12366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru void releaseSuperBuf(mm_camera_super_buf_t *super_buf); 12466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru static void releaseNotifyData(void *user_data, void *cookie); 12566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame); 12666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 12766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru static void releaseJpegData(void *data, void *user_data); 12866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru static void releasePPInputData(void *data, void *user_data); 12966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru static void releaseOngoingPPData(void *data, void *user_data); 13066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 13166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru static void *dataProcessRoutine(void *data); 13266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 13366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruprivate: 13466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3PicChannel *m_parent; 13566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpeg_encode_callback_t mJpegCB; 13666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru void * mJpegUserData; 13766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_jpeg_ops_t mJpegHandle; 13866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t mJpegClientHandle; 13966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t mJpegSessionId; 14066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 14166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Exif * m_pJpegExifObj; 14266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int8_t m_bThumbnailNeeded; 143a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru QCamera3Memory *mJpegMem; 144a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru int mJpegMemIndex; 1457ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3ReprocessChannel * m_pReprocChannel; 14666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 14766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCameraQueue m_inputPPQ; // input queue for postproc 14866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCameraQueue m_ongoingPPQ; // ongoing postproc queue 14966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCameraQueue m_inputJpegQ; // input jpeg job queue 15066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCameraQueue m_ongoingJpegQ; // ongoing jpeg job queue 15166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCameraQueue m_inputRawQ; // input raw job queue 1527ee407aa1024789089aad411c372c79423699976Ajay Dudani QCameraQueue m_inputMetaQ; //input meta queue 15366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCameraCmdThread m_dataProcTh; // thread for data processing 1547ee407aa1024789089aad411c372c79423699976Ajay Dudani 1557ee407aa1024789089aad411c372c79423699976Ajay Dudani pthread_mutex_t mReprocJobLock; 15666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru}; 15766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 15866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru}; // namespace qcamera 15966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 16066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#endif /* __QCamera3_POSTPROC_H__ */ 161