1742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang/* Copyright (c) 2012-2014, 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#define LOG_TAG "QCamera3PostProc" 3114dfc272241ba78c85a327da2872e71b3208f8c5Shuzhen Wang//#define LOG_NDEBUG 0 3266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 3366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <stdlib.h> 3466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <utils/Errors.h> 3566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 3666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3PostProc.h" 3766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3HWI.h" 3866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3Channel.h" 3966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include "QCamera3Stream.h" 4066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 4166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurunamespace qcamera { 4266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 4366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 4466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : QCamera3PostProcessor 4566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 4666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: constructor of QCamera3PostProcessor. 4766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 4866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 4966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @cam_ctrl : ptr to HWI object 5066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 5166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 5266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 5366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva RajguruQCamera3PostProcessor::QCamera3PostProcessor(QCamera3PicChannel* ch_ctrl) 5466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru : m_parent(ch_ctrl), 5566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegCB(NULL), 5666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegUserData(NULL), 5766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegClientHandle(0), 5866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegSessionId(0), 5966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_pJpegExifObj(NULL), 6066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_bThumbnailNeeded(TRUE), 61c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan m_pReprocChannel(NULL), 6266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_inputPPQ(releasePPInputData, this), 6366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_ongoingPPQ(releaseOngoingPPData, this), 6466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_inputJpegQ(releaseJpegData, this), 6566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_ongoingJpegQ(releaseJpegData, this), 6666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_inputRawQ(releasePPInputData, this) 6766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 6866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&mJpegHandle, 0, sizeof(mJpegHandle)); 697ee407aa1024789089aad411c372c79423699976Ajay Dudani pthread_mutex_init(&mReprocJobLock, NULL); 7066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 7166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 7266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 7366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : ~QCamera3PostProcessor 7466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 7566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: deconstructor of QCamera3PostProcessor. 7666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 7766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : None 7866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 7966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 8066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 8166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva RajguruQCamera3PostProcessor::~QCamera3PostProcessor() 8266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 8366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_pJpegExifObj != NULL) { 8466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru delete m_pJpegExifObj; 8566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_pJpegExifObj = NULL; 8666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 877ee407aa1024789089aad411c372c79423699976Ajay Dudani pthread_mutex_destroy(&mReprocJobLock); 8866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 8966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 9066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 9166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : init 9266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 9366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: initialization of postprocessor 9466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 9566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 9666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @jpeg_cb : callback to handle jpeg event from mm-camera-interface 9766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @user_data : user data ptr for jpeg callback 9866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 9966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 10066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 10166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 10266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 10366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::init(jpeg_encode_callback_t jpeg_cb, void *user_data) 10466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 10566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegCB = jpeg_cb; 10666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegUserData = user_data; 10766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 10866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegClientHandle = jpeg_open(&mJpegHandle); 10966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(!mJpegClientHandle) { 11066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s : jpeg_open did not work", __func__); 11166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return UNKNOWN_ERROR; 11266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 11366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 11466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_dataProcTh.launch(dataProcessRoutine, this); 11566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 11666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 11766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 11866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 11966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 12066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : deinit 12166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 12266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: de-initialization of postprocessor 12366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 12466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : None 12566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 12666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 12766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 12866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 12966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 13066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::deinit() 13166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 13266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_dataProcTh.exit(); 13366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1347ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_pReprocChannel != NULL) { 1357ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pReprocChannel->stop(); 1367ee407aa1024789089aad411c372c79423699976Ajay Dudani delete m_pReprocChannel; 1377ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pReprocChannel = NULL; 1387ee407aa1024789089aad411c372c79423699976Ajay Dudani } 1397ee407aa1024789089aad411c372c79423699976Ajay Dudani 14066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(mJpegClientHandle > 0) { 14166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int rc = mJpegHandle.close(mJpegClientHandle); 142d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Jpeg closed, rc = %d, mJpegClientHandle = %x", 14366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru __func__, rc, mJpegClientHandle); 14466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegClientHandle = 0; 14566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&mJpegHandle, 0, sizeof(mJpegHandle)); 14666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 14766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 14866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 14966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 15066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 15166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 15266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : start 15366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 15466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: start postprocessor. Data process thread and data notify thread 15566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * will be launched. 15666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 15766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 15866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @pSrcChannel : source channel obj ptr that possibly needs reprocess 15966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 16066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 16166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 16266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 16366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 16466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NOTE : if any reprocess is needed, a reprocess channel/stream 16566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * will be started. 16666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 167d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftabint32_t QCamera3PostProcessor::start(QCamera3Memory* mMemory, int index, 168d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3Channel *pInputChannel) 16966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 17066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t rc = NO_ERROR; 17166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegMem = mMemory; 172a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru mJpegMemIndex = index; 173c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)m_parent->mUserData; 174c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 175c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (hal_obj->needReprocess()) { 176d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab while (!m_inputMetaQ.isEmpty()) { 177d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_pReprocChannel->metadataBufDone((mm_camera_super_buf_t *)m_inputMetaQ.dequeue()); 178d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 1797ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_pReprocChannel != NULL) { 1807ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pReprocChannel->stop(); 1817ee407aa1024789089aad411c372c79423699976Ajay Dudani delete m_pReprocChannel; 1827ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pReprocChannel = NULL; 1837ee407aa1024789089aad411c372c79423699976Ajay Dudani } 1847ee407aa1024789089aad411c372c79423699976Ajay Dudani // if reprocess is needed, start reprocess channel 1857ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)m_parent->mUserData; 186d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGV("%s: Setting input channel as pInputChannel", __func__); 187d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_pReprocChannel = hal_obj->addOnlineReprocChannel(pInputChannel, m_parent); 1887ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_pReprocChannel == NULL) { 1897ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: cannot add reprocess channel", __func__); 1907ee407aa1024789089aad411c372c79423699976Ajay Dudani return UNKNOWN_ERROR; 1917ee407aa1024789089aad411c372c79423699976Ajay Dudani } 1927ee407aa1024789089aad411c372c79423699976Ajay Dudani 1937ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = m_pReprocChannel->start(); 1947ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != 0) { 1957ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: cannot start reprocess channel", __func__); 1967ee407aa1024789089aad411c372c79423699976Ajay Dudani delete m_pReprocChannel; 1977ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pReprocChannel = NULL; 1987ee407aa1024789089aad411c372c79423699976Ajay Dudani return rc; 1997ee407aa1024789089aad411c372c79423699976Ajay Dudani } 2007ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, FALSE); 20266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 20366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 20466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 20566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 20666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 20766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : stop 20866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 20966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: stop postprocessor. Data process and notify thread will be stopped. 21066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 21166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : None 21266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 21366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 21466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 21566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 21666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 21766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NOTE : reprocess channel will be stopped and deleted if there is any 21866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 21966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::stop() 22066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 22166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, TRUE, TRUE); 22266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 22366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 22466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 22566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 22666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 22766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getJpegEncodingConfig 22866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 22966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: function to prepare encoding job information 23066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 23166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 23266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @encode_parm : param to be filled with encoding configuration 23366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 23466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 23566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 23666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 23766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 23866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm, 23966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Stream *main_stream, 24066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Stream *thumb_stream) 24166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 24266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGV("%s : E", __func__); 24366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t ret = NO_ERROR; 24466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 24566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.jpeg_cb = mJpegCB; 24666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.userdata = mJpegUserData; 24766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 24866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_bThumbnailNeeded = TRUE; // need encode thumbnail by default 24966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_dimension_t thumbnailSize; 25066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&thumbnailSize, 0, sizeof(cam_dimension_t)); 25166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_parent->getThumbnailSize(thumbnailSize); 2521237194c260eaedcb6384c400b7add966e143c96Ajay Dudani if (thumbnailSize.width == 0 || thumbnailSize.height == 0) { 25366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // (0,0) means no thumbnail 25466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_bThumbnailNeeded = FALSE; 25566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 25666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.encode_thumbnail = m_bThumbnailNeeded; 25766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 25866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // get color format 25966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_format_t img_fmt = CAM_FORMAT_YUV_420_NV12; //default value 26066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru main_stream->getFormat(img_fmt); 26166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.color_format = getColorfmtFromImgFmt(img_fmt); 26266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 26366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // get jpeg quality 26466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.quality = m_parent->getJpegQuality(); 26566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (encode_parm.quality <= 0) { 26666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.quality = 85; 26766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 26866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 26966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_frame_len_offset_t main_offset; 27066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&main_offset, 0, sizeof(cam_frame_len_offset_t)); 27166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru main_stream->getFrameOffset(main_offset); 27266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 27366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // src buf config 27466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Pass input main image buffer info to encoder. 27566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Memory *pStreamMem = main_stream->getStreamBufs(); 27666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pStreamMem == NULL) { 27766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: cannot get stream bufs from main stream", __func__); 27866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ret = BAD_VALUE; 27966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru goto on_error; 28066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 28166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.num_src_bufs = pStreamMem->getCnt(); 28266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru for (uint32_t i = 0; i < encode_parm.num_src_bufs; i++) { 28366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pStreamMem != NULL) { 28466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_main_buf[i].index = i; 28566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_main_buf[i].buf_size = pStreamMem->getSize(i); 28666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_main_buf[i].buf_vaddr = (uint8_t *)pStreamMem->getPtr(i); 28766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_main_buf[i].fd = pStreamMem->getFd(i); 28866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_main_buf[i].format = MM_JPEG_FMT_YUV; 28966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_main_buf[i].offset = main_offset; 29066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 29166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 29266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 29366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Pass input thumbnail buffer info to encoder. 29466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Note: In this version thumb_stream = main_stream 29566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_bThumbnailNeeded == TRUE) { 29666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (thumb_stream == NULL) { 29766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru thumb_stream = main_stream; 29866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 29966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pStreamMem = thumb_stream->getStreamBufs(); 30066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pStreamMem == NULL) { 30166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: cannot get stream bufs from thumb stream", __func__); 30266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ret = BAD_VALUE; 30366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru goto on_error; 30466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 30566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_frame_len_offset_t thumb_offset; 30666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&thumb_offset, 0, sizeof(cam_frame_len_offset_t)); 30766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru thumb_stream->getFrameOffset(thumb_offset); 308f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab encode_parm.num_tmb_bufs = pStreamMem->getCnt(); 30966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru for (int i = 0; i < pStreamMem->getCnt(); i++) { 31066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pStreamMem != NULL) { 31166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_thumb_buf[i].index = i; 31266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_thumb_buf[i].buf_size = pStreamMem->getSize(i); 31366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_thumb_buf[i].buf_vaddr = (uint8_t *)pStreamMem->getPtr(i); 31466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_thumb_buf[i].fd = pStreamMem->getFd(i); 31566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_thumb_buf[i].format = MM_JPEG_FMT_YUV; 31666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.src_thumb_buf[i].offset = thumb_offset; 31766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 31866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 31966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 32066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 32166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Pass output jpeg buffer info to encoder. 32266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //mJpegMem is allocated by framework. 32366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.num_dst_bufs = 1; 32466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.dest_buf[0].index = 0; 325a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru encode_parm.dest_buf[0].buf_size = mJpegMem->getSize(mJpegMemIndex); 326a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru encode_parm.dest_buf[0].buf_vaddr = (uint8_t *)mJpegMem->getPtr(mJpegMemIndex); 327a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru encode_parm.dest_buf[0].fd = mJpegMem->getFd(mJpegMemIndex); 32866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.dest_buf[0].format = MM_JPEG_FMT_YUV; 32966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru encode_parm.dest_buf[0].offset = main_offset; 33066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 33166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGV("%s : X", __func__); 33266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 33366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 33466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruon_error: 3351237194c260eaedcb6384c400b7add966e143c96Ajay Dudani 33666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGV("%s : X with error %d", __func__, ret); 33766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return ret; 33866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 33966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 34066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 341c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * FUNCTION : processAuxiliaryData 342c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 343c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * DESCRIPTION: Entry function to handle processing of data from streams other 344c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * than parent of the post processor. 345c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 346c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * PARAMETERS : 347c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * @frame : process frame from any stream. 348c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 349c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * RETURN : int32_t type of status 350c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * NO_ERROR -- success 351c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * none-zero failure code 352c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 353c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * NOTE : depends on if offline reprocess is needed, received frame will 354c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * be sent to either input queue of postprocess or jpeg encoding 355c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang *==========================================================================*/ 356c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wangint32_t QCamera3PostProcessor::processAuxiliaryData(mm_camera_buf_def_t *frame, 357c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel* pAuxiliaryChannel) 358c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang{ 359d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab mm_camera_super_buf_t *aux_frame = NULL; 360d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab aux_frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 361d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (aux_frame == NULL) { 362d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: No memory for src frame", __func__); 363d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab return NO_MEMORY; 364d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 365d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab memset(aux_frame, 0, sizeof(mm_camera_super_buf_t)); 366d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab aux_frame->num_bufs = 1; 367d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab aux_frame->bufs[0] = frame; 368d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)m_parent->mUserData; 369d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (hal_obj->needReprocess()) { 370d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab //enable reprocess path 371d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab pthread_mutex_lock(&mReprocJobLock); 372d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab // enqueu to post proc input queue 373d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_inputPPQ.enqueue((void *)aux_frame); 374d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (!(m_inputMetaQ.isEmpty())) { 375742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGI("%s: meta queue is not empty, do next job", __func__); 376d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 377d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 378742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGI("%s: meta queue is empty, not calling do next job", __func__); 379d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 380d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab pthread_mutex_unlock(&mReprocJobLock); 381d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 382d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGD("%s: no need offline reprocess, sending to jpeg encoding", __func__); 383d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab qcamera_jpeg_data_t *jpeg_job = 384d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab (qcamera_jpeg_data_t *)malloc(sizeof(qcamera_jpeg_data_t)); 385d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (jpeg_job == NULL) { 386d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: No memory for jpeg job", __func__); 387d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab return NO_MEMORY; 388d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 389d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab memset(jpeg_job, 0, sizeof(qcamera_jpeg_data_t)); 390d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab jpeg_job->aux_frame = aux_frame; 391d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab jpeg_job->aux_channel = pAuxiliaryChannel; 392d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 393d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab // enqueu to jpeg input queue 394d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_inputJpegQ.enqueue((void *)jpeg_job); 395d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 396c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 397c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return NO_ERROR; 398c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang} 399c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 400c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 401c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang/*=========================================================================== 40266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : processData 40366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 40466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: enqueue data into dataProc thread 40566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 40666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 40766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @frame : process frame received from mm-camera-interface 40866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 40966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 41066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 41166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 41266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 41366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NOTE : depends on if offline reprocess is needed, received frame will 41466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * be sent to either input queue of postprocess or jpeg encoding 41566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 41666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::processData(mm_camera_super_buf_t *frame) 41766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 418c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)m_parent->mUserData; 419c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (hal_obj->needReprocess()) { 4207ee407aa1024789089aad411c372c79423699976Ajay Dudani pthread_mutex_lock(&mReprocJobLock); 4217ee407aa1024789089aad411c372c79423699976Ajay Dudani // enqueu to post proc input queue 4227ee407aa1024789089aad411c372c79423699976Ajay Dudani m_inputPPQ.enqueue((void *)frame); 4237ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!(m_inputMetaQ.isEmpty())) { 4247ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGV("%s: meta queue is not empty, do next job", __func__); 4257ee407aa1024789089aad411c372c79423699976Ajay Dudani m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 4267ee407aa1024789089aad411c372c79423699976Ajay Dudani } 4277ee407aa1024789089aad411c372c79423699976Ajay Dudani pthread_mutex_unlock(&mReprocJobLock); 4287ee407aa1024789089aad411c372c79423699976Ajay Dudani } else if (m_parent->isRawSnapshot()) { 4297ee407aa1024789089aad411c372c79423699976Ajay Dudani processRawData(frame); 4307ee407aa1024789089aad411c372c79423699976Ajay Dudani } else { 4317ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGD("%s: no need offline reprocess, sending to jpeg encoding", __func__); 4327ee407aa1024789089aad411c372c79423699976Ajay Dudani qcamera_jpeg_data_t *jpeg_job = 4337ee407aa1024789089aad411c372c79423699976Ajay Dudani (qcamera_jpeg_data_t *)malloc(sizeof(qcamera_jpeg_data_t)); 4347ee407aa1024789089aad411c372c79423699976Ajay Dudani if (jpeg_job == NULL) { 4357ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: No memory for jpeg job", __func__); 4367ee407aa1024789089aad411c372c79423699976Ajay Dudani return NO_MEMORY; 4377ee407aa1024789089aad411c372c79423699976Ajay Dudani } 43866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 4397ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(jpeg_job, 0, sizeof(qcamera_jpeg_data_t)); 4407ee407aa1024789089aad411c372c79423699976Ajay Dudani jpeg_job->src_frame = frame; 44166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 4427ee407aa1024789089aad411c372c79423699976Ajay Dudani // enqueu to jpeg input queue 4437ee407aa1024789089aad411c372c79423699976Ajay Dudani m_inputJpegQ.enqueue((void *)jpeg_job); 4447ee407aa1024789089aad411c372c79423699976Ajay Dudani m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 4457ee407aa1024789089aad411c372c79423699976Ajay Dudani } 44666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 44766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 44866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 44966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 45066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 4517ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : processPPMetadata 4527ee407aa1024789089aad411c372c79423699976Ajay Dudani * 4537ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: enqueue data into dataProc thread 4547ee407aa1024789089aad411c372c79423699976Ajay Dudani * 4557ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 4567ee407aa1024789089aad411c372c79423699976Ajay Dudani * @frame : process metadata frame received from pic channel 4577ee407aa1024789089aad411c372c79423699976Ajay Dudani * 4587ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : int32_t type of status 4597ee407aa1024789089aad411c372c79423699976Ajay Dudani * NO_ERROR -- success 4607ee407aa1024789089aad411c372c79423699976Ajay Dudani * none-zero failure code 4617ee407aa1024789089aad411c372c79423699976Ajay Dudani * 4627ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 4637ee407aa1024789089aad411c372c79423699976Ajay Dudaniint32_t QCamera3PostProcessor::processPPMetadata(mm_camera_super_buf_t *frame) 4647ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 4657ee407aa1024789089aad411c372c79423699976Ajay Dudani pthread_mutex_lock(&mReprocJobLock); 4667ee407aa1024789089aad411c372c79423699976Ajay Dudani // enqueue to metadata input queue 4677ee407aa1024789089aad411c372c79423699976Ajay Dudani m_inputMetaQ.enqueue((void *)frame); 4687ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!(m_inputPPQ.isEmpty())) { 469742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGI("%s: pp queue is not empty, do next job", __func__); 4707ee407aa1024789089aad411c372c79423699976Ajay Dudani m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 471d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 472742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGI("%s: pp queue is empty, not calling do next job", __func__); 4737ee407aa1024789089aad411c372c79423699976Ajay Dudani } 4747ee407aa1024789089aad411c372c79423699976Ajay Dudani pthread_mutex_unlock(&mReprocJobLock); 4757ee407aa1024789089aad411c372c79423699976Ajay Dudani return NO_ERROR; 4767ee407aa1024789089aad411c372c79423699976Ajay Dudani} 4777ee407aa1024789089aad411c372c79423699976Ajay Dudani 4787ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 47966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : processRawData 48066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 48166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: enqueue raw data into dataProc thread 48266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 48366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 48466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @frame : process frame received from mm-camera-interface 48566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 48666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 48766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 48866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 48966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 49066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::processRawData(mm_camera_super_buf_t *frame) 49166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 49266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // enqueu to raw input queue 49366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_inputRawQ.enqueue((void *)frame); 49466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 49566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 49666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 49766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 49866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 49966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : processPPData 50066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 50166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: process received frame after reprocess. 50266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 50366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 50466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @frame : received frame from reprocess channel. 50566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 50666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 50766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 50866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 50966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 51066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NOTE : The frame after reprocess need to send to jpeg encoding. 51166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 51266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::processPPData(mm_camera_super_buf_t *frame) 51366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 51466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_pp_data_t *job = (qcamera_pp_data_t *)m_ongoingPPQ.dequeue(); 51566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 51666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (job == NULL || job->src_frame == NULL) { 51766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Cannot find reprocess job", __func__); 51866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 51966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 52066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 52166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_jpeg_data_t *jpeg_job = 52266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (qcamera_jpeg_data_t *)malloc(sizeof(qcamera_jpeg_data_t)); 52366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (jpeg_job == NULL) { 52466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for jpeg job", __func__); 52566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_MEMORY; 52666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 52766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 52866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(jpeg_job, 0, sizeof(qcamera_jpeg_data_t)); 52966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpeg_job->src_frame = frame; 53066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpeg_job->src_reproc_frame = job->src_frame; 53166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 53266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // free pp job buf 53366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(job); 53466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 53566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // enqueu reprocessed frame to jpeg input queue 53666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_inputJpegQ.enqueue((void *)jpeg_job); 53766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 53866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // wait up data proc thread 53966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 54066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 54166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 54266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 54366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 54466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 54566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : findJpegJobByJobId 54666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 54766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: find a jpeg job from ongoing Jpeg queue by its job ID 54866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 54966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 55066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @jobId : job Id of the job 55166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 55266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : ptr to a jpeg job struct. NULL if not found. 55366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 55466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NOTE : Currently only one job is sending to mm-jpeg-interface for jpeg 55566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * encoding. Therefore simply dequeue from the ongoing Jpeg Queue 55666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * will serve the purpose to find the jpeg job. 55766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 55866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruqcamera_jpeg_data_t *QCamera3PostProcessor::findJpegJobByJobId(uint32_t jobId) 55966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 56066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_jpeg_data_t * job = NULL; 56166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (jobId == 0) { 56266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: not a valid jpeg jobId", __func__); 56366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NULL; 56466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 56566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 56666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // currely only one jpeg job ongoing, so simply dequeue the head 56766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru job = (qcamera_jpeg_data_t *)m_ongoingJpegQ.dequeue(); 56866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return job; 56966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 57066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 57166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 57266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : releasePPInputData 57366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 57466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: callback function to release post process input data node 57566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 57666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 57766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @data : ptr to post process input data 57866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @user_data : user data ptr (QCamera3Reprocessor) 57966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 58066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 58166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 58266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid QCamera3PostProcessor::releasePPInputData(void *data, void *user_data) 58366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 58466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3PostProcessor *pme = (QCamera3PostProcessor *)user_data; 58566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != pme) { 58666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseSuperBuf((mm_camera_super_buf_t *)data); 58766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 58866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 58966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 59066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 59166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : releaseJpegData 59266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 59366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: callback function to release jpeg job node 59466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 59566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 59666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @data : ptr to ongoing jpeg job data 59766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @user_data : user data ptr (QCamera3Reprocessor) 59866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 59966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 60066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 60166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid QCamera3PostProcessor::releaseJpegData(void *data, void *user_data) 60266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 60366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3PostProcessor *pme = (QCamera3PostProcessor *)user_data; 60466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != pme) { 60566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseJpegJobData((qcamera_jpeg_data_t *)data); 60666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 60766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 60866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 60966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 61066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : releaseOngoingPPData 61166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 61266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: callback function to release ongoing postprocess job node 61366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 61466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 61566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @data : ptr to onging postprocess job 61666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @user_data : user data ptr (QCamera3Reprocessor) 61766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 61866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 61966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 62066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid QCamera3PostProcessor::releaseOngoingPPData(void *data, void *user_data) 62166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 62266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3PostProcessor *pme = (QCamera3PostProcessor *)user_data; 62366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != pme) { 62466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_pp_data_t *pp_job = (qcamera_pp_data_t *)data; 62566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != pp_job->src_frame) { 62666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseSuperBuf(pp_job->src_frame); 62766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(pp_job->src_frame); 62866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pp_job->src_frame = NULL; 62966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 63066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 63166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 63266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 63366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 63466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : releaseSuperBuf 63566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 63666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: function to release a superbuf frame by returning back to kernel 63766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 63866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 63966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @super_buf : ptr to the superbuf frame 64066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 64166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 64266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 64366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid QCamera3PostProcessor::releaseSuperBuf(mm_camera_super_buf_t *super_buf) 64466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 64566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != super_buf) { 64666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_parent != NULL) { 64766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_parent->bufDone(super_buf); 64866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 64966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 65066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 65166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 65266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 65366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : releaseJpegJobData 65466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 65566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: function to release internal resources in jpeg job struct 65666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 65766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 65866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @job : ptr to jpeg job struct 65966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 66066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 66166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 66266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NOTE : original source frame need to be queued back to kernel for 66366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * future use. Output buf of jpeg job need to be released since 66466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * it's allocated for each job. Exif object need to be deleted. 66566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 66666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid QCamera3PostProcessor::releaseJpegJobData(qcamera_jpeg_data_t *job) 66766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 66866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGV("%s: E", __func__); 66966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != job) { 67066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != job->src_reproc_frame) { 67166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(job->src_reproc_frame); 67266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru job->src_reproc_frame = NULL; 67366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 67466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 67566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != job->src_frame) { 67666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(job->src_frame); 67766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru job->src_frame = NULL; 67866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 679c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 680c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (NULL != job->aux_frame) { 681c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang for(int i = 0; i < job->aux_frame->num_bufs; i++) { 682c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang memset(job->aux_frame->bufs[i], 0, sizeof(mm_camera_buf_def_t)); 683c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang free(job->aux_frame->bufs[i]); 684c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang job->aux_frame->bufs[i] = NULL; 685c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 686c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang memset(job->aux_frame, 0, sizeof(mm_camera_super_buf_t)); 687c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang free(job->aux_frame); 688c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang job->aux_frame = NULL; 689c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 690c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 69166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegMem = NULL; 69266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 69366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGV("%s: X", __func__); 69466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 69566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 69666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 69766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getColorfmtFromImgFmt 69866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 69966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: function to return jpeg color format based on its image format 70066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 70166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 70266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @img_fmt : image format 70366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 70466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : jpeg color format that can be understandable by omx lib 70566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 70666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurumm_jpeg_color_format QCamera3PostProcessor::getColorfmtFromImgFmt(cam_format_t img_fmt) 70766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 70866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru switch (img_fmt) { 70966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_NV21: 71066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 71166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_NV21_ADRENO: 71266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 71366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_NV12: 71466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2; 71566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_YV12: 71666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2; 71766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_422_NV61: 71866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1; 71966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_422_NV16: 72066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1; 72166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru default: 72266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 72366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 72466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 72566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 72666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 72766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getJpegImgTypeFromImgFmt 72866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 72966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: function to return jpeg encode image type based on its image format 73066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 73166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 73266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @img_fmt : image format 73366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 73466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : return jpeg source image format (YUV or Bitstream) 73566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 73666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurumm_jpeg_format_t QCamera3PostProcessor::getJpegImgTypeFromImgFmt(cam_format_t img_fmt) 73766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 73866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru switch (img_fmt) { 73966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_NV21: 74066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_NV21_ADRENO: 74166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_NV12: 74266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_420_YV12: 74366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_422_NV61: 74466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAM_FORMAT_YUV_422_NV16: 74566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_FMT_YUV; 74666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru default: 74766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return MM_JPEG_FMT_YUV; 74866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 74966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 75066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 75166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 75266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : encodeData 75366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 75466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: function to prepare encoding job information and send to 75566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * mm-jpeg-interface to do the encoding job 75666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 75766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 75866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @jpeg_job_data : ptr to a struct saving job related information 75966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @needNewSess : flag to indicate if a new jpeg encoding session need 76066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * to be created. After creation, this flag will be toggled 76166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 76266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 76366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 76466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 76566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 76666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PostProcessor::encodeData(qcamera_jpeg_data_t *jpeg_job_data, 7677a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani uint8_t &needNewSess, mm_camera_super_buf_t *p_metaFrame) 76866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 76966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGV("%s : E", __func__); 77066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t ret = NO_ERROR; 77166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_jpeg_job_t jpg_job; 77266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t jobId = 0; 77366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Stream *main_stream = NULL; 77466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_buf_def_t *main_frame = NULL; 77566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Stream *thumb_stream = NULL; 77666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_buf_def_t *thumb_frame = NULL; 777c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *srcChannel = NULL; 778c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_super_buf_t *recvd_frame = NULL; 779c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)m_parent->mUserData; 780c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 781c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if( jpeg_job_data-> aux_frame ) 782c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang recvd_frame = jpeg_job_data->aux_frame; 783c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang else 784c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang recvd_frame = jpeg_job_data->src_frame; 78566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 7867ee407aa1024789089aad411c372c79423699976Ajay Dudani 7877ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Channel *pChannel = NULL; 7887ee407aa1024789089aad411c372c79423699976Ajay Dudani // first check picture channel 7897ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_parent != NULL && 7907ee407aa1024789089aad411c372c79423699976Ajay Dudani m_parent->getMyHandle() == recvd_frame->ch_id) { 7917ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = m_parent; 7927ee407aa1024789089aad411c372c79423699976Ajay Dudani } 79366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // check reprocess channel if not found 79466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pChannel == NULL) { 7957ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_pReprocChannel != NULL && 7967ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pReprocChannel->getMyHandle() == recvd_frame->ch_id) { 7977ee407aa1024789089aad411c372c79423699976Ajay Dudani pChannel = m_pReprocChannel; 7987ee407aa1024789089aad411c372c79423699976Ajay Dudani } 7997ee407aa1024789089aad411c372c79423699976Ajay Dudani } 80066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 801c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel *auxChannel = jpeg_job_data->aux_channel; 802c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 803c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(auxChannel) 804c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang srcChannel = auxChannel; 805c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang else 806c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang srcChannel = pChannel; 807c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 808d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab if (srcChannel == NULL) { 809d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGE("%s: No corresponding channel (ch_id = %d) exist, return here", 810d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab __func__, recvd_frame->ch_id); 811d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab return BAD_VALUE; 812d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } 813d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 81466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // find snapshot frame and thumnail frame 81566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Note: In this version we will receive only snapshot frame. 81666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru for (int i = 0; i < recvd_frame->num_bufs; i++) { 817c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Stream *srcStream = 818c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang srcChannel->getStreamByHandle(recvd_frame->bufs[i]->stream_id); 819c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (srcStream != NULL) { 82034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy switch (srcStream->getMyType()) { 82134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy case CAM_STREAM_TYPE_SNAPSHOT: 82249542da1f1db437888282ee70a89e5c1a0b03947Mekala Natarajan case CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT: 82334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy case CAM_STREAM_TYPE_OFFLINE_PROC: 824c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang main_stream = srcStream; 82566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru main_frame = recvd_frame->bufs[i]; 82634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy break; 82734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy case CAM_STREAM_TYPE_PREVIEW: 82834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy case CAM_STREAM_TYPE_POSTVIEW: 829c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang thumb_stream = srcStream; 83066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru thumb_frame = recvd_frame->bufs[i]; 83134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy break; 83234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy default: 83334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy break; 83466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 83566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 83666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 83766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 83866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(NULL == main_frame){ 83966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s : Main frame is NULL", __func__); 84066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 84166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 84266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 84366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Memory *memObj = (QCamera3Memory *)main_frame->mem_info; 84466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL == memObj) { 84566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s : Memeory Obj of main frame is NULL", __func__); 84666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_MEMORY; 84766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 84866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 84966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // clean and invalidate cache ops through mem obj of the frame 85066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memObj->cleanInvalidateCache(main_frame->buf_idx); 85166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 85266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (thumb_frame != NULL) { 85366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Memory *thumb_memObj = (QCamera3Memory *)thumb_frame->mem_info; 85466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != thumb_memObj) { 85566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // clean and invalidate cache ops through mem obj of the frame 85666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru thumb_memObj->cleanInvalidateCache(thumb_frame->buf_idx); 85766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 85866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 85966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 86066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (mJpegClientHandle <= 0) { 86166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Error: bug here, mJpegClientHandle is 0", __func__); 86266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return UNKNOWN_ERROR; 86366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 86466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 865d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Need new session?:%d",__func__, needNewSess); 86666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (needNewSess) { 8679a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang //creating a new session, so we must destroy the old one 8689a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if ( 0 < mJpegSessionId ) { 8699a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ret = mJpegHandle.destroy_session(mJpegSessionId); 8709a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (ret != NO_ERROR) { 8719a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ALOGE("%s: Error destroying an old jpeg encoding session, id = %d", 8729a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang __func__, mJpegSessionId); 8739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang return ret; 8749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 8759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang mJpegSessionId = 0; 8769a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 87766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // create jpeg encoding session 87866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_jpeg_encode_params_t encodeParam; 87966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&encodeParam, 0, sizeof(mm_jpeg_encode_params_t)); 88066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 88166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru getJpegEncodingConfig(encodeParam, main_stream, thumb_stream); 882d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: #src bufs:%d # tmb bufs:%d #dst_bufs:%d", __func__, 883f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab encodeParam.num_src_bufs,encodeParam.num_tmb_bufs,encodeParam.num_dst_bufs); 88466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ret = mJpegHandle.create_session(mJpegClientHandle, &encodeParam, &mJpegSessionId); 88566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (ret != NO_ERROR) { 8869a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ALOGE("%s: Error creating a new jpeg encoding session, ret = %d", __func__, ret); 88766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return ret; 88866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 88966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru needNewSess = FALSE; 89066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 89166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 89266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // Fill in new job 89366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&jpg_job, 0, sizeof(mm_jpeg_job_t)); 89466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.job_type = JPEG_JOB_TYPE_ENCODE; 89566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.encode_job.session_id = mJpegSessionId; 89666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.encode_job.src_index = main_frame->buf_idx; 89766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.encode_job.dst_index = 0; 89866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 89966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_rect_t crop; 90066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&crop, 0, sizeof(cam_rect_t)); 90166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //TBD_later - Zoom event removed in stream 90266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //main_stream->getCropInfo(crop); 90366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 90466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_dimension_t src_dim; 90566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&src_dim, 0, sizeof(cam_dimension_t)); 90666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru main_stream->getFrameDimension(src_dim); 90766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 908c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang cam_dimension_t dst_dim; 909c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang memset(&dst_dim, 0, sizeof(cam_dimension_t)); 910c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan srcChannel->getStreamByIndex(0)->getFrameDimension(dst_dim); 911c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 91266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // main dim 91366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.encode_job.main_dim.src_dim = src_dim; 914c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang jpg_job.encode_job.main_dim.dst_dim = dst_dim; 91566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.encode_job.main_dim.crop = crop; 91666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 9171237194c260eaedcb6384c400b7add966e143c96Ajay Dudani // get exif data 9181237194c260eaedcb6384c400b7add966e143c96Ajay Dudani if (m_pJpegExifObj != NULL) { 9191237194c260eaedcb6384c400b7add966e143c96Ajay Dudani delete m_pJpegExifObj; 9201237194c260eaedcb6384c400b7add966e143c96Ajay Dudani m_pJpegExifObj = NULL; 9211237194c260eaedcb6384c400b7add966e143c96Ajay Dudani } 9221237194c260eaedcb6384c400b7add966e143c96Ajay Dudani m_pJpegExifObj = m_parent->getExifData(); 9231237194c260eaedcb6384c400b7add966e143c96Ajay Dudani if (m_pJpegExifObj != NULL) { 9241237194c260eaedcb6384c400b7add966e143c96Ajay Dudani jpg_job.encode_job.exif_info.exif_data = m_pJpegExifObj->getEntries(); 9251237194c260eaedcb6384c400b7add966e143c96Ajay Dudani jpg_job.encode_job.exif_info.numOfEntries = 9261237194c260eaedcb6384c400b7add966e143c96Ajay Dudani m_pJpegExifObj->getNumOfEntries(); 9271237194c260eaedcb6384c400b7add966e143c96Ajay Dudani } 92866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // thumbnail dim 929d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGD("%s: Thumbnail needed:%d",__func__, m_bThumbnailNeeded); 93066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_bThumbnailNeeded == TRUE) { 93166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (thumb_stream == NULL) { 93266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // need jpeg thumbnail, but no postview/preview stream exists 93366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // we use the main stream/frame to encode thumbnail 93466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru thumb_stream = main_stream; 93566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru thumb_frame = main_frame; 93666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 93766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(&crop, 0, sizeof(cam_rect_t)); 93866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //TBD_later - Zoom event removed in stream 93966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //thumb_stream->getCropInfo(crop); 94066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_parent->getThumbnailSize(jpg_job.encode_job.thumb_dim.dst_dim); 941cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani if (!hal_obj->needRotationReprocess()) { 942cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani memset(&src_dim, 0, sizeof(cam_dimension_t)); 943cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani thumb_stream->getFrameDimension(src_dim); 944cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani jpg_job.encode_job.rotation = m_parent->getJpegRotation(); 945cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani ALOGD("%s: jpeg rotation is set to %d", __func__, jpg_job.encode_job.rotation); 946cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani } else { 947cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani //swap the thumbnail destination width and height if it has already been rotated 948cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani int temp = jpg_job.encode_job.thumb_dim.dst_dim.width; 949cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani jpg_job.encode_job.thumb_dim.dst_dim.width = jpg_job.encode_job.thumb_dim.dst_dim.height; 950cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani jpg_job.encode_job.thumb_dim.dst_dim.height = temp; 951cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani } 952cff7dec6ff5025ebab7dae0465524d3d2fc3496bAjay Dudani jpg_job.encode_job.thumb_dim.src_dim = src_dim; 95366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.encode_job.thumb_dim.crop = crop; 95466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpg_job.encode_job.thumb_index = thumb_frame->buf_idx; 95566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 95666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // Find meta data frame. Meta data frame contains additional exif info 95766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // which will be extracted and filled in by encoder. 95866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Note: In this version meta data will be null 95966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //as we don't support bundling of snapshot and metadata streams. 96066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 96166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_buf_def_t *meta_frame = NULL; 962c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(jpeg_job_data->src_frame) { 963c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang for (int i = 0; i < jpeg_job_data->src_frame->num_bufs; i++) { 964c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang // look through input superbuf 965c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (jpeg_job_data->src_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 966c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang meta_frame = jpeg_job_data->src_frame->bufs[i]; 967c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang break; 968c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 96966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 97066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 97166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (meta_frame == NULL && jpeg_job_data->src_reproc_frame != NULL) { 97266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // look through reprocess source superbuf 97366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru for (int i = 0; i < jpeg_job_data->src_reproc_frame->num_bufs; i++) { 97466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (jpeg_job_data->src_reproc_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 97566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru meta_frame = jpeg_job_data->src_reproc_frame->bufs[i]; 97666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 97766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 97866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 97966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 98066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (meta_frame != NULL) { 98166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // fill in meta data frame ptr 9827a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani jpg_job.encode_job.p_metadata_v1 = (cam_metadata_info_t *)meta_frame->buffer; 9837a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani } else if (p_metaFrame != NULL) { 9847a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani //Fill in the metadata passed as parameter 9857a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani jpg_job.encode_job.p_metadata_v3 = (metadata_buffer_t *)p_metaFrame->bufs[0]->buffer;; 9867a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani } else { 9877a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani ALOGE("%s: Metadata is null", __func__); 98866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 9897a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani //Not required here 9901237194c260eaedcb6384c400b7add966e143c96Ajay Dudani //jpg_job.encode_job.cam_exif_params = m_parent->mExifParams; 99166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Start jpeg encoding 99266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ret = mJpegHandle.start_job(&jpg_job, &jobId); 99366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (ret == NO_ERROR) { 99466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // remember job info 99566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpeg_job_data->jobId = jobId; 99666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 99766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 998d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s : X", __func__); 99966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return ret; 100066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 100166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 100266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 100366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : dataProcessRoutine 100466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 100566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: data process routine that handles input data either from input 100666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * Jpeg Queue to do jpeg encoding, or from input PP Queue to do 100766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * reprocess. 100866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 100966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 101066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @data : user data ptr (QCamera3PostProcessor) 101166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 101266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 101366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 101466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid *QCamera3PostProcessor::dataProcessRoutine(void *data) 101566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 101666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int running = 1; 101766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int ret; 101866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint8_t is_active = FALSE; 101966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint8_t needNewSess = TRUE; 10207a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani mm_camera_super_buf_t *pp_frame = NULL; 10217a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani mm_camera_super_buf_t *meta_frame = NULL; 1022d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E", __func__); 102366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3PostProcessor *pme = (QCamera3PostProcessor *)data; 102466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCameraCmdThread *cmdThread = &pme->m_dataProcTh; 10256a225c824c49ff9ecdc4b67c802f1af272569e03Mansoor Aftab cmdThread->setName("cam_data_proc"); 102666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 102766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru do { 102866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru do { 102966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ret = cam_sem_wait(&cmdThread->cmd_sem); 103066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (ret != 0 && errno != EINVAL) { 103166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: cam_sem_wait error (%s)", 103266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru __func__, strerror(errno)); 103366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NULL; 103466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 103566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } while (ret != 0); 103666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 103766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // we got notified about new cmd avail in cmd queue 103866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru camera_cmd_type_t cmd = cmdThread->getCmd(); 103966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru switch (cmd) { 104066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAMERA_CMD_TYPE_START_DATA_PROC: 104166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGD("%s: start data proc", __func__); 104266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru is_active = TRUE; 104366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru needNewSess = TRUE; 104466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 104566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAMERA_CMD_TYPE_STOP_DATA_PROC: 104666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 104766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGD("%s: stop data proc", __func__); 104866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru is_active = FALSE; 104966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 105066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // cancel all ongoing jpeg jobs 105166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_jpeg_data_t *jpeg_job = 105266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (qcamera_jpeg_data_t *)pme->m_ongoingJpegQ.dequeue(); 105366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru while (jpeg_job != NULL) { 105466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->mJpegHandle.abort_job(jpeg_job->jobId); 105566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 105666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseJpegJobData(jpeg_job); 105766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(jpeg_job); 105866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 105966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpeg_job = (qcamera_jpeg_data_t *)pme->m_ongoingJpegQ.dequeue(); 106066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 106166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 106266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // destroy jpeg encoding session 106366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if ( 0 < pme->mJpegSessionId ) { 106466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->mJpegHandle.destroy_session(pme->mJpegSessionId); 106566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->mJpegSessionId = 0; 106666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 106766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 106866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // free jpeg exif obj 106966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pme->m_pJpegExifObj != NULL) { 107066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru delete pme->m_pJpegExifObj; 107166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->m_pJpegExifObj = NULL; 107266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 107366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru needNewSess = TRUE; 107466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 107566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // flush ongoing postproc Queue 107666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->m_ongoingPPQ.flush(); 107766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 107866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // flush input jpeg Queue 107966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->m_inputJpegQ.flush(); 108066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 108166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // flush input Postproc Queue 108266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->m_inputPPQ.flush(); 108366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 108466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // flush input raw Queue 108566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->m_inputRawQ.flush(); 108666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 10877ee407aa1024789089aad411c372c79423699976Ajay Dudani pme->m_inputMetaQ.flush(); 10887ee407aa1024789089aad411c372c79423699976Ajay Dudani 108966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // signal cmd is completed 109066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_sem_post(&cmdThread->sync_sem); 109166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 109266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 109366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAMERA_CMD_TYPE_DO_NEXT_JOB: 109466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 109566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGD("%s: Do next job, active is %d", __func__, is_active); 109666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (is_active == TRUE) { 109766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // check if there is any ongoing jpeg jobs 109866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pme->m_ongoingJpegQ.isEmpty()) { 1099742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGI("%s: ongoing jpeg queue is empty so doing the jpeg job", __func__); 110066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // no ongoing jpeg job, we are fine to send jpeg encoding job 110166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_jpeg_data_t *jpeg_job = 110266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (qcamera_jpeg_data_t *)pme->m_inputJpegQ.dequeue(); 110366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 110466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != jpeg_job) { 110566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //TBD_later - play shutter sound 110666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //pme->m_parent->playShutter(); 110766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 110866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // add into ongoing jpeg job Q 110966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->m_ongoingJpegQ.enqueue((void *)jpeg_job); 11107a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani ret = pme->encodeData(jpeg_job, needNewSess, meta_frame); 111166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NO_ERROR != ret) { 111266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // dequeue the last one 111366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->m_ongoingJpegQ.dequeue(false); 111466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 111566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseJpegJobData(jpeg_job); 111666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(jpeg_job); 111766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 111866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 111966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 1120742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGD("%s: dequeuing pp frame", __func__); 11217a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani pp_frame = 112266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue(); 112366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != pp_frame) { 11247ee407aa1024789089aad411c372c79423699976Ajay Dudani meta_frame = 11257ee407aa1024789089aad411c372c79423699976Ajay Dudani (mm_camera_super_buf_t *)pme->m_inputMetaQ.dequeue(); 11267ee407aa1024789089aad411c372c79423699976Ajay Dudani if (meta_frame == NULL) { 11277ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: did not get a corresponding metadata", __func__); 11287ee407aa1024789089aad411c372c79423699976Ajay Dudani } 11297ee407aa1024789089aad411c372c79423699976Ajay Dudani // meta_frame != NULL 113066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_pp_data_t *pp_job = 113166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (qcamera_pp_data_t *)malloc(sizeof(qcamera_pp_data_t)); 113266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pp_job != NULL) { 113366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(pp_job, 0, sizeof(qcamera_pp_data_t)); 11347ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pme->m_pReprocChannel != NULL) { 11357ee407aa1024789089aad411c372c79423699976Ajay Dudani // add into ongoing PP job Q 11367ee407aa1024789089aad411c372c79423699976Ajay Dudani pp_job->src_frame = pp_frame; 11377ee407aa1024789089aad411c372c79423699976Ajay Dudani pme->m_ongoingPPQ.enqueue((void *)pp_job); 11387ee407aa1024789089aad411c372c79423699976Ajay Dudani ret = pme->m_pReprocChannel->doReprocess(pp_frame, meta_frame); 11397ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NO_ERROR != ret) { 11407ee407aa1024789089aad411c372c79423699976Ajay Dudani // remove from ongoing PP job Q 11417ee407aa1024789089aad411c372c79423699976Ajay Dudani pme->m_ongoingPPQ.dequeue(false); 11427ee407aa1024789089aad411c372c79423699976Ajay Dudani } 11437ee407aa1024789089aad411c372c79423699976Ajay Dudani } else { 11447ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: Reprocess channel is NULL", __func__); 11457ee407aa1024789089aad411c372c79423699976Ajay Dudani ret = -1; 11467ee407aa1024789089aad411c372c79423699976Ajay Dudani } 114766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 114866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: no mem for qcamera_pp_data_t", __func__); 114966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ret = -1; 115066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 115166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 115266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (0 != ret) { 115366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // free pp_job 115466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pp_job != NULL) { 115566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(pp_job); 115666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 115766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // free frame 115866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (pp_frame != NULL) { 115966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseSuperBuf(pp_frame); 116066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(pp_frame); 116166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 116266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 116366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 116466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 116566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // not active, simply return buf and do no op 116666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_camera_super_buf_t *super_buf = 116766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (mm_camera_super_buf_t *)pme->m_inputJpegQ.dequeue(); 116866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != super_buf) { 116966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseSuperBuf(super_buf); 117066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(super_buf); 117166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 117266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru super_buf = (mm_camera_super_buf_t *)pme->m_inputRawQ.dequeue(); 117366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != super_buf) { 117466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseSuperBuf(super_buf); 117566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(super_buf); 117666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 117766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru super_buf = (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue(); 117866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL != super_buf) { 117966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru pme->releaseSuperBuf(super_buf); 118066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(super_buf); 118166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 11827ee407aa1024789089aad411c372c79423699976Ajay Dudani super_buf = (mm_camera_super_buf_t *)pme->m_inputMetaQ.dequeue(); 11837ee407aa1024789089aad411c372c79423699976Ajay Dudani if (NULL != super_buf) { 11847ee407aa1024789089aad411c372c79423699976Ajay Dudani pme->releaseSuperBuf(super_buf); 11857ee407aa1024789089aad411c372c79423699976Ajay Dudani free(super_buf); 11867ee407aa1024789089aad411c372c79423699976Ajay Dudani } 118766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 118866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 118966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 119066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case CAMERA_CMD_TYPE_EXIT: 119166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru running = 0; 119266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 119366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru default: 119466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 119566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 119666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } while (running); 1197d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X", __func__); 119866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NULL; 119966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 120066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 120166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 120266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : QCamera3Exif 120366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 120466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: constructor of QCamera3Exif 120566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 120666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : None 120766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 120866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 120966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 121066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva RajguruQCamera3Exif::QCamera3Exif() 121166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru : m_nNumEntries(0) 121266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 121366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(m_Entries, 0, sizeof(m_Entries)); 121466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 121566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 121666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 121766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : ~QCamera3Exif 121866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 121966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: deconstructor of QCamera3Exif. Will release internal memory ptr. 122066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 122166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : None 122266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 122366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : None 122466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 122566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva RajguruQCamera3Exif::~QCamera3Exif() 122666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 122766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru for (uint32_t i = 0; i < m_nNumEntries; i++) { 122866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru switch (m_Entries[i].tag_entry.type) { 122966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_BYTE: 123066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 123166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.count > 1 && 123266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._bytes != NULL) { 123366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._bytes); 123466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._bytes = NULL; 123566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 123666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 123766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 123866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_ASCII: 123966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 124066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.data._ascii != NULL) { 124166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._ascii); 124266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._ascii = NULL; 124366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 124466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 124566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 124666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_SHORT: 124766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 124866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.count > 1 && 124966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._shorts != NULL) { 125066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._shorts); 125166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._shorts = NULL; 125266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 125366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 125466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 125566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_LONG: 125666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 125766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.count > 1 && 125866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._longs != NULL) { 125966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._longs); 126066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._longs = NULL; 126166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 126266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 126366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 126466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_RATIONAL: 126566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 126666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.count > 1 && 126766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._rats != NULL) { 126866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._rats); 126966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._rats = NULL; 127066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 127166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 127266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 127366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_UNDEFINED: 127466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 127566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.data._undefined != NULL) { 127666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._undefined); 127766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._undefined = NULL; 127866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 127966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 128066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 128166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_SLONG: 128266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 128366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.count > 1 && 128466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._slongs != NULL) { 128566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._slongs); 128666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._slongs = NULL; 128766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 128866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 128966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 129066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_SRATIONAL: 129166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 129266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (m_Entries[i].tag_entry.count > 1 && 129366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._srats != NULL) { 129466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(m_Entries[i].tag_entry.data._srats); 129566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[i].tag_entry.data._srats = NULL; 129666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 129766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 129866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 129966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru default: 130066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Error, Unknown type",__func__); 130166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 130266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 130366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 130466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 130566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 130666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 130766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : addEntry 130866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 130966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: function to add an entry to exif data 131066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 131166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 131266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @tagid : exif tag ID 131366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @type : data type 131466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @count : number of data in uint of its type 131566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @data : input data ptr 131666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 131766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 131866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 131966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 132066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 132166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3Exif::addEntry(exif_tag_id_t tagid, 132266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru exif_tag_type_t type, 132366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t count, 132466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru void *data) 132566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 132666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t rc = NO_ERROR; 132766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(m_nNumEntries >= MAX_EXIF_TABLE_ENTRIES) { 132866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Number of entries exceeded limit", __func__); 132966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_MEMORY; 133066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 133166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 133266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_id = tagid; 133366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.type = type; 133466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.count = count; 133566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.copy = 1; 133666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru switch (type) { 133766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_BYTE: 133866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 133966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (count > 1) { 134066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint8_t *values = (uint8_t *)malloc(count); 134166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (values == NULL) { 134266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for byte array", __func__); 134366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 134466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 134566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(values, data, count); 134666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._bytes = values; 134766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 134866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 134966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._byte = 135066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *(uint8_t *)data; 135166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 135266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 135366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 135466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_ASCII: 135566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 135666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char *str = NULL; 135766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru str = (char *)malloc(count + 1); 135866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (str == NULL) { 135966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for ascii string", __func__); 136066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 136166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 136266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(str, 0, count + 1); 136366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(str, data, count); 136466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._ascii = str; 136566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 136666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 136766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 136866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_SHORT: 136966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 137066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (count > 1) { 137166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint16_t *values = 137266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (uint16_t *)malloc(count * sizeof(uint16_t)); 137366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (values == NULL) { 137466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for short array", __func__); 137566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 137666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 137766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(values, data, count * sizeof(uint16_t)); 137866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._shorts =values; 137966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 138066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 138166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._short = 138266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *(uint16_t *)data; 138366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 138466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 138566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 138666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_LONG: 138766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 138866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (count > 1) { 138966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t *values = 139066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (uint32_t *)malloc(count * sizeof(uint32_t)); 139166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (values == NULL) { 139266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for long array", __func__); 139366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 139466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 139566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(values, data, count * sizeof(uint32_t)); 139666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._longs = values; 139766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 139866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 139966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._long = 140066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *(uint32_t *)data; 140166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 140266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 140366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 140466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_RATIONAL: 140566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 140666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (count > 1) { 140766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rat_t *values = (rat_t *)malloc(count * sizeof(rat_t)); 140866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (values == NULL) { 140966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for rational array", __func__); 141066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 141166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 141266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(values, data, count * sizeof(rat_t)); 141366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._rats = values; 141466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 141566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 141666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._rat = 141766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *(rat_t *)data; 141866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 141966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 142066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 142166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_UNDEFINED: 142266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 142366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint8_t *values = (uint8_t *)malloc(count); 142466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (values == NULL) { 142566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for undefined array", __func__); 142666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 142766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 142866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(values, data, count); 142966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._undefined = values; 143066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 143166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 143266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 143366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_SLONG: 143466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 143566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (count > 1) { 143666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t *values = 143766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (int32_t *)malloc(count * sizeof(int32_t)); 143866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (values == NULL) { 143966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for signed long array", __func__); 144066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 144166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 144266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(values, data, count * sizeof(int32_t)); 144366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._slongs =values; 144466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 144566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 144666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._slong = 144766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *(int32_t *)data; 144866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 144966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 145066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 145166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru case EXIF_SRATIONAL: 145266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 145366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (count > 1) { 145466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru srat_t *values = (srat_t *)malloc(count * sizeof(srat_t)); 145566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (values == NULL) { 145666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for sign rational array",__func__); 145766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = NO_MEMORY; 145866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 145966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(values, data, count * sizeof(srat_t)); 146066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._srats = values; 146166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 146266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 146366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_Entries[m_nNumEntries].tag_entry.data._srat = 146466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *(srat_t *)data; 146566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 146666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 146766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 146866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru default: 146966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Error, Unknown type",__func__); 147066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru break; 147166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 147266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 147366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // Increase number of entries 147466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru m_nNumEntries++; 147566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 147666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 147766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 147866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru}; // namespace qcamera 1479