111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Redistribution and use in source and binary forms, with or without 411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * modification, are permitted provided that the following conditions are 511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * met: 611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions of source code must retain the above copyright 711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * notice, this list of conditions and the following disclaimer. 811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions in binary form must reproduce the above 911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * copyright notice, this list of conditions and the following 1011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * disclaimer in the documentation and/or other materials provided 1111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * with the distribution. 1211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 1311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * contributors may be used to endorse or promote products derived 1411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * from this software without specific prior written permission. 1511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 1611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 2811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev */ 2911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#ifndef __QCamera3_POSTPROC_H__ 3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define __QCamera3_POSTPROC_H__ 3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevextern "C" { 3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_camera_interface.h> 3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <mm_jpeg_interface.h> 3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev//#include "QCamera3HWI.h" 3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCameraQueue.h" 3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "QCameraCmdThread.h" 4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevnamespace qcamera { 4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Exif; 4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Channel; 4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3PicChannel; 4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3ReprocessChannel; 4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Stream; 4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Memory; 4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t jobId; // job ID 5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t client_hdl; // handle of jpeg client (obtained when open jpeg) 5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL 5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_camera_super_buf_t *aux_frame;// source frame but from different stream 5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3Channel *aux_channel; 5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_jpeg_data_t; 5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t jobId; // job ID 6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_pp_data_t; 6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_camera_super_buf_t *frame; // source frame that needs post process 6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_pp_request_t; 6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevtypedef struct { 6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t jobId; // job ID (obtained when start_jpeg_job) 7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev jpeg_job_status_t status; // jpeg encoding status 7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_output_t out_data; // ptr to jpeg output buf 7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} qcamera_jpeg_evt_payload_t; 7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 74c8301d02dcb437da3fd90943086d351fa739b390Mekala Natarajan#define MAX_EXIF_TABLE_ENTRIES 24 7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3Exif 7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic: 7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3Exif(); 7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual ~QCamera3Exif(); 8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t addEntry(exif_tag_id_t tagid, 8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev exif_tag_type_t type, 8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t count, 8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void *data); 8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t getNumOfEntries() {return m_nNumEntries;}; 8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QEXIF_INFO_DATA *getEntries() {return m_Entries;}; 8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate: 8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES]; // exif tags for JPEG encoder 9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t m_nNumEntries; // number of valid entries 9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; 9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevclass QCamera3PostProcessor 9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevpublic: 9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3PostProcessor(QCamera3PicChannel *ch_ctrl); 9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev virtual ~QCamera3PostProcessor(); 9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data); 10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t deinit(); 101a03e87e9da27810736220335a10c8b1e848ed261Ed Tam int32_t start(QCamera3Memory *mMemory, int index, QCamera3PicChannel *pSrcChannel); 10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t stop(); 10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t processData(mm_camera_super_buf_t *frame); 10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t processRawData(mm_camera_super_buf_t *frame); 10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t processPPData(mm_camera_super_buf_t *frame); 10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t processAuxiliaryData(mm_camera_buf_def_t *frame, 10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3Channel* pAuxiliaryChannel); 10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t processPPMetadata(mm_camera_super_buf_t *frame); 10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt); 11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId); 11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void releaseJpegJobData(qcamera_jpeg_data_t *job); 11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate: 11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2); 11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt); 11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt); 11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm, 11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3Stream *main_stream, 11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3Stream *thumb_stream); 12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data, 12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint8_t &needNewSess); 12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void releaseSuperBuf(mm_camera_super_buf_t *super_buf); 12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev static void releaseNotifyData(void *user_data, void *cookie); 12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame); 12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev static void releaseJpegData(void *data, void *user_data); 12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev static void releasePPInputData(void *data, void *user_data); 12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev static void releaseOngoingPPData(void *data, void *user_data); 12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev static void *dataProcessRoutine(void *data); 13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevprivate: 13311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3PicChannel *m_parent; 13411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev jpeg_encode_callback_t mJpegCB; 13511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev void * mJpegUserData; 13611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev mm_jpeg_ops_t mJpegHandle; 13711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t mJpegClientHandle; 13811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t mJpegSessionId; 13911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 14011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3Exif * m_pJpegExifObj; 14111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int8_t m_bThumbnailNeeded; 14211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3Memory *mJpegMem; 14311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int mJpegMemIndex; 14411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCamera3ReprocessChannel * m_pReprocChannel; 14511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 14611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraQueue m_inputPPQ; // input queue for postproc 14711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraQueue m_ongoingPPQ; // ongoing postproc queue 14811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraQueue m_inputJpegQ; // input jpeg job queue 14911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraQueue m_ongoingJpegQ; // ongoing jpeg job queue 15011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraQueue m_inputRawQ; // input raw job queue 15111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraQueue m_inputMetaQ; //input meta queue 15211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QCameraCmdThread m_dataProcTh; // thread for data processing 15311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 15411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev pthread_mutex_t mReprocJobLock; 15511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; 15611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 15711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev}; // namespace qcamera 15811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 15911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#endif /* __QCamera3_POSTPROC_H__ */ 160