16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Redistribution and use in source and binary forms, with or without 46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * modification, are permitted provided that the following conditions are 56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * met: 66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Redistributions of source code must retain the above copyright 76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * notice, this list of conditions and the following disclaimer. 86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Redistributions in binary form must reproduce the above 96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * copyright notice, this list of conditions and the following 106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * disclaimer in the documentation and/or other materials provided 116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * with the distribution. 126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * contributors may be used to endorse or promote products derived 146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * from this software without specific prior written permission. 156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev */ 296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifndef __QCAMERA_POSTPROC_H__ 316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define __QCAMERA_POSTPROC_H__ 326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevextern "C" { 346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <mm_camera_interface.h> 356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <mm_jpeg_interface.h> 366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h" 386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera { 406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevclass QCameraExif; 426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct { 446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t jobId; // job ID 456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t client_hdl; // handle of jpeg client (obtained when open jpeg) 466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t *src_reproc_frame; // original source frame for reproc if not NULL 486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_jpeg_data_t; 496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct { 516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t jobId; // job ID 526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t *src_frame;// source frame (need to be returned back to kernel after done) 536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_pp_data_t; 546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct { 566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t *frame; // source frame that needs post process 576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_pp_request_t; 586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct { 606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t jobId; // job ID (obtained when start_jpeg_job) 616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_job_status_t status; // jpeg encoding status 626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_jpeg_output_t out_data; // ptr to jpeg output buf 636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_jpeg_evt_payload_t; 646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct { 666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t * data; // ptr to data memory struct 676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t * frame; // ptr to frame 686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_release_data_t; 696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevtypedef struct { 716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t msg_type; // msg type of data notify 726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t * data; // ptr to data memory struct 736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev unsigned int index; // index of the buf in the whole buffer 746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_frame_metadata_t *metadata; // ptr to meta data 756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_release_data_t release_data; // any data needs to be release after notify 766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} qcamera_data_argm_t; 776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 78842d685aa593c35533b607d3c3f6ccd74d801fa3Sungmin Choi#define MAX_EXIF_TABLE_ENTRIES 17 796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevclass QCameraExif 806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevpublic: 826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraExif(); 836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev virtual ~QCameraExif(); 846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t addEntry(exif_tag_id_t tagid, 866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif_tag_type_t type, 876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t count, 886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *data); 896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t getNumOfEntries() {return m_nNumEntries;}; 906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QEXIF_INFO_DATA *getEntries() {return m_Entries;}; 916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevprivate: 936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QEXIF_INFO_DATA m_Entries[MAX_EXIF_TABLE_ENTRIES]; // exif tags for JPEG encoder 946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t m_nNumEntries; // number of valid entries 956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; 966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevclass QCameraPostProcessor 986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevpublic: 1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPostProcessor(QCamera2HardwareInterface *cam_ctrl); 1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev virtual ~QCameraPostProcessor(); 1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t init(jpeg_encode_callback_t jpeg_cb, void *user_data); 1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t deinit(); 1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t start(QCameraChannel *pSrcChannel); 1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t stop(); 1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t processData(mm_camera_super_buf_t *frame); 1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t processRawData(mm_camera_super_buf_t *frame); 1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t processPPData(mm_camera_super_buf_t *frame); 1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t processJpegEvt(qcamera_jpeg_evt_payload_t *evt); 1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t getJpegPaddingReq(cam_padding_info_t &padding_info); 1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevprivate: 1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t sendDataNotify(int32_t msg_type, 1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *data, 1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t index, 1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_frame_metadata_t *metadata, 1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_release_data_t *release_data); 1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t sendEvtNotify(int32_t msg_type, int32_t ext1, int32_t ext2); 1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_data_t *findJpegJobByJobId(uint32_t jobId); 1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_jpeg_color_format getColorfmtFromImgFmt(cam_format_t img_fmt); 1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_jpeg_format_t getJpegImgTypeFromImgFmt(cam_format_t img_fmt); 1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm, 1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *main_stream, 1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *thumb_stream); 1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t encodeData(qcamera_jpeg_data_t *jpeg_job_data, 1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t &needNewSess); 1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void releaseSuperBuf(mm_camera_super_buf_t *super_buf); 1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev static void releaseNotifyData(void *user_data, void *cookie); 1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void releaseJpegJobData(qcamera_jpeg_data_t *job); 1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t processRawImageImpl(mm_camera_super_buf_t *recvd_frame); 1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev static void releaseJpegData(void *data, void *user_data); 1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev static void releasePPInputData(void *data, void *user_data); 1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev static void releaseOngoingPPData(void *data, void *user_data); 1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev static void *dataProcessRoutine(void *data); 1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevprivate: 1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCamera2HardwareInterface *m_parent; 1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_encode_callback_t mJpegCB; 1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void * mJpegUserData; 1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_jpeg_ops_t mJpegHandle; 1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t mJpegClientHandle; 1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t mJpegSessionId; 1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStreamMemory * m_pJpegOutputMem; 1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraExif * m_pJpegExifObj; 1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int8_t m_bThumbnailNeeded; 1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraReprocessChannel * m_pReprocChannel; 1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraQueue m_inputPPQ; // input queue for postproc 1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraQueue m_ongoingPPQ; // ongoing postproc queue 1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraQueue m_inputJpegQ; // input jpeg job queue 1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraQueue m_ongoingJpegQ; // ongoing jpeg job queue 1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraQueue m_inputRawQ; // input raw job queue 1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraCmdThread m_dataProcTh; // thread for data processing 1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; 1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera 1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif /* __QCAMERA_POSTPROC_H__ */ 163