166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QCameraPostProc" 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <fcntl.h> 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdio.h> 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h> 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h> 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2HWI.h" 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraPostProc.h" 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraTrace.h" 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" { 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera { 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinconst char *QCameraPostProcessor::STORE_LOCATION = "/sdcard/img_%d.jpg"; 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define FREE_JPEG_OUTPUT_BUFFER(ptr,cnt) \ 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int jpeg_bufs; \ 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (jpeg_bufs = 0; jpeg_bufs < (int)cnt; jpeg_bufs++) { \ 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ptr[jpeg_bufs] != NULL) { \ 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(ptr[jpeg_bufs]); \ 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ptr[jpeg_bufs] = NULL; \ 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } \ 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraPostProcessor 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraPostProcessor. 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_ctrl : ptr to HWI object 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPostProcessor::QCameraPostProcessor(QCamera2HardwareInterface *cam_ctrl) 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin : m_parent(cam_ctrl), 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCB(NULL), 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegUserData(NULL), 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle(0), 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegSessionId(0), 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pJpegExifObj(NULL), 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bThumbnailNeeded(TRUE), 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannelCount(0), 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bInited(FALSE), 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_inputPPQ(releaseOngoingPPData, this), 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_ongoingPPQ(releaseOngoingPPData, this), 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_inputJpegQ(releaseJpegData, this), 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_ongoingJpegQ(releaseJpegData, this), 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_inputRawQ(releaseRawData, this), 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mSaveFrmCnt(0), 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mUseSaveProc(false), 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mUseJpegBurst(false), 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegMemOpt(true), 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_JpegOutputMemCount(0), 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNewJpegSessionNeeded(true), 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bufCountPPQ(0), 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_PPindex(0) 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mJpegHandle, 0, sizeof(mJpegHandle)); 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&mJpegMpoHandle, 0, sizeof(mJpegMpoHandle)); 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&m_pJpegOutputMem, 0, sizeof(m_pJpegOutputMem)); 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(mPPChannels, 0, sizeof(mPPChannels)); 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem = NULL; 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOfflineDataBufs = NULL; 100c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch pthread_mutex_init(&m_reprocess_lock,NULL); 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraPostProcessor 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deconstructor of QCameraPostProcessor. 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPostProcessor::~QCameraPostProcessor() 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin FREE_JPEG_OUTPUT_BUFFER(m_pJpegOutputMem,m_JpegOutputMemCount); 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_pJpegExifObj != NULL) { 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete m_pJpegExifObj; 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pJpegExifObj = NULL; 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = mPPChannels[i]; 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( pChannel != NULL ) { 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->stop(); 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = NULL; 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannelCount = 0; 128c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch pthread_mutex_destroy(&m_reprocess_lock); 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setJpegHandle 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set JPEG client handles 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pJpegHandle : JPEG ops handle 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pJpegMpoHandle : MPO JPEG ops handle 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @clientHandle : JPEG client handle 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::setJpegHandle(mm_jpeg_ops_t *pJpegHandle, 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_mpo_ops_t *pJpegMpoHandle, uint32_t clientHandle) 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E mJpegClientHandle: %d, clientHandle: %d", 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle, clientHandle); 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pJpegHandle) { 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(&mJpegHandle, pJpegHandle, sizeof(mm_jpeg_ops_t)); 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(pJpegMpoHandle) { 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(&mJpegMpoHandle, pJpegMpoHandle, sizeof(mm_jpeg_mpo_ops_t)); 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle = clientHandle; 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X mJpegClientHandle: %d, clientHandle: %d", 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegClientHandle, clientHandle); 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : init 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: initialization of postprocessor 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jpeg_cb : callback to handle jpeg event from mm-camera-interface 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : user data ptr for jpeg callback 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::init(jpeg_encode_callback_t jpeg_cb, void *user_data) 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegCB = jpeg_cb; 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mJpegUserData = user_data; 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.launch(dataProcessRoutine, this); 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_saveProcTh.launch(dataSaveRoutine, this); 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.setReprocCount(); 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bInited = TRUE; 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : deinit 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: de-initialization of postprocessor 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::deinit() 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == TRUE) { 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.exit(); 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_saveProcTh.exit(); 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bInited = FALSE; 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : start 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start postprocessor. Data process thread and data notify thread 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * will be launched. 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pSrcChannel : source channel obj ptr that possibly needs reprocess 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : if any reprocess is needed, a reprocess channel/stream 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * will be started. 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::start(QCameraChannel *pSrcChannel) 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pInputChannel = pSrcChannel; 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E "); 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == FALSE) { 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("postproc not initialized yet"); 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_DataMem != NULL) { 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem->release(m_DataMem); 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem = NULL; 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pInputChannel == NULL) { 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Input Channel for pproc is NULL."); 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( m_parent->needReprocess() ) { 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Delete previous reproc channel 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraReprocessChannel *pChannel = mPPChannels[i]; 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel != NULL) { 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->stop(); 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = NULL; 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannelCount = 0; 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bufCountPPQ = 0; 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_parent->isLongshotEnabled()) { 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.setReprocCount(); 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->mParameters.getManualCaptureMode() >= 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_MANUAL_CAPTURE_TYPE_3) { 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannelCount = m_parent->mParameters.getReprocCount() - 1; 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannelCount = m_parent->mParameters.getReprocCount(); 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Create all reproc channels and start channel 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannels[i] = m_parent->addReprocChannel(pInputChannel, i); 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPPChannels[i] == NULL) { 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot add multi reprocess channel i = %d", i); 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mPPChannels[i]->start(); 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != 0) { 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot start multi reprocess channel i = %d", i); 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete mPPChannels[i]; 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannels[i] = NULL; 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pInputChannel = static_cast<QCameraChannel *>(mPPChannels[i]); 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.longshot.save", prop, "0"); 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mUseSaveProc = atoi(prop) > 0 ? true : false; 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_PPindex = 0; 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_InputMetadata.clear(); 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, TRUE, FALSE); 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->m_cbNotifier.startSnapshots(); 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X rc = %d", rc); 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stop 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop postprocessor. Data process and notify thread will be stopped. 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : reprocess channel will be stopped and deleted if there is any 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::stop() 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == TRUE) { 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->m_cbNotifier.stopSnapshots(); 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_DataMem != NULL) { 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem->release(m_DataMem); 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem = NULL; 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // dataProc Thread need to process "stop" as sync call because abort jpeg job should be a sync call 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, TRUE, TRUE); 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // stop reproc channel if exists 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraReprocessChannel *pChannel = mPPChannels[i]; 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel != NULL) { 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->stop(); 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pChannel; 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = NULL; 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannelCount = 0; 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_PPindex = 0; 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_InputMetadata.clear(); 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mOfflineDataBufs != NULL) { 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOfflineDataBufs->deallocate(); 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete mOfflineDataBufs; 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOfflineDataBufs = NULL; 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : createJpegSession 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start JPEG session in parallel to reproces to reduce the KPI 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pSrcChannel : source channel obj ptr that possibly needs reprocess 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::createJpegSession(QCameraChannel *pSrcChannel) 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E "); 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == FALSE) { 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("postproc not initialized yet"); 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pSrcChannel == NULL) { 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Input Channel for pproc is NULL."); 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 374d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (mPPChannelCount > 0) { 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ppChannel_idx = mPPChannelCount - 1; 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_parent->needReprocess() ? mPPChannels[ppChannel_idx] : 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pSrcChannel; 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pSnapshotStream = NULL; 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pThumbStream = NULL; 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool thumb_stream_needed = ((!m_parent->isZSLMode() || 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_parent->mParameters.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT) == 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getFlipMode(CAM_STREAM_TYPE_PREVIEW))) && 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !m_parent->mParameters.generateThumbFromMain()); 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Input Channel for pproc is NULL for index %d.", 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppChannel_idx); 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < pChannel->getNumOfStreams(); ++i) { 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = pChannel->getStreamByIndex(i); 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == pStream ) { 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pSnapshotStream = pStream; 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((thumb_stream_needed) && 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) || 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW))) { 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pThumbStream = pStream; 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // If thumbnail is not part of the reprocess channel, then 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // try to get it from the source channel 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((thumb_stream_needed) && (NULL == pThumbStream) && 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pChannel == mPPChannels[ppChannel_idx])) { 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < pSrcChannel->getNumOfStreams(); ++i) { 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = pSrcChannel->getStreamByIndex(i); 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == pStream ) { 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW)) { 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pThumbStream = pStream; 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL != pSnapshotStream ) { 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_encode_params_t encodeParam; 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&encodeParam, 0, sizeof(mm_jpeg_encode_params_t)); 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = getJpegEncodingConfig(encodeParam, pSnapshotStream, pThumbStream); 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("error getting encoding config"); 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : call jpeg create_session"); 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mJpegHandle.create_session(mJpegClientHandle, 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &encodeParam, 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &mJpegSessionId); 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("error creating a new jpeg encoding session"); 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mNewJpegSessionNeeded = false; 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X "); 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getJpegEncodingConfig 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to prepare encoding job information 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @encode_parm : param to be filled with encoding configuration 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm, 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *main_stream, 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *thumb_stream) 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t out_size; 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char prop[PROPERTY_VALUE_MAX]; 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.jpeg_burst", prop, "0"); 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mUseJpegBurst = (atoi(prop) > 0) && !mUseSaveProc; 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.burst_mode = mUseJpegBurst; 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_rect_t crop; 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&crop, 0, sizeof(cam_rect_t)); 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getCropInfo(crop); 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t src_dim, dst_dim; 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&src_dim, 0, sizeof(cam_dimension_t)); 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&dst_dim, 0, sizeof(cam_dimension_t)); 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getFrameDimension(src_dim); 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool hdr_output_crop = m_parent->mParameters.isHDROutputCropEnabled(); 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hdr_output_crop && crop.height) { 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.height = crop.height; 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.height = src_dim.height; 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hdr_output_crop && crop.width) { 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.width = crop.width; 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.width = src_dim.width; 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // set rotation only when no online rotation or offline pp rotation is done before 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_parent->needRotationReprocess()) { 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.rotation = m_parent->mParameters.getJpegRotation(); 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.main_dim.src_dim = src_dim; 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.main_dim.dst_dim = dst_dim; 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dst_dim = dst_dim; 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.jpeg_cb = mJpegCB; 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.userdata = mJpegUserData; 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bThumbnailNeeded = TRUE; // need encode thumbnail by default 51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // system property to disable the thumbnail encoding in order to reduce the power 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // by default thumbnail encoding is set to TRUE and explicitly set this property to 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // disable the thumbnail encoding 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin property_get("persist.camera.tn.disable", prop, "0"); 52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (atoi(prop) == 1) { 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bThumbnailNeeded = FALSE; 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("m_bThumbnailNeeded is %d", m_bThumbnailNeeded); 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t thumbnailSize; 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&thumbnailSize, 0, sizeof(cam_dimension_t)); 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->getThumbnailSize(thumbnailSize); 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumbnailSize.width == 0 || thumbnailSize.height == 0) { 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // (0,0) means no thumbnail 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bThumbnailNeeded = FALSE; 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.encode_thumbnail = m_bThumbnailNeeded; 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // get color format 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t img_fmt = CAM_FORMAT_YUV_420_NV12; 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getFormat(img_fmt); 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.color_format = getColorfmtFromImgFmt(img_fmt); 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // get jpeg quality 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t val = m_parent->getJpegQuality(); 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0U < val) { 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.quality = val; 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Using default JPEG quality"); 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.quality = 85; 54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t main_offset; 54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&main_offset, 0, sizeof(cam_frame_len_offset_t)); 54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getFrameOffset(main_offset); 55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // src buf config 55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *pStreamMem = main_stream->getStreamBufs(); 55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStreamMem == NULL) { 55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot get stream bufs from main stream"); 55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = BAD_VALUE; 55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto on_error; 55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.num_src_bufs = pStreamMem->getCnt(); 55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < encode_parm.num_src_bufs; i++) { 56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *stream_mem = pStreamMem->getMemory(i, false); 56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream_mem != NULL) { 56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_main_buf[i].index = i; 56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_main_buf[i].buf_size = stream_mem->size; 56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_main_buf[i].buf_vaddr = (uint8_t *)stream_mem->data; 56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_main_buf[i].fd = pStreamMem->getFd(i); 56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_main_buf[i].format = MM_JPEG_FMT_YUV; 56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_main_buf[i].offset = main_offset; 56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Src Buffer cnt = %d, res = %dX%d len = %d rot = %d " 57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "src_dim = %dX%d dst_dim = %dX%d", 57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.num_src_bufs, 57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_offset.mp[0].width, main_offset.mp[0].height, 57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_offset.frame_len, encode_parm.rotation, 57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin src_dim.width, src_dim.height, 57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.width, dst_dim.height); 57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bThumbnailNeeded == TRUE) { 57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->getThumbnailSize(encode_parm.thumb_dim.dst_dim); 58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_stream == NULL) { 58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream = main_stream; 58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (((90 == m_parent->mParameters.getJpegRotation()) 58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (270 == m_parent->mParameters.getJpegRotation())) 58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (m_parent->needRotationReprocess())) { 58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // swap thumbnail dimensions 58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t tmp_dim = encode_parm.thumb_dim.dst_dim; 58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.dst_dim.width = tmp_dim.height; 59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.dst_dim.height = tmp_dim.width; 59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStreamMem = thumb_stream->getStreamBufs(); 59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStreamMem == NULL) { 59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cannot get stream bufs from thumb stream"); 59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = BAD_VALUE; 59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto on_error; 59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t thumb_offset; 59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&thumb_offset, 0, sizeof(cam_frame_len_offset_t)); 60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream->getFrameOffset(thumb_offset); 60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.num_tmb_bufs = pStreamMem->getCnt(); 60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < pStreamMem->getCnt(); i++) { 60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *stream_mem = pStreamMem->getMemory(i, false); 60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (stream_mem != NULL) { 60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_thumb_buf[i].index = i; 60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_thumb_buf[i].buf_size = stream_mem->size; 60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_thumb_buf[i].buf_vaddr = (uint8_t *)stream_mem->data; 60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_thumb_buf[i].fd = pStreamMem->getFd(i); 60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_thumb_buf[i].format = MM_JPEG_FMT_YUV; 61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.src_thumb_buf[i].offset = thumb_offset; 61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t img_fmt_thumb = CAM_FORMAT_YUV_420_NV12; 61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream->getFormat(img_fmt_thumb); 61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_color_format = getColorfmtFromImgFmt(img_fmt_thumb); 61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // crop is the same if frame is the same 61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_stream != main_stream) { 61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&crop, 0, sizeof(cam_rect_t)); 62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream->getCropInfo(crop); 62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&src_dim, 0, sizeof(cam_dimension_t)); 62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream->getFrameDimension(src_dim); 62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.src_dim = src_dim; 62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_parent->needRotationReprocess()) { 62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_rotation = m_parent->mParameters.getJpegRotation(); 62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.crop = crop; 63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_from_postview = 63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !m_parent->mParameters.generateThumbFromMain() && 63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (img_fmt_thumb != CAM_FORMAT_YUV_420_NV12_UBWC) && 63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_parent->mParameters.useJpegExifRotation() || 63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getJpegRotation() == 0); 63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Src THUMB buf_cnt = %d, res = %dX%d len = %d rot = %d " 63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "src_dim = %dX%d, dst_dim = %dX%d", 63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.num_tmb_bufs, 63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_offset.mp[0].width, thumb_offset.mp[0].height, 64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_offset.frame_len, encode_parm.thumb_rotation, 64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.src_dim.width, 64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.src_dim.height, 64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.dst_dim.width, 64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.thumb_dim.dst_dim.height); 64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 647d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (m_parent->mParameters.useJpegExifRotation()){ 648d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch encode_parm.thumb_rotation = m_parent->mParameters.getJpegExifRotation(); 649d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 650d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.num_dst_bufs = 1; 65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mUseJpegBurst) { 65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.num_dst_bufs = MAX_JPEG_BURST; 65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.get_memory = NULL; 65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin out_size = main_offset.frame_len; 65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mJpegMemOpt) { 65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.get_memory = getJpegMemory; 65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.put_memory = releaseJpegMemory; 66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin out_size = sizeof(omx_jpeg_ouput_buf_t); 66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.num_dst_bufs = encode_parm.num_src_bufs; 66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_JpegOutputMemCount = (uint32_t)encode_parm.num_dst_bufs; 66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < m_JpegOutputMemCount; i++) { 66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_pJpegOutputMem[i] != NULL) 66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_pJpegOutputMem[i]); 66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin omx_jpeg_ouput_buf_t omx_out_buf; 668d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch memset(&omx_out_buf, 0, sizeof(omx_jpeg_ouput_buf_t)); 66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin omx_out_buf.handle = this; 67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // allocate output buf for jpeg encoding 67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pJpegOutputMem[i] = malloc(out_size); 67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == m_pJpegOutputMem[i]) { 67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = NO_MEMORY; 67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("initHeapMem for jpeg, ret = NO_MEMORY"); 67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto on_error; 67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mJpegMemOpt) { 68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(m_pJpegOutputMem[i], &omx_out_buf, sizeof(omx_out_buf)); 68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.dest_buf[i].index = i; 68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.dest_buf[i].buf_size = main_offset.frame_len; 68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.dest_buf[i].buf_vaddr = (uint8_t *)m_pJpegOutputMem[i]; 68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.dest_buf[i].fd = -1; 68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.dest_buf[i].format = MM_JPEG_FMT_YUV; 68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin encode_parm.dest_buf[i].offset = main_offset; 68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinon_error: 69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin FREE_JPEG_OUTPUT_BUFFER(m_pJpegOutputMem, m_JpegOutputMemCount); 69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X with error %d", ret); 69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : sendEvtNotify 70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send event notify through notify callback registered by upper layer 70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type: msg type of notify 70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ext1 : extension 70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ext2 : extension 71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::sendEvtNotify(int32_t msg_type, 71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ext1, 71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ext2) 71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return m_parent->sendEvtNotify(msg_type, ext1, ext2); 72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : sendDataNotify 72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enqueue data into dataNotify thread 72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @msg_type: data callback msg type 72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : ptr to data memory struct 73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @index : index to data buffer 73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @metadata: ptr to meta data buffer if there is any 73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @release_data : ptr to struct indicating if data need to be released 73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * after notify 73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_buf_frame_idx : super buffer frame index 73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::sendDataNotify(int32_t msg_type, 74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *data, 74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t index, 74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_frame_metadata_t *metadata, 74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_release_data_t *release_data, 74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t super_buf_frame_idx) 74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_data_argm_t *data_cb = (qcamera_data_argm_t *)malloc(sizeof(qcamera_data_argm_t)); 74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == data_cb) { 74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for acamera_data_argm_t"); 75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(data_cb, 0, sizeof(qcamera_data_argm_t)); 75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_cb->msg_type = msg_type; 75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_cb->data = data; 75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_cb->index = index; 75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_cb->metadata = metadata; 75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (release_data != NULL) { 75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_cb->release_data = *release_data; 75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_SNAPSHOT_CALLBACK; 76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = msg_type; 76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = data; 76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.metadata = metadata; 76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.user_data = data_cb; 76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cookie = this; 76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.release_cb = releaseNotifyData; 77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.frame_index = super_buf_frame_idx; 77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = m_parent->m_cbNotifier.notifyCallback(cbArg); 77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NO_ERROR != rc ) { 77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error enqueuing jpeg data into notify queue"); 77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseNotifyData(data_cb, this, UNKNOWN_ERROR); 77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : validatePostProcess 78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Verify output buffer count of pp module 78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : process frame received from mm-camera-interface 78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : bool type of status 79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * TRUE -- success 79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FALSE failure 79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraPostProcessor::validatePostProcess(mm_camera_super_buf_t *frame) 79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool status = TRUE; 79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraReprocessChannel *m_pReprocChannel = NULL; 79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return status; 80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 80366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_parent->getChannelByHandle(frame->ch_id); 80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == mPPChannels[i]->getSrcChannel()) { 80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pReprocChannel = mPPChannels[i]; 80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((m_pReprocChannel != NULL) && (pChannel == m_pReprocChannel->getSrcChannel())) { 81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint8_t i = 0; i < m_pReprocChannel->getNumOfStreams(); i++) { 81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = m_pReprocChannel->getStreamByIndex(i); 81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream && (m_inputPPQ.getCurrentSize() > 0) && 81666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pStream->getNumQueuedBuf() <= 0)) { 81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Out of PP Buffer PPQ = %d ongoingQ = %d Jpeg = %d onJpeg = %d", 81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_inputPPQ.getCurrentSize(), m_inputPPQ.getCurrentSize(), 81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_inputJpegQ.getCurrentSize(), m_ongoingJpegQ.getCurrentSize()); 82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin status = FALSE; 82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return status; 82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getOfflinePPInputBuffer 83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to generate offline post proc buffer 83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @src_frame : process frame received from mm-camera-interface 83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : Buffer pointer if successfull 83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * : NULL in case of failures 83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_camera_buf_def_t *QCameraPostProcessor::getOfflinePPInputBuffer( 84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *src_frame) 84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *mBufDefs = NULL; 84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *src_pStream = NULL; 84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *data_frame = NULL; 84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *meta_frame = NULL; 84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mOfflineDataBufs == NULL) { 84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Offline Buffer not allocated"); 85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t num_bufs = mOfflineDataBufs->getCnt(); 85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t bufDefsSize = num_bufs * sizeof(mm_camera_buf_def_t); 85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mBufDefs = (mm_camera_buf_def_t *)malloc(bufDefsSize); 85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mBufDefs == NULL) { 85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory"); 85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(mBufDefs, 0, bufDefsSize); 86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_parent->getChannelByHandle(src_frame->ch_id); 86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < src_frame->num_bufs; i++) { 86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin src_pStream = pChannel->getStreamByHandle( 86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin src_frame->bufs[i]->stream_id); 86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (src_pStream != NULL) { 86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (src_pStream->getMyType() == CAM_STREAM_TYPE_RAW) { 86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Found RAW input stream"); 86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data_frame = src_frame->bufs[i]; 87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (src_pStream->getMyType() == CAM_STREAM_TYPE_METADATA){ 87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Found Metada input stream"); 87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_frame = src_frame->bufs[i]; 87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((src_pStream != NULL) && (data_frame != NULL)) { 87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t offset; 87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin src_pStream->getFrameOffset(offset); 88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < num_bufs; i++) { 88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mBufDefs[i] = *data_frame; 88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOfflineDataBufs->getBufDef(offset, mBufDefs[i], i); 88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Dumping RAW data on offline buffer"); 88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Actual data memcpy just for verification*/ 88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(mBufDefs[i].buffer, data_frame->buffer, 88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mBufDefs[i].frame_len); 88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseSuperBuf(src_frame, CAM_STREAM_TYPE_RAW); 89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(mBufDefs); 89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mBufDefs = NULL; 89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("mBufDefs = %p", mBufDefs); 89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mBufDefs; 89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 89966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processData 90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enqueue data into dataProc thread 90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : process frame received from mm-camera-interface 90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : depends on if offline reprocess is needed, received frame will 91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * be sent to either input queue of postprocess or jpeg encoding 91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::processData(mm_camera_super_buf_t *frame) 91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 91766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == FALSE) { 91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("postproc not initialized yet"); 91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid parameter"); 92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *meta_frame = NULL; 92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // look through input superbuf 93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_frame = frame->bufs[i]; 93266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_frame != NULL) { 93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Function to upadte metadata for frame based parameter 93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->updateMetadata((metadata_buffer_t *)meta_frame->buffer); 93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->needReprocess()) { 94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((!m_parent->isLongshotEnabled() && 94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !m_parent->m_stateMachine.isNonZSLCaptureRunning()) || 94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_parent->isLongshotEnabled() && 94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->isCaptureShutterEnabled())) { 94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //play shutter sound 94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->playShutter(); 94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ATRACE_INT("Camera:Reprocess", 1); 95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("need reprocess"); 95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // enqueu to post proc input queue 95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_pp_data_t *pp_request_job = 95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_pp_data_t *)malloc(sizeof(qcamera_pp_data_t)); 95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pp_request_job == NULL) { 95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for pproc job"); 95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(pp_request_job, 0, sizeof(qcamera_pp_data_t)); 96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->src_frame = frame; 96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->src_reproc_frame = frame; 96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->reprocCount = 0; 96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->ppChannelIndex = 0; 96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != frame) && 96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (0 < frame->num_bufs) 96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (m_parent->isRegularCapture())) { 96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*Regular capture. Source stream will be deleted*/ 96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *bufs = NULL; 97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t num_bufs = frame->num_bufs; 97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufs = new mm_camera_buf_def_t[num_bufs]; 97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == bufs) { 97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Unable to allocate cached buffers"); 97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < num_bufs; i++) { 97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bufs[i] = *frame->bufs[i]; 97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->bufs[i] = &bufs[i]; 98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->src_reproc_bufs = bufs; 98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Don't release source frame after encoding 98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // at this point the source channel will not exist. 98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->reproc_frame_release = true; 98666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mOfflineDataBufs != NULL) { 98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->offline_reproc_buf = 99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin getOfflinePPInputBuffer(frame); 99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pp_request_job->offline_reproc_buf != NULL) { 99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->offline_buffer = true; 99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 99666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (false == m_inputPPQ.enqueue((void *)pp_request_job)) { 99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Input PP Q is not active!!!"); 99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseSuperBuf(frame); 99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(frame); 100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(pp_request_job); 100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = NULL; 100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job = NULL; 100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->mParameters.isAdvCamFeaturesEnabled() 100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (meta_frame != NULL)) { 100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_InputMetadata.add(meta_frame); 100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (m_parent->mParameters.isNV16PictureFormat() || 101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isNV21PictureFormat()) { 101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //check if raw frame information is needed. 101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(m_parent->mParameters.isYUVFrameInfoNeeded()) 101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setYUVFrameInfo(frame); 101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin processRawData(frame); 101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //play shutter sound 101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(!m_parent->m_stateMachine.isNonZSLCaptureRunning() && 101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !m_parent->mLongshotEnabled) 102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->playShutter(); 102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("no need offline reprocess, sending to jpeg encoding"); 102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t *jpeg_job = 102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_jpeg_data_t *)malloc(sizeof(qcamera_jpeg_data_t)); 102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpeg_job == NULL) { 102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for jpeg job"); 102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(jpeg_job, 0, sizeof(qcamera_jpeg_data_t)); 103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->src_frame = frame; 103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_frame != NULL) { 103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // fill in meta data frame ptr 103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->metadata = (metadata_buffer_t *)meta_frame->buffer; 103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // enqueu to jpeg input queue 103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_inputJpegQ.enqueue((void *)jpeg_job)) { 104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Input Jpeg Q is not active!!!"); 104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseJpegJobData(jpeg_job); 104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpeg_job); 104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job = NULL; 104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processRawData 105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enqueue raw data into dataProc thread 105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : process frame received from mm-camera-interface 105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::processRawData(mm_camera_super_buf_t *frame) 106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == FALSE) { 106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("postproc not initialized yet"); 106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // enqueu to raw input queue 107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_inputRawQ.enqueue((void *)frame)) { 107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("m_inputRawQ is not active!!!"); 107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseSuperBuf(frame); 107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(frame); 107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = NULL; 107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processJpegEvt 108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process jpeg event from mm-jpeg-interface. 108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @evt : payload of jpeg event, including information about jpeg encoding 109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * status, jpeg size and so on. 109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : This event will also trigger DataProc thread to move to next job 109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * processing (i.e., send a new jpeg encoding job to mm-jpeg-interface 109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * if there is any pending job in jpeg input queue) 109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::processJpegEvt(qcamera_jpeg_evt_payload_t *evt) 110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == FALSE) { 110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("postproc not initialized yet"); 110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *jpeg_mem = NULL; 110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin omx_jpeg_ouput_buf_t *jpeg_out = NULL; 111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *jpegData = NULL; 111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mUseSaveProc && m_parent->isLongshotEnabled()) { 111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_evt_payload_t *saveData = ( qcamera_jpeg_evt_payload_t * ) malloc(sizeof(qcamera_jpeg_evt_payload_t)); 111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == saveData ) { 111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Can not allocate save data message!"); 111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *saveData = *evt; 111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_inputSaveQ.enqueue((void *) saveData)) { 111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_saveProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("m_inputSaveQ PP Q is not active!!!"); 112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(saveData); 112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin saveData = NULL; 112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* To be removed later when ISP Frame sync feature is available 112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t *jpeg_job = 112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_jpeg_data_t *)m_ongoingJpegQ.dequeue(matchJobId, 113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (void*)&evt->jobId); 113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frame_idx = jpeg_job->src_frame->bufs[0]->frame_idx;*/ 113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frame_idx = 75; 113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("FRAME INDEX %d", frame_idx); 113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Release jpeg job data 113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_ongoingJpegQ.flushNodes(matchJobId, (void*)&evt->jobId); 113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_inputPPQ.getCurrentSize() > 0) { 113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : jpeg job %d", evt->jobId); 114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((false == m_parent->m_bIntJpegEvtPending) && 114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_parent->mDataCb == NULL || 114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->msgTypeEnabledWithLock(CAMERA_MSG_COMPRESSED_IMAGE) == 0 )) { 114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("No dataCB or CAMERA_MSG_COMPRESSED_IMAGE not enabled"); 114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_ERROR; 114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(evt->status == JPEG_JOB_STATUS_ERROR) { 115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error event handled from jpeg, status = %d", 115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin evt->status); 115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = FAILED_TRANSACTION; 115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mJpegMemOpt) { 115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpegData = evt->out_data.buf_vaddr; 115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin else { 116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_out = (omx_jpeg_ouput_buf_t*) evt->out_data.buf_vaddr; 116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpeg_out != NULL) { 116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem = (camera_memory_t *)jpeg_out->mem_hdl; 116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpeg_mem != NULL) { 116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpegData = jpeg_mem->data; 116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->dumpJpegToFile(jpegData, 116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin evt->out_data.buf_filled_len, 117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin evt->jobId); 117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Dump jpeg_size=%d", evt->out_data.buf_filled_len); 117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(true == m_parent->m_bIntJpegEvtPending) { 117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Sending JPEG snapshot taken notification to HAL 117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_parent->m_int_lock); 117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_signal(&m_parent->m_int_cond); 117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_parent->m_int_lock); 117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mJpegMemOpt) { 118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // alloc jpeg memory to pass to upper layer 118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem = m_parent->mGetMemory(-1, evt->out_data.buf_filled_len, 118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, m_parent->mCallbackCookie); 118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == jpeg_mem) { 118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("getMemory for jpeg, ret = NO_MEMORY"); 118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(jpeg_mem->data, evt->out_data.buf_vaddr, evt->out_data.buf_filled_len); 119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Calling upperlayer callback to store JPEG image"); 119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_release_data_t release_data; 119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&release_data, 0, sizeof(qcamera_release_data_t)); 119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin release_data.data = jpeg_mem; 119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: PROFILE_JPEG_CB "); 119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE, 119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem, 119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0, 119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &release_data, 120166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_idx); 120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->setOutputImageCount(m_parent->getOutputImageCount() + 1); 120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinend: 120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 120666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send error msg to upper layer 120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Jpeg Encoding failed. Notify Application"); 120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sendEvtNotify(CAMERA_MSG_ERROR, 120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin UNKNOWN_ERROR, 121066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0); 121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != jpeg_mem) { 121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem->release(jpeg_mem); 121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem = NULL; 121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* check whether to send callback for depth map */ 121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->mParameters.isUbiRefocus() && 122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_parent->getOutputImageCount() + 1 == 122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getRefocusOutputCount())) { 122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->setOutputImageCount(m_parent->getOutputImageCount() + 1); 122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem = m_DataMem; 122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin release_data.data = jpeg_mem; 122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem = NULL; 122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf]: send jpeg callback for depthmap "); 122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE, 122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem, 123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0, 123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &release_data, 123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_idx); 123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send error msg to upper layer 123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sendEvtNotify(CAMERA_MSG_ERROR, 123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin UNKNOWN_ERROR, 123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0); 123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != jpeg_mem) { 124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem->release(jpeg_mem); 124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem = NULL; 124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem = NULL; 124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // wait up data proc thread to do next job, 124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // if previous request is blocked due to ongoing jpeg job 125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processPPData 125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process received frame after reprocess. 125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : received frame from reprocess channel. 126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : The frame after reprocess need to send to jpeg encoding. 126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::processPPData(mm_camera_super_buf_t *frame) 127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool triggerEvent = TRUE; 127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("QCameraPostProcessor::processPPData"); 127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool needSuperBufMatch = m_parent->mParameters.generateThumbFromMain(); 127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bInited == FALSE) { 127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("postproc not initialized yet"); 127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_pp_data_t *job = (qcamera_pp_data_t *)m_ongoingPPQ.dequeue(); 128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == job) { 128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Cannot find reprocess job"); 128366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!needSuperBufMatch && (job->src_frame == NULL 128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || job->src_reproc_frame == NULL) ) { 128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid reprocess job"); 128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!needSuperBufMatch && (m_parent->mParameters.isNV16PictureFormat() || 129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isNV21PictureFormat())) { 129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseOngoingPPData(job, this); 129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job); 129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(m_parent->mParameters.isYUVFrameInfoNeeded()) 129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin setYUVFrameInfo(frame); 129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return processRawData(frame); 130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 130166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef TARGET_TS_MAKEUP 130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find snapshot frame frame 130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *pReprocFrame = NULL; 130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream * pSnapshotStream = NULL; 130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_parent->getChannelByHandle(frame->ch_id); 130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[i] != NULL) && 130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[i]->getMyHandle() == frame->ch_id)) { 131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = mPPChannels[i]; 131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No corresponding channel (ch_id = %d) exist, return here", 131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->ch_id); 131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pSnapshotStream = pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pSnapshotStream != NULL) { 132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pSnapshotStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pReprocFrame = frame->bufs[i]; 132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pReprocFrame != NULL && m_parent->mParameters.isFaceDetectionEnabled()) { 133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->TsMakeupProcess_Snapshot(pReprocFrame,pSnapshotStream); 133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("pReprocFrame == NULL || isFaceDetectionEnabled = %d", 133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isFaceDetectionEnabled()); 133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif 133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((m_parent->isLongshotEnabled()) 133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (!m_parent->isCaptureShutterEnabled()) 133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (!m_parent->mCACDoneReceived)) { 134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // play shutter sound for longshot 134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // after reprocess is done 134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->playShutter(); 134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mCACDoneReceived = FALSE; 134566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t mCurReprocCount = job->reprocCount; 134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t mCurChannelIndex = job->ppChannelIndex; 134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( mCurReprocCount > 1 ) { 134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //In case of pp 2nd pass, we can release input of 2nd pass 135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseSuperBuf(job->src_frame); 135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job->src_frame); 135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job->src_frame = NULL; 135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("mCurReprocCount = %d mCurChannelIndex = %d mTotalNumReproc = %d", 135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mCurReprocCount, mCurChannelIndex, 135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getReprocCount()); 135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mCurReprocCount < m_parent->mParameters.getReprocCount()) { 135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //More pp pass needed. Push frame back to pp queue. 136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_pp_data_t *pp_request_job = job; 136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->src_frame = frame; 136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[mCurChannelIndex]->getReprocCount() 136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin == mCurReprocCount) && 136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[mCurChannelIndex + 1] != NULL)) { 136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job->ppChannelIndex++; 136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // enqueu to post proc input queue 137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (false == m_inputPPQ.enqueue((void *)pp_request_job)) { 137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("m_input PP Q is not active!!!"); 137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseOngoingPPData(pp_request_job,this); 137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(pp_request_job); 137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_request_job = NULL; 137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin triggerEvent = FALSE; 137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Done with post processing. Send frame to Jpeg 137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t *jpeg_job = 138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_jpeg_data_t *)malloc(sizeof(qcamera_jpeg_data_t)); 138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpeg_job == NULL) { 138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for jpeg job"); 138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(jpeg_job, 0, sizeof(qcamera_jpeg_data_t)); 138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->src_frame = frame; 138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->src_reproc_frame = job ? job->src_reproc_frame : NULL; 138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->src_reproc_bufs = job ? job->src_reproc_bufs : NULL; 139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->reproc_frame_release = job ? job->reproc_frame_release : false; 139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->offline_reproc_buf = job ? job->offline_reproc_buf : NULL; 139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->offline_buffer = job ? job->offline_buffer : false; 139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find meta data frame 139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *meta_frame = NULL; 139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->mParameters.isAdvCamFeaturesEnabled()) { 139766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t meta_idx = m_parent->mParameters.getExifBufIndex(m_PPindex); 139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_InputMetadata.size() >= (meta_idx + 1)) { 139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_frame = m_InputMetadata.itemAt(meta_idx); 140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Input metadata vector contains %d entries, index required %d", 140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_InputMetadata.size(), meta_idx); 140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_PPindex++; 140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; job && job->src_reproc_frame && 140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (i < job->src_reproc_frame->num_bufs); i++) { 140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // look through input superbuf 140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (job->src_reproc_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_frame = job->src_reproc_frame->bufs[i]; 141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_frame == NULL) { 141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // look through reprocess superbuf 141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_frame = frame->bufs[i]; 142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 142166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_frame != NULL) { 142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // fill in meta data frame ptr 142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job->metadata = (metadata_buffer_t *)meta_frame->buffer; 142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // enqueu reprocessed frame to jpeg input queue 143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (false == m_inputJpegQ.enqueue((void *)jpeg_job)) { 143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Input Jpeg Q is not active!!!"); 143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseJpegJobData(jpeg_job); 143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpeg_job); 143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job = NULL; 143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin triggerEvent = FALSE; 143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // free pp job buf 1440c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch pthread_mutex_lock(&m_reprocess_lock); 144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (job) { 144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job); 144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 1444c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch pthread_mutex_unlock(&m_reprocess_lock); 144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD(""); 144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // wait up data proc thread 144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (triggerEvent) { 145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : findJpegJobByJobId 145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: find a jpeg job from ongoing Jpeg queue by its job ID 146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jobId : job Id of the job 146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to a jpeg job struct. NULL if not found. 146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : Currently only one job is sending to mm-jpeg-interface for jpeg 146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * encoding. Therefore simply dequeue from the ongoing Jpeg Queue 146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * will serve the purpose to find the jpeg job. 147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinqcamera_jpeg_data_t *QCameraPostProcessor::findJpegJobByJobId(uint32_t jobId) 147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t * job = NULL; 147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jobId == 0) { 147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("not a valid jpeg jobId"); 147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // currely only one jpeg job ongoing, so simply dequeue the head 148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job = (qcamera_jpeg_data_t *)m_ongoingJpegQ.dequeue(); 148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return job; 148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releasePPInputData 148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback function to release post process input data node 148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : ptr to post process input data 149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : user data ptr (QCameraReprocessor) 149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releasePPInputData(void *data, void *user_data) 149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data; 149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pme) { 149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_pp_request_t *pp_job = (qcamera_pp_request_t *)data; 150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pp_job->src_frame) { 150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseSuperBuf(pp_job->src_frame); 150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pp_job->src_frame == pp_job->src_reproc_frame) 150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->src_reproc_frame = NULL; 150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(pp_job->src_frame); 150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->src_frame = NULL; 150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pp_job->src_reproc_frame) { 150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseSuperBuf(pp_job->src_reproc_frame); 150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(pp_job->src_reproc_frame); 151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->src_reproc_frame = NULL; 151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->reprocCount = 0; 151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 151566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 151666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseJpegData 151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback function to release jpeg job node 152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 152166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : ptr to ongoing jpeg job data 152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : user data ptr (QCameraReprocessor) 152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseJpegData(void *data, void *user_data) 152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data; 153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pme) { 153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseJpegJobData((qcamera_jpeg_data_t *)data); 153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Rleased job ID %u", 153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((qcamera_jpeg_data_t *)data)->jobId); 153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseOngoingPPData 153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback function to release ongoing postprocess job node 154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : ptr to onging postprocess job 154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : user data ptr (QCameraReprocessor) 154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseOngoingPPData(void *data, void *user_data) 154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data; 155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pme) { 155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_pp_data_t *pp_job = (qcamera_pp_data_t *)data; 155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pp_job->src_frame) { 155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!pp_job->reproc_frame_release) { 155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseSuperBuf(pp_job->src_frame); 155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pp_job->src_frame == pp_job->src_reproc_frame) 155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->src_reproc_frame = NULL; 155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(pp_job->src_frame); 156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->src_frame = NULL; 156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != pp_job->src_reproc_frame) { 156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseSuperBuf(pp_job->src_reproc_frame); 156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(pp_job->src_reproc_frame); 156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->src_reproc_frame = NULL; 156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pp_job->offline_reproc_buf != NULL) 156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (pp_job->offline_buffer)) { 157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(pp_job->offline_reproc_buf); 157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->offline_buffer = false; 157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_job->reprocCount = 0; 157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseNotifyData 157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to release internal resources in notify data struct 158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : ptr user data 158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cookie : callback cookie 158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cb_status : callback status 158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 158866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 158966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : deallocate jpeg heap memory if it's not NULL 159066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 159166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseNotifyData(void *user_data, 159266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *cookie, 159366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t cb_status) 159466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 159566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("releaseNotifyData release_data %p", user_data); 159666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 159766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_data_argm_t *app_cb = ( qcamera_data_argm_t * ) user_data; 159866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *postProc = ( QCameraPostProcessor * ) cookie; 159966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( ( NULL != app_cb ) && ( NULL != postProc ) ) { 160066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 160166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( postProc->mUseSaveProc && 160266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin app_cb->release_data.unlinkFile && 160366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ( NO_ERROR != cb_status ) ) { 160466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 160566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin String8 unlinkPath((const char *) app_cb->release_data.data->data, 160666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin app_cb->release_data.data->size); 160766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = unlink(unlinkPath.string()); 160866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Unlinking stored file rc = %d", 160966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc); 161066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 161166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 161266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (app_cb && NULL != app_cb->release_data.data) { 161366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin app_cb->release_data.data->release(app_cb->release_data.data); 161466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin app_cb->release_data.data = NULL; 161566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 161666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (app_cb && NULL != app_cb->release_data.frame) { 161766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin postProc->releaseSuperBuf(app_cb->release_data.frame); 161866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(app_cb->release_data.frame); 161966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin app_cb->release_data.frame = NULL; 162066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 162166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (app_cb && NULL != app_cb->release_data.streamBufs) { 162266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin app_cb->release_data.streamBufs->deallocate(); 162366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete app_cb->release_data.streamBufs; 162466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin app_cb->release_data.streamBufs = NULL; 162566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 162666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(app_cb); 162766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 162866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 162966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 163066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 163166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseSuperBuf 163266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 163366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to release a superbuf frame by returning back to kernel 163466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 163566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 163666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_buf : ptr to the superbuf frame 163766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 163866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 163966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 164066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseSuperBuf(mm_camera_super_buf_t *super_buf) 164166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 164266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 164366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 164466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 164566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_parent->getChannelByHandle(super_buf->ch_id); 164666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 164766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == pChannel ) { 164866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 164966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[i] != NULL) && 165066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[i]->getMyHandle() == super_buf->ch_id)) { 165166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = mPPChannels[i]; 165266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 165366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 165466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 165566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 165666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 165766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel != NULL) { 165866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_buf); 165966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 166066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Channel id %d not found!!", 166166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf->ch_id); 166266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 166366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 166466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 166566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 166666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 166766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseSuperBuf 166866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 166966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION : function to release a superbuf frame by returning back to kernel 167066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 167166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 167266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_buf : ptr to the superbuf frame 167366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_type: Type of stream to be released 167466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 167566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 167666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 167766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseSuperBuf(mm_camera_super_buf_t *super_buf, 167866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t stream_type) 167966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 168066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = NULL; 168166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 168266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 168366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = m_parent->getChannelByHandle(super_buf->ch_id); 168466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 168566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 168666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[i] != NULL) && 168766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[i]->getMyHandle() == super_buf->ch_id)) { 168866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = mPPChannels[i]; 168966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 169066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 169166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 169266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 169366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 169466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel != NULL) { 169566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < super_buf->num_bufs; i++) { 169666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (super_buf->bufs[i] != NULL) { 169766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = 169866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getStreamByHandle(super_buf->bufs[i]->stream_id); 169966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream != NULL) && ((pStream->getMyType() == stream_type) 170066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->getMyOriginalType() == stream_type))) { 170166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->bufDone(super_buf, super_buf->bufs[i]->stream_id); 170266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 170366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 170666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 170766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Channel id %d not found!!", 170866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin super_buf->ch_id); 170966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 171066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 171166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 171266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 171366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 171466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseJpegJobData 171566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 171666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to release internal resources in jpeg job struct 171766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 171866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 171966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @job : ptr to jpeg job struct 172066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 172166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 172266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 172366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : original source frame need to be queued back to kernel for 172466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * future use. Output buf of jpeg job need to be released since 172566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * it's allocated for each job. Exif object need to be deleted. 172666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 172766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseJpegJobData(qcamera_jpeg_data_t *job) 172866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 172966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 173066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != job) { 173166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != job->src_reproc_frame) { 173266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!job->reproc_frame_release) { 173366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseSuperBuf(job->src_reproc_frame); 173466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 173566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job->src_reproc_frame); 173666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job->src_reproc_frame = NULL; 173766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 173866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 173966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != job->src_frame) { 174066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseSuperBuf(job->src_frame); 174166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job->src_frame); 174266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job->src_frame = NULL; 174366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 174466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 174566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != job->pJpegExifObj) { 174666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete job->pJpegExifObj; 174766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job->pJpegExifObj = NULL; 174866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 174966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 175066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != job->src_reproc_bufs) { 175166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete [] job->src_reproc_bufs; 175266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 175366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 175466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((job->offline_reproc_buf != NULL) 175566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (job->offline_buffer)) { 175666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job->offline_reproc_buf); 175766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job->offline_buffer = false; 175866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 175966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 176066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 176166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 176266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 176366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 176466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseSaveJobData 176566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 176666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to release internal resources in store jobs 176766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 176866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 176966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @job : ptr to save job struct 177066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 177166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 177266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 177366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 177466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseSaveJobData(void *data, void *user_data) 177566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 177666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 177766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 177866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *pme = (QCameraPostProcessor *) user_data; 177966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pme) { 178066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid postproc handle"); 178166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 178266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 178366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 178466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_evt_payload_t *job_data = (qcamera_jpeg_evt_payload_t *) data; 178566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (job_data == NULL) { 178666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid jpeg event data"); 178766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 178866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 178966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 179066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find job by jobId 179166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t *job = pme->findJpegJobByJobId(job_data->jobId); 179266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 179366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != job) { 179466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseJpegJobData(job); 179566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job); 179666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 179766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid jpeg job"); 179866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 179966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 180066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 180166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 180266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 180366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 180466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseRawData 180566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 180666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to release internal resources in store jobs 180766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 180866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 180966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @job : ptr to save job struct 181066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 181166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 181266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 181366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 181466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraPostProcessor::releaseRawData(void *data, void *user_data) 181566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 181666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 181766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 181866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *pme = (QCameraPostProcessor *) user_data; 181966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pme) { 182066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid postproc handle"); 182166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 182266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 182366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *super_buf = (mm_camera_super_buf_t *) data; 182466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseSuperBuf(super_buf); 182566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 182666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("X"); 182766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 182866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 182966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 183066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 183166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getColorfmtFromImgFmt 183266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 183366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to return jpeg color format based on its image format 183466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 183566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 183666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @img_fmt : image format 183766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 183866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : jpeg color format that can be understandable by omx lib 183966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 184066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_jpeg_color_format QCameraPostProcessor::getColorfmtFromImgFmt(cam_format_t img_fmt) 184166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 184266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (img_fmt) { 184366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV21: 184466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV21_VENUS: 184566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 184666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV21_ADRENO: 184766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 184866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV12: 184966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV12_VENUS: 185066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2; 185166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_YV12: 185266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2; 185366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_422_NV61: 185466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1; 185566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_422_NV16: 185666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1; 185766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 185866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 185966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 186066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 186166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 186266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 186366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getJpegImgTypeFromImgFmt 186466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 186566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to return jpeg encode image type based on its image format 186666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 186766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 186866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @img_fmt : image format 186966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 187066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : return jpeg source image format (YUV or Bitstream) 187166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 187266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinmm_jpeg_format_t QCameraPostProcessor::getJpegImgTypeFromImgFmt(cam_format_t img_fmt) 187366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 187466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (img_fmt) { 187566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV21: 187666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV21_ADRENO: 187766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV12: 187866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV12_VENUS: 187966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_NV21_VENUS: 188066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_420_YV12: 188166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_422_NV61: 188266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAM_FORMAT_YUV_422_NV16: 188366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_FMT_YUV; 188466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 188566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return MM_JPEG_FMT_YUV; 188666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 188766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 188866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 188966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 189066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : queryStreams 189166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 189266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: utility method for retrieving main, thumbnail and reprocess 189366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * streams and frame from bundled super buffer 189466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 189566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 189666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @main : ptr to main stream if present 189766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @thumb : ptr to thumbnail stream if present 189866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @reproc : ptr to reprocess stream if present 189966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @main_image : ptr to main image if present 190066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @thumb_image: ptr to thumbnail image if present 190166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : bundled super buffer 190266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @reproc_frame : bundled source frame buffer 190366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 190466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 190566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 190666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 190766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 190866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::queryStreams(QCameraStream **main, 190966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream **thumb, 191066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream **reproc, 191166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t **main_image, 191266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t **thumb_image, 191366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *frame, 191466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *reproc_frame) 191566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 191666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == frame) { 191766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 191866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 191966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 192066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_parent->getChannelByHandle(frame->ch_id); 192166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // check reprocess channel if not found 192266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 192366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 192466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[i] != NULL) && 192566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[i]->getMyHandle() == frame->ch_id)) { 192666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = mPPChannels[i]; 192766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 192866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 192966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 193066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 193166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 193266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("No corresponding channel (ch_id = %d) exist, return here", 193366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->ch_id); 193466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 193566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 193666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 193766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Use snapshot stream to create thumbnail if snapshot and preview 193866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flip settings doesn't match in ZSL mode. 193966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool thumb_stream_needed = ((!m_parent->isZSLMode() || 194066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_parent->mParameters.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT) == 194166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getFlipMode(CAM_STREAM_TYPE_PREVIEW))) && 194266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !m_parent->mParameters.generateThumbFromMain()); 194366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 194466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *main = *thumb = *reproc = NULL; 194566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *main_image = *thumb_image = NULL; 194666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find snapshot frame and thumnail frame 194766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 194866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = 194966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getStreamByHandle(frame->bufs[i]->stream_id); 195066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 195166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 195266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 195366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isTypeOf(CAM_STREAM_TYPE_VIDEO) || 195466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_VIDEO) || 195566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_parent->mParameters.getofflineRAW() && 195666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))) { 195766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *main= pStream; 195866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *main_image = frame->bufs[i]; 195966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (thumb_stream_needed && 196066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 196166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 196266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) || 196366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW))) { 196466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *thumb = pStream; 196566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *thumb_image = frame->bufs[i]; 196666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 196766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_OFFLINE_PROC) ) { 196866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *reproc = pStream; 196966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 197066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 197166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 197266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 197366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_stream_needed && *thumb_image == NULL && reproc_frame != NULL) { 197466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pSrcReprocChannel = NULL; 197566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pSrcReprocChannel = m_parent->getChannelByHandle(reproc_frame->ch_id); 197666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pSrcReprocChannel != NULL) { 197766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find thumbnail frame 197866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < reproc_frame->num_bufs; i++) { 197966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = 198066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pSrcReprocChannel->getStreamByHandle( 198166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reproc_frame->bufs[i]->stream_id); 198266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 198366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 198466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW)) { 198566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *thumb = pStream; 198666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *thumb_image = reproc_frame->bufs[i]; 198766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 198866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 198966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 199066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 199166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 199266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 199466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 199566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 199666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 199766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* FUNCTION : syncStreamParams 199866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 199966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* DESCRIPTION: Query the runtime parameters of all streams included 200066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* in the main and reprocessed frames 200166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 200266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* PARAMETERS : 200366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* @frame : Main image super buffer 200466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* @reproc_frame : Image supper buffer that got processed 200566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 200666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* RETURN : int32_t type of status 200766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* NO_ERROR -- success 200866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* none-zero failure code 200966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*==========================================================================*/ 201066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::syncStreamParams(mm_camera_super_buf_t *frame, 201166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *reproc_frame) 201266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 201366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *reproc_stream = NULL; 201466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *main_stream = NULL; 201566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *thumb_stream = NULL; 201666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *main_frame = NULL; 201766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *thumb_frame = NULL; 201866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 201966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 202066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = queryStreams(&main_stream, 202166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &thumb_stream, 202266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &reproc_stream, 202366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &main_frame, 202466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &thumb_frame, 202566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame, 202666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reproc_frame); 202766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 202866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Camera streams query from input frames failed %d", 202966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret); 203066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 203166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 203266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 203366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != main_stream) { 203466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = main_stream->syncRuntimeParams(); 203566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 203666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Syncing of main stream runtime parameters failed %d", 203766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret); 203866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 203966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 204066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 204166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 204266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != thumb_stream) { 204366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = thumb_stream->syncRuntimeParams(); 204466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 204566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Syncing of thumb stream runtime parameters failed %d", 204666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret); 204766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 204866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 204966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 205066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 205166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != reproc_stream) && (reproc_stream != main_stream)) { 205266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = reproc_stream->syncRuntimeParams(); 205366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 205466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Syncing of reproc stream runtime parameters failed %d", 205566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret); 205666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 205766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 205866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 205966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 206066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 206166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 206266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 206366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 206466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : encodeData 206566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 206666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to prepare encoding job information and send to 206766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * mm-jpeg-interface to do the encoding job 206866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 206966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 207066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @jpeg_job_data : ptr to a struct saving job related information 207166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @needNewSess : flag to indicate if a new jpeg encoding session need 207266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to be created. After creation, this flag will be toggled 207366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 207466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 207566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 207666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 207766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 207866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::encodeData(qcamera_jpeg_data_t *jpeg_job_data, 207966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t &needNewSess) 208066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 208166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("E"); 208266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 208366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_job_t jpg_job; 208466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t jobId = 0; 208566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *reproc_stream = NULL; 208666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *main_stream = NULL; 208766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *main_frame = NULL; 208866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *thumb_stream = NULL; 208966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *thumb_frame = NULL; 209066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *recvd_frame = jpeg_job_data->src_frame; 209166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_rect_t crop; 209266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param; 209366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_img_prop_t imgProp; 209466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 209566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find channel 209666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_parent->getChannelByHandle(recvd_frame->ch_id); 209766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // check reprocess channel if not found 209866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 209966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 210066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[i] != NULL) && 210166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[i]->getMyHandle() == recvd_frame->ch_id)) { 210266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = mPPChannels[i]; 210366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 210466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 210566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 210666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 210766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 210866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 210966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No corresponding channel (ch_id = %d) exist, return here", 211066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->ch_id); 211166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 211266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 211366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 211466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const uint32_t jpeg_rotation = m_parent->mParameters.getJpegRotation(); 211566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 211666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = queryStreams(&main_stream, 211766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &thumb_stream, 211866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &reproc_stream, 211966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &main_frame, 212066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &thumb_frame, 212166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame, 212266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job_data->src_reproc_frame); 212366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 212466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 212566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 212666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 212766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(NULL == main_frame){ 212866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Main frame is NULL"); 212966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 213066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 213166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 213266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(NULL == thumb_frame){ 213366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Thumbnail frame does not exist"); 213466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 213566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 213666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *memObj = (QCameraMemory *)main_frame->mem_info; 213766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == memObj) { 213866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Memeory Obj of main frame is NULL"); 213966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 214066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 214166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 214266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // dump snapshot frame if enabled 214366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->dumpFrameToFile(main_stream, main_frame, 214466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCAMERA_DUMP_FRM_SNAPSHOT, (char *)"CPP"); 214566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 214666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send upperlayer callback for raw image 214766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *mem = memObj->getMemory(main_frame->buf_idx, false); 214866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != m_parent->mDataCb && 214966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE) > 0) { 215066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 215166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 215266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 215366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_RAW_IMAGE; 215466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = mem; 215566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.index = 0; 215666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->m_cbNotifier.notifyCallback(cbArg); 215766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 215866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != m_parent->mNotifyCb && 215966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE_NOTIFY) > 0) { 216066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 216166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 216266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 216366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_RAW_IMAGE_NOTIFY; 216466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext1 = 0; 216566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext2 = 0; 216666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->m_cbNotifier.notifyCallback(cbArg); 216766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 216866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 216966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mJpegClientHandle <= 0) { 217066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error: bug here, mJpegClientHandle is 0"); 217166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 217266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 217366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 217466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (needNewSess) { 217566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // create jpeg encoding session 217666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_jpeg_encode_params_t encodeParam; 217766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&encodeParam, 0, sizeof(mm_jpeg_encode_params_t)); 217866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = getJpegEncodingConfig(encodeParam, main_stream, thumb_stream); 217966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 218066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("error getting encoding config"); 218166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 218266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 218366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : call jpeg create_session"); 218466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = mJpegHandle.create_session(mJpegClientHandle, &encodeParam, &mJpegSessionId); 218566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 218666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("error creating a new jpeg encoding session"); 218766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 218866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 218966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin needNewSess = FALSE; 219066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 219166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Fill in new job 219266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&jpg_job, 0, sizeof(mm_jpeg_job_t)); 219366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.job_type = JPEG_JOB_TYPE_ENCODE; 219466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.session_id = mJpegSessionId; 219566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.src_index = (int32_t)main_frame->buf_idx; 219666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.dst_index = 0; 219766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 219866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mJpegMemOpt) { 219966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.dst_index = jpg_job.encode_job.src_index; 220066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if (mUseJpegBurst) { 220166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.dst_index = -1; 220266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 220366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 220466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // use src to reproc frame as work buffer; if src buf is not available 220566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // jpeg interface will allocate work buffer 220666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpeg_job_data->src_reproc_frame != NULL) { 220766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 220866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *main_stream = NULL; 220966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *main_frame = NULL; 221066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *thumb_stream = NULL; 221166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *thumb_frame = NULL; 221266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *reproc_stream = NULL; 221366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *workBuf = NULL; 221466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Call queryStreams to fetch source of reproc frame 221566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = queryStreams(&main_stream, 221666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &thumb_stream, 221766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &reproc_stream, 221866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &main_frame, 221966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &thumb_frame, 222066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job_data->src_reproc_frame, 222166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 222266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 222366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NO_ERROR == ret) && ((workBuf = main_frame) != NULL) 222466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !m_parent->isLowPowerMode()) { 222566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *camWorkMem = NULL; 222666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int workBufIndex = workBuf->buf_idx; 222766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *workMem = (QCameraMemory *)workBuf->mem_info; 222866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (workMem != NULL) { 222966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camWorkMem = workMem->getMemory(workBufIndex, false); 223066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (camWorkMem != NULL && workMem != NULL) { 223266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.work_buf.buf_size = camWorkMem->size; 223366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.work_buf.buf_vaddr = (uint8_t *)camWorkMem->data; 223466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.work_buf.fd = workMem->getFd(workBufIndex); 223566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin workMem->invalidateCache(workBufIndex); 223666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 223966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 224066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t src_dim; 224166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&src_dim, 0, sizeof(cam_dimension_t)); 224266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->getFrameDimension(src_dim); 224366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 224466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool hdr_output_crop = m_parent->mParameters.isHDROutputCropEnabled(); 224566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool img_feature_enabled = 224666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isUbiFocusEnabled() || 224766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isUbiRefocus() || 224866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isChromaFlashEnabled() || 224966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isOptiZoomEnabled() || 225066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isStillMoreEnabled(); 225166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 225266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Crop needed %d", img_feature_enabled); 225366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.left = 0; 225466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.top = 0; 225566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.height = src_dim.height; 225666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.width = src_dim.width; 225766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 225866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param = main_stream->getOutputCrop(); 225966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < param.outputCrop.num_of_streams; i++) { 226066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.outputCrop.crop_info[i].stream_id 226166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin == main_stream->getMyServerID()) { 226266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop = param.outputCrop.crop_info[i].crop; 226366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->setCropInfo(crop); 226466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 226566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 226666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (img_feature_enabled) { 226766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 226866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 226966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param = main_stream->getImgProp(); 227066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin imgProp = param.imgProp; 227166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin main_stream->setCropInfo(imgProp.crop); 227266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop = imgProp.crop; 227366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream = NULL; /* use thumbnail from main image */ 227466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 227566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((reproc_stream != NULL) && (m_DataMem == NULL) && 227666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.isUbiRefocus()) { 227766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 227866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory* miscBufHandler = reproc_stream->getMiscBuf(); 227966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_misc_buf_t* refocusResult = 228066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<cam_misc_buf_t *>(miscBufHandler->getPtr(0)); 228166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t resultSize = refocusResult->header_size + 228266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin refocusResult->width * refocusResult->height; 228366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *dataMem = m_parent->mGetMemory(-1, resultSize, 228466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, m_parent->mCallbackCookie); 228566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 228666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Refocus result header %u dims %dx%d", 228766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin resultSize, refocusResult->width, refocusResult->height); 228866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 228966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (dataMem && dataMem->data) { 229066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(dataMem->data, refocusResult->data, resultSize); 229166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //save mem pointer for depth map 229266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_DataMem = dataMem; 229366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 229466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 229566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if ((reproc_stream != NULL) && (m_parent->mParameters.isTruePortraitEnabled())) { 229666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 229766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory* miscBufHandler = reproc_stream->getMiscBuf(); 229866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_misc_buf_t* tpResult = 229966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin reinterpret_cast<cam_misc_buf_t *>(miscBufHandler->getPtr(0)); 230066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t tpMetaSize = tpResult->header_size + tpResult->width * tpResult->height; 230166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("True portrait result header %d% dims dx%d", 230366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin tpMetaSize, tpResult->width, tpResult->height); 230466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_DUMP_TO_FILE(QCAMERA_DUMP_FRM_LOCATION"tp", "bm", -1, "y", 230666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &tpResult->data, tpMetaSize); 230766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 230866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 230966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t dst_dim; 231066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 231166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hdr_output_crop && crop.height) { 231266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.height = crop.height; 231366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 231466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.height = src_dim.height; 231566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 231666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (hdr_output_crop && crop.width) { 231766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.width = crop.width; 231866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 231966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dst_dim.width = src_dim.width; 232066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 232166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 232266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // main dim 232366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.main_dim.src_dim = src_dim; 232466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.main_dim.dst_dim = dst_dim; 232566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.main_dim.crop = crop; 232666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 232766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // get 3a sw version info 232866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_q3a_version_t sw_version = 232966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->getCamHalCapabilities()->q3a_version; 233066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 233166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // get exif data 233266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraExif *pJpegExifObj = m_parent->getExifData(); 233366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job_data->pJpegExifObj = pJpegExifObj; 233466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pJpegExifObj != NULL) { 233566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.exif_info.exif_data = pJpegExifObj->getEntries(); 233666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.exif_info.numOfEntries = 233766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pJpegExifObj->getNumOfEntries(); 233866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.exif_info.debug_data.sw_3a_version[0] = 233966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sw_version.major_version; 234066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.exif_info.debug_data.sw_3a_version[1] = 234166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sw_version.minor_version; 234266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.exif_info.debug_data.sw_3a_version[2] = 234366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sw_version.patch_version; 234466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.exif_info.debug_data.sw_3a_version[3] = 234566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sw_version.new_feature_des; 234666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 234766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 234866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // set rotation only when no online rotation or offline pp rotation is done before 234966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_parent->needRotationReprocess()) { 235066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.rotation = jpeg_rotation; 235166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 235266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("jpeg rotation is set to %d", jpg_job.encode_job.rotation); 235366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 235466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // thumbnail dim 235566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bThumbnailNeeded == TRUE) { 235666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->getThumbnailSize(jpg_job.encode_job.thumb_dim.dst_dim); 235766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 235866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_stream == NULL) { 235966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // need jpeg thumbnail, but no postview/preview stream exists 236066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we use the main stream/frame to encode thumbnail 236166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream = main_stream; 236266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_frame = main_frame; 236366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 236466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->needRotationReprocess() && 236566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ((90 == jpeg_rotation) || (270 == jpeg_rotation))) { 236666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // swap thumbnail dimensions 236766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t tmp_dim = jpg_job.encode_job.thumb_dim.dst_dim; 236866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.dst_dim.width = tmp_dim.height; 236966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.dst_dim.height = tmp_dim.width; 237066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 237166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 237266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&src_dim, 0, sizeof(cam_dimension_t)); 237366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream->getFrameDimension(src_dim); 237466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.src_dim = src_dim; 237566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 237666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // crop is the same if frame is the same 237766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_frame != main_frame) { 237866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.left = 0; 237966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.top = 0; 238066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.height = src_dim.height; 238166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop.width = src_dim.width; 238266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 238366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param = thumb_stream->getOutputCrop(); 238466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < param.outputCrop.num_of_streams; i++) { 238566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.outputCrop.crop_info[i].stream_id 238666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin == thumb_stream->getMyServerID()) { 238766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop = param.outputCrop.crop_info[i].crop; 238866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin thumb_stream->setCropInfo(crop); 238966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 239366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 239466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.crop = crop; 239566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_frame != NULL) { 239666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_index = thumb_frame->buf_idx; 239766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 239866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Thumbnail idx = %d src w/h (%dx%d), dst w/h (%dx%d)", 239966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_index, 240066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.src_dim.width, 240166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.src_dim.height, 240266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.dst_dim.width, 240366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.thumb_dim.dst_dim.height); 240466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 240566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 240666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Main image idx = %d src w/h (%dx%d), dst w/h (%dx%d)", 240766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.src_index, 240866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.main_dim.src_dim.width, 240966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.main_dim.src_dim.height, 241066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.main_dim.dst_dim.width, 241166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.main_dim.dst_dim.height); 241266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 241366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (thumb_frame != NULL) { 241466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // dump thumbnail frame if enabled 241566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->dumpFrameToFile(thumb_stream, thumb_frame, QCAMERA_DUMP_FRM_THUMBNAIL); 241666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 241766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 241866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpeg_job_data->metadata != NULL) { 241966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // fill in meta data frame ptr 242066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata = jpeg_job_data->metadata; 242166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 242266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 242366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.hal_version = CAM_HAL_V1; 242466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mExifParams.sensor_params.sens_type = m_parent->getSensorType(); 242566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params = m_parent->mExifParams; 242666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params = 242766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_jpeg_debug_exif_params_t *) malloc (sizeof(mm_jpeg_debug_exif_params_t)); 242866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!jpg_job.encode_job.cam_exif_params.debug_params) { 242966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Out of Memory. Allocation failed for 3A debug exif params"); 243066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 243166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 243266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 243366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.mobicat_mask = m_parent->mParameters.getMobicatMask(); 243466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 243566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 243666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != jpg_job.encode_job.p_metadata && (jpg_job.encode_job.mobicat_mask > 0)) { 243766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 243866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->mExifParams.debug_params) { 243966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(jpg_job.encode_job.cam_exif_params.debug_params, 244066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mExifParams.debug_params, (sizeof(mm_jpeg_debug_exif_params_t))); 244166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 244266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Save a copy of mobicat params */ 244366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->is_mobicat_aec_params_valid = 244466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.cam_3a_params_valid; 244566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 244666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpg_job.encode_job.cam_exif_params.cam_3a_params_valid) { 244766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->mobicat_aec_params = 244866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.cam_3a_params; 244966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 245066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 245166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Save a copy of 3A debug params */ 245266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->is_statsdebug_ae_params_valid = 245366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->ae_debug_params_valid; 245466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->is_statsdebug_awb_params_valid = 245566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->awb_debug_params_valid; 245666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->is_statsdebug_af_params_valid = 245766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->af_debug_params_valid; 245866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->is_statsdebug_asd_params_valid = 245966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->asd_debug_params_valid; 246066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->is_statsdebug_stats_params_valid = 246166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->stats_debug_params_valid; 2462c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.p_metadata->is_statsdebug_bestats_params_valid = 2463c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.cam_exif_params.debug_params->bestats_debug_params_valid; 2464c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.p_metadata->is_statsdebug_bhist_params_valid = 2465c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.cam_exif_params.debug_params->bhist_debug_params_valid; 2466c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.p_metadata->is_statsdebug_3a_tuning_params_valid = 2467c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.cam_exif_params.debug_params->q3a_tuning_debug_params_valid; 246866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 246966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpg_job.encode_job.cam_exif_params.debug_params->ae_debug_params_valid) { 247066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->statsdebug_ae_data = 247166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->ae_debug_params; 247266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 247366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpg_job.encode_job.cam_exif_params.debug_params->awb_debug_params_valid) { 247466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->statsdebug_awb_data = 247566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->awb_debug_params; 247666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 247766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpg_job.encode_job.cam_exif_params.debug_params->af_debug_params_valid) { 247866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->statsdebug_af_data = 247966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->af_debug_params; 248066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 248166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpg_job.encode_job.cam_exif_params.debug_params->asd_debug_params_valid) { 248266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->statsdebug_asd_data = 248366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->asd_debug_params; 248466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 248566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpg_job.encode_job.cam_exif_params.debug_params->stats_debug_params_valid) { 248666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.p_metadata->statsdebug_stats_buffer_data = 248766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.cam_exif_params.debug_params->stats_debug_params; 248866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 2489c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch if (jpg_job.encode_job.cam_exif_params.debug_params->bestats_debug_params_valid) { 2490c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.p_metadata->statsdebug_bestats_buffer_data = 2491c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.cam_exif_params.debug_params->bestats_debug_params; 2492c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch } 2493c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch if (jpg_job.encode_job.cam_exif_params.debug_params->bhist_debug_params_valid) { 2494c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.p_metadata->statsdebug_bhist_data = 2495c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.cam_exif_params.debug_params->bhist_debug_params; 2496c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch } 2497c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch if (jpg_job.encode_job.cam_exif_params.debug_params->q3a_tuning_debug_params_valid) { 2498c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.p_metadata->statsdebug_3a_tuning_data = 2499c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch jpg_job.encode_job.cam_exif_params.debug_params->q3a_tuning_debug_params; 2500c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch } 250166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 250366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 250566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /* Init the QTable */ 250666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < QTABLE_MAX; i++) { 250766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.qtable_set[i] = 0; 250866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 250966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 251066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const cam_sync_related_sensors_event_info_t* related_cam_info = 251166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->getRelatedCamSyncInfo(); 251266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (related_cam_info->sync_control == CAM_SYNC_RELATED_SENSORS_ON && 251366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->getMpoComposition()) { 251466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.multi_image_info.type = MM_JPEG_TYPE_MPO; 251566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (related_cam_info->type == CAM_TYPE_MAIN ) { 251666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.multi_image_info.is_primary = TRUE; 251766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Encoding MPO Primary JPEG"); 251866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 251966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.multi_image_info.is_primary = FALSE; 252066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Encoding MPO Aux JPEG"); 252166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 252266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.multi_image_info.num_of_images = 2; 252366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 252466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Encoding Single JPEG"); 252566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.multi_image_info.type = MM_JPEG_TYPE_JPEG; 252666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.multi_image_info.is_primary = FALSE; 252766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpg_job.encode_job.multi_image_info.num_of_images = 1; 252866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 252966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 253066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf] : PROFILE_JPEG_JOB_START"); 253166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = mJpegHandle.start_job(&jpg_job, &jobId); 253266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (jpg_job.encode_job.cam_exif_params.debug_params) { 253366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpg_job.encode_job.cam_exif_params.debug_params); 253466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 253566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret == NO_ERROR) { 253666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // remember job info 253766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job_data->jobId = jobId; 253866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 253966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 254066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 254166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 254266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 254366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 254466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processRawImageImpl 254566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 254666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to send raw image to upper layer 254766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 254866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 254966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : frame to be encoded 255066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 255166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 255266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 255366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 255466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 255566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::processRawImageImpl(mm_camera_super_buf_t *recvd_frame) 255666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 255766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 255866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 255966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_parent->getChannelByHandle(recvd_frame->ch_id); 256066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 256166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *frame = NULL; 256266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // check reprocess channel if not found 256366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 256466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 256566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[i] != NULL) && 256666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[i]->getMyHandle() == recvd_frame->ch_id)) { 256766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = mPPChannels[i]; 256866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 256966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 257366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No corresponding channel (ch_id = %d) exist, return here", 257466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->ch_id); 257566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 257666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 257766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 257866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find snapshot frame 257966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 258066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pCurStream = 258166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getStreamByHandle(recvd_frame->bufs[i]->stream_id); 258266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pCurStream != NULL) { 258366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pCurStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 258466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pCurStream->isTypeOf(CAM_STREAM_TYPE_RAW) || 258566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pCurStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 258666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pCurStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)) { 258766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pCurStream; 258866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame = recvd_frame->bufs[i]; 258966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 259066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 259466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == frame ) { 259566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No valid raw buffer"); 259666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 259766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 259866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 259966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraMemory *rawMemObj = (QCameraMemory *)frame->mem_info; 260066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool zslChannelUsed = m_parent->isZSLMode() && 260166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ( pChannel != mPPChannels[0] ); 260266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *raw_mem = NULL; 260366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 260466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rawMemObj != NULL) { 260566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (zslChannelUsed) { 260666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_mem = rawMemObj->getMemory(frame->buf_idx, false); 260766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 260866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_mem = m_parent->mGetMemory(-1, 260966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->frame_len, 261066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 261166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mCallbackCookie); 261266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == raw_mem) { 261366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Not enough memory for RAW cb "); 261466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 261566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 261666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(raw_mem->data, frame->buffer, frame->frame_len); 261766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 261866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 261966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 262066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != rawMemObj && NULL != raw_mem) { 262166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // dump frame into file 262266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame->stream_type == CAM_STREAM_TYPE_SNAPSHOT || 262366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 262466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // for YUV422 NV16 case 262566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->dumpFrameToFile(pStream, frame, QCAMERA_DUMP_FRM_SNAPSHOT); 262666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 262766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Received RAW snapshot taken notification 262866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->dumpFrameToFile(pStream, frame, QCAMERA_DUMP_FRM_RAW); 262966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 263066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(true == m_parent->m_bIntRawEvtPending) { 263166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Sending RAW snapshot taken notification to HAL 263266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&m_dst_dim, 0, sizeof(m_dst_dim)); 263366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameDimension(m_dst_dim); 263466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_parent->m_int_lock); 263566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_cond_signal(&m_parent->m_int_cond); 263666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_parent->m_int_lock); 263766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_mem->release(raw_mem); 263866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 263966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 264066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 264166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 264266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // send data callback / notify for RAW_IMAGE 264366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != m_parent->mDataCb && 264466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE) > 0) { 264566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 264666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 264766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_DATA_CALLBACK; 264866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_RAW_IMAGE; 264966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.data = raw_mem; 265066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.index = 0; 265166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->m_cbNotifier.notifyCallback(cbArg); 265266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 265366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != m_parent->mNotifyCb && 265466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE_NOTIFY) > 0) { 265566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_callback_argm_t cbArg; 265666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 265766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 265866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.msg_type = CAMERA_MSG_RAW_IMAGE_NOTIFY; 265966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext1 = 0; 266066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cbArg.ext2 = 0; 266166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->m_cbNotifier.notifyCallback(cbArg); 266266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 266366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 266466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((m_parent->mDataCb != NULL) && 266566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->msgTypeEnabledWithLock(CAMERA_MSG_COMPRESSED_IMAGE) > 0) { 266666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_release_data_t release_data; 266766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&release_data, 0, sizeof(qcamera_release_data_t)); 266866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( zslChannelUsed ) { 266966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin release_data.frame = recvd_frame; 267066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 267166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin release_data.data = raw_mem; 267266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 267366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE, 267466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_mem, 267566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0, 267666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 267766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &release_data); 267866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 267966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin raw_mem->release(raw_mem); 268066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 268166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 268266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Cannot get raw mem"); 268366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = UNKNOWN_ERROR; 268466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 268566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 268666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 268766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 268866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 268966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 269066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dataSaveRoutine 269166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 269266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: data saving routine 269366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 269466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 269566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : user data ptr (QCameraPostProcessor) 269666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 269766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 269866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 269966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid *QCameraPostProcessor::dataSaveRoutine(void *data) 270066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 270166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int running = 1; 270266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret; 270366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t is_active = FALSE; 270466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *pme = (QCameraPostProcessor *)data; 270566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraCmdThread *cmdThread = &pme->m_saveProcTh; 270666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cmdThread->setName("CAM_JpegSave"); 270766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char saveName[PROPERTY_VALUE_MAX]; 270866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 270966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 271066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 271166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 271266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = cam_sem_wait(&cmdThread->cmd_sem); 271366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != 0 && errno != EINVAL) { 271466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cam_sem_wait error (%s)", 271566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strerror(errno)); 271666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 271766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 271866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (ret != 0); 271966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 272066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we got notified about new cmd avail in cmd queue 272166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_cmd_type_t cmd = cmdThread->getCmd(); 272266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (cmd) { 272366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_START_DATA_PROC: 272466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("start data proc"); 272566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_active = TRUE; 272666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputSaveQ.init(); 272766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 272866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_STOP_DATA_PROC: 272966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 273066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("stop data proc"); 273166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_active = FALSE; 273266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 273366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flush input save Queue 273466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputSaveQ.flush(); 273566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 273666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // signal cmd is completed 273766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&cmdThread->sync_sem); 273866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 273966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 274066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_DO_NEXT_JOB: 274166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 274266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Do next job, active is %d", is_active); 274366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 274466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_evt_payload_t *job_data = (qcamera_jpeg_evt_payload_t *) pme->m_inputSaveQ.dequeue(); 274566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (job_data == NULL) { 274666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid jpeg event data"); 274766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 274866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 274966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //qcamera_jpeg_data_t *jpeg_job = 275066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // (qcamera_jpeg_data_t *)pme->m_ongoingJpegQ.dequeue(false); 275166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //uint32_t frame_idx = jpeg_job->src_frame->bufs[0]->frame_idx; 275266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t frame_idx = 75; 275366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 275466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_ongoingJpegQ.flushNodes(matchJobId, (void*)&job_data->jobId); 275566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 275666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("[KPI Perf] : jpeg job %d", job_data->jobId); 275766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 275866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (is_active == TRUE) { 275966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(saveName, '\0', sizeof(saveName)); 276066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin snprintf(saveName, 276166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin sizeof(saveName), 276266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor::STORE_LOCATION, 276366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mSaveFrmCnt); 276466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 276566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int file_fd = open(saveName, O_RDWR | O_CREAT, 0655); 276666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (file_fd >= 0) { 276766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ssize_t written_len = write(file_fd, job_data->out_data.buf_vaddr, 276866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_data->out_data.buf_filled_len); 276966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ssize_t)job_data->out_data.buf_filled_len != written_len) { 277066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Failed save complete data %d bytes " 277166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin "written instead of %d bytes!", 277266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len, 277366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin job_data->out_data.buf_filled_len); 277466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 277566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("written number of bytes %d\n", 277666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin written_len); 277766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 277866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 277966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin close(file_fd); 278066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 278166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("fail t open file for saving"); 278266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 278366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mSaveFrmCnt++; 278466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 278566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t* jpeg_mem = pme->m_parent->mGetMemory(-1, 278666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strlen(saveName), 278766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, 278866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_parent->mCallbackCookie); 278966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == jpeg_mem) { 279066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = NO_MEMORY; 279166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("getMemory for jpeg, ret = NO_MEMORY"); 279266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 279366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 279466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(jpeg_mem->data, saveName, strlen(saveName)); 279566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 279666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Calling upperlayer callback to store JPEG image"); 279766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_release_data_t release_data; 279866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&release_data, 0, sizeof(qcamera_release_data_t)); 279966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin release_data.data = jpeg_mem; 280066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin release_data.unlinkFile = true; 280166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("[KPI Perf]: PROFILE_JPEG_CB "); 280266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pme->sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE, 280366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_mem, 280466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 0, 280566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL, 280666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &release_data, 280766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_idx); 280866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 280966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 281066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinend: 281166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(job_data); 281266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 281366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 281466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_EXIT: 281566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("save thread exit"); 281666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin running = 0; 281766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 281866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 281966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 282066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 282166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (running); 282266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X"); 282366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 282466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 282566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 282666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 282766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dataProcessRoutine 282866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 282966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: data process routine that handles input data either from input 283066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Jpeg Queue to do jpeg encoding, or from input PP Queue to do 283166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * reprocess. 283266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 283366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 283466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : user data ptr (QCameraPostProcessor) 283566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 283666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 283766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 283866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid *QCameraPostProcessor::dataProcessRoutine(void *data) 283966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 284066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int running = 1; 284166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int ret; 284266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t is_active = FALSE; 284366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *pme = (QCameraPostProcessor *)data; 284466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraCmdThread *cmdThread = &pme->m_dataProcTh; 284566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cmdThread->setName("CAM_DataProc"); 284666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 284766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("E"); 284866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 284966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin do { 285066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = cam_sem_wait(&cmdThread->cmd_sem); 285166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != 0 && errno != EINVAL) { 285266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("cam_sem_wait error (%s)", 285366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin strerror(errno)); 285466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 285566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 285666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (ret != 0); 285766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 285866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we got notified about new cmd avail in cmd queue 285966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_cmd_type_t cmd = cmdThread->getCmd(); 286066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (cmd) { 286166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_START_DATA_PROC: 286266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("start data proc"); 286366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_active = TRUE; 286466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 286566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_ongoingPPQ.init(); 286666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputJpegQ.init(); 286766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputPPQ.init(); 286866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputRawQ.init(); 286966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 287066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_saveProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, 287166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin FALSE, 287266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin FALSE); 287366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 287466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // signal cmd is completed 287566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&cmdThread->sync_sem); 287666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 287766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 287866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_STOP_DATA_PROC: 287966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 288066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("stop data proc"); 288166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin is_active = FALSE; 288266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 288366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_saveProcTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, 288466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TRUE, 288566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin TRUE); 288666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // cancel all ongoing jpeg jobs 288766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t *jpeg_job = 288866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_jpeg_data_t *)pme->m_ongoingJpegQ.dequeue(); 288966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while (jpeg_job != NULL) { 289066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegHandle.abort_job(jpeg_job->jobId); 289166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 289266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseJpegJobData(jpeg_job); 289366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpeg_job); 289466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 289566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job = (qcamera_jpeg_data_t *)pme->m_ongoingJpegQ.dequeue(); 289666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 289766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 289866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // destroy jpeg encoding session 289966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( 0 < pme->mJpegSessionId ) { 290066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegHandle.destroy_session(pme->mJpegSessionId); 290166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mJpegSessionId = 0; 290266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 290366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 290466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // free jpeg out buf and exif obj 290566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin FREE_JPEG_OUTPUT_BUFFER(pme->m_pJpegOutputMem, 290666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_JpegOutputMemCount); 290766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 290866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->m_pJpegExifObj != NULL) { 290966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pme->m_pJpegExifObj; 291066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_pJpegExifObj = NULL; 291166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 291266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 291366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flush ongoing postproc Queue 291466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_ongoingPPQ.flush(); 291566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 291666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flush input jpeg Queue 291766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputJpegQ.flush(); 291866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 291966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flush input Postproc Queue 292066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputPPQ.flush(); 292166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 292266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flush input raw Queue 292366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputRawQ.flush(); 292466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 292566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // signal cmd is completed 292666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_sem_post(&cmdThread->sync_sem); 292766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 292866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mNewJpegSessionNeeded = true; 292966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 293066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 293166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_DO_NEXT_JOB: 293266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 293366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Do next job, active is %d", is_active); 293466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (is_active == TRUE) { 293566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t *jpeg_job = 293666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_jpeg_data_t *)pme->m_inputJpegQ.dequeue(); 293766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 293866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != jpeg_job) { 293966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // To avoid any race conditions, 294066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // sync any stream specific parameters here. 294166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->m_parent->mParameters.isAdvCamFeaturesEnabled()) { 294266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Sync stream params, only if advanced features configured 294366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Reduces the latency for normal snapshot. 294466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->syncStreamParams(jpeg_job->src_frame, NULL); 294566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 294666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 294766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // add into ongoing jpeg job Q 294866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pme->m_ongoingJpegQ.enqueue((void *)jpeg_job)) { 294966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pme->encodeData(jpeg_job, 295066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->mNewJpegSessionNeeded); 295166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 295266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // dequeue the last one 295366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_ongoingJpegQ.dequeue(false); 295466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseJpegJobData(jpeg_job); 295566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpeg_job); 295666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job = NULL; 295766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); 295866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 295966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 296066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("m_ongoingJpegQ is not active!!!"); 296166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseJpegJobData(jpeg_job); 296266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpeg_job); 296366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin jpeg_job = NULL; 296466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 296566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 296666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 296766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 296866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // process raw data if any 296966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *super_buf = 297066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_camera_super_buf_t *)pme->m_inputRawQ.dequeue(); 297166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 297266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 297366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //play shutter sound 297466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_parent->playShutter(); 297566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pme->processRawImageImpl(super_buf); 297666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 297766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseSuperBuf(super_buf); 297866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 297966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); 298066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 298166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 298266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 298366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pme->doReprocess(); 298466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != ret) { 298566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); 298666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 298766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = pme->stopCapture(); 298866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 298966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 299066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 299166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // not active, simply return buf and do no op 299266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t *jpeg_data = 299366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_jpeg_data_t *)pme->m_inputJpegQ.dequeue(); 299466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != jpeg_data) { 299566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseJpegJobData(jpeg_data); 299666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(jpeg_data); 299766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 299866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *super_buf = 299966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mm_camera_super_buf_t *)pme->m_inputRawQ.dequeue(); 300066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != super_buf) { 300166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->releaseSuperBuf(super_buf); 300266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(super_buf); 300366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 300566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // flush input Postproc Queue 300666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pme->m_inputPPQ.flush(); 300766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 300966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 301066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case CAMERA_CMD_TYPE_EXIT: 301166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin running = 0; 301266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 301366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin default: 301466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 301566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 301666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } while (running); 301766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("X"); 301866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 301966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 302066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 302166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 302266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : doReprocess 302366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 302466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Trigger channel reprocessing 302566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 302666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :None 302766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 302866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 302966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 303066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 303166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 303266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::doReprocess() 303366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 303466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t ret = NO_ERROR; 303566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *m_pSrcChannel = NULL; 303666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pMetaStream = NULL; 303766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t meta_buf_index = 0; 303866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *meta_buf = NULL; 303966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *ppInputFrame = NULL; 304066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 304166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_pp_data_t *ppreq_job = (qcamera_pp_data_t *)m_inputPPQ.peek(); 304266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ppreq_job == NULL) || (ppreq_job->src_frame == NULL)) { 304366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 304466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 304566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 304666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!validatePostProcess(ppreq_job->src_frame)) { 304766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 304866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 304966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 305066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppreq_job = (qcamera_pp_data_t *)m_inputPPQ.dequeue(); 305166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ppreq_job == NULL || ppreq_job->src_frame == NULL || 305266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppreq_job->src_reproc_frame == NULL) { 305366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 305466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 305566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 305666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *src_frame = ppreq_job->src_frame; 305766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_super_buf_t *src_reproc_frame = ppreq_job->src_reproc_frame; 305866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t mCurReprocCount = ppreq_job->reprocCount; 305966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int8_t mCurChannelIdx = ppreq_job->ppChannelIndex; 306066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 306166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("frame = %p src_frame = %p mCurReprocCount = %d mCurChannelIdx = %d", 306266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin src_frame,src_reproc_frame,mCurReprocCount, mCurChannelIdx); 306366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 306466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((m_parent->mParameters.getManualCaptureMode() >= 306566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_MANUAL_CAPTURE_TYPE_3) && (mCurChannelIdx == 0)) { 306666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppInputFrame = src_reproc_frame; 306766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 306866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppInputFrame = src_frame; 306966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 307066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3071d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (mPPChannelCount >= CAM_PP_CHANNEL_MAX) { 3072d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch LOGE("invalid channel count"); 3073d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch return UNKNOWN_ERROR; 3074d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 3075d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch 307666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find meta data stream and index of meta data frame in the superbuf 307766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t j = 0; j < mPPChannelCount; j++) { 307866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin /*First search in src buffer for any offline metadata */ 3079d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch for (uint32_t i = 0; i < src_frame->num_bufs; i++) { 308066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = mPPChannels[j]->getStreamByHandle( 308166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin src_frame->bufs[i]->stream_id); 308266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL && pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)) { 308366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf_index = (uint8_t) src_frame->bufs[i]->buf_idx; 308466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaStream = pStream; 308566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf = src_frame->bufs[i]; 308666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 308766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 308866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 308966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 309066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pMetaStream != NULL) && (meta_buf != NULL)) { 309166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Found Offline stream metadata = %d", 309266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (int)meta_buf_index); 309366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 309466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 309566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 309666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 309766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pMetaStream == NULL) && (meta_buf == NULL)) { 309866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t j = 0; j < mPPChannelCount; j++) { 309966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pSrcChannel = mPPChannels[j]->getSrcChannel(); 310066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_pSrcChannel == NULL) 310166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 3102d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch for (uint32_t i = 0; i < src_reproc_frame->num_bufs; i++) { 310366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = 310466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pSrcChannel->getStreamByHandle( 310566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin src_reproc_frame->bufs[i]->stream_id); 310666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL && pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 310766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf_index = (uint8_t) src_reproc_frame->bufs[i]->buf_idx; 310866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMetaStream = pStream; 310966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf = src_reproc_frame->bufs[i]; 311066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 311166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pMetaStream != NULL) && (meta_buf != NULL)) { 311466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("Found Meta data info for reprocessing index = %d", 311566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (int)meta_buf_index); 311666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 311766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 311966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 312066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 312166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->mParameters.isAdvCamFeaturesEnabled()) { 312266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // No need to sync stream params, if none of the advanced features configured 312366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Reduces the latency for normal snapshot. 312466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin syncStreamParams(src_frame, src_reproc_frame); 312566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 312666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mPPChannels[mCurChannelIdx] != NULL) { 312766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // add into ongoing PP job Q 312866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppreq_job->reprocCount = (int8_t) (mCurReprocCount + 1); 312966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 313066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((m_parent->isRegularCapture()) || (ppreq_job->offline_buffer)) { 313166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bufCountPPQ++; 313266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_ongoingPPQ.enqueue((void *)ppreq_job)) { 3133c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch pthread_mutex_lock(&m_reprocess_lock); 313466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = mPPChannels[mCurChannelIdx]->doReprocessOffline(ppInputFrame, 313566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf, m_parent->mParameters); 313666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 3137c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch pthread_mutex_unlock(&m_reprocess_lock); 313866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 313966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 314066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 314166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((ppreq_job->offline_buffer) && 314266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (ppreq_job->offline_reproc_buf)) { 314366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPPChannels[mCurChannelIdx]->doReprocessOffline( 314466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppreq_job->offline_reproc_buf, meta_buf); 314566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 3146c8c0af529045368f33aea08ead0bc4a8e9c41c98Steve Pfetsch pthread_mutex_unlock(&m_reprocess_lock); 314766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 314866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("m_ongoingPPQ is not active!!!"); 314966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = UNKNOWN_ERROR; 315066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 315166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 315266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 315366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bufCountPPQ++; 315466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_ongoingPPQ.enqueue((void *)ppreq_job)) { 315566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("m_ongoingJpegQ is not active!!!"); 315666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = UNKNOWN_ERROR; 315766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 315866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 315966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 316066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t numRequiredPPQBufsForSingleOutput = (int32_t) 316166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getNumberInBufsForSingleShot(); 316266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 316366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bufCountPPQ % numRequiredPPQBufsForSingleOutput == 0) { 316466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t extra_pp_job_count = 316566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getNumberOutBufsForSingleShot() - 316666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters.getNumberInBufsForSingleShot(); 316766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 316866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int32_t i = 0; i < extra_pp_job_count; i++) { 316966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_pp_data_t *extra_pp_job = 317066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (qcamera_pp_data_t *)calloc(1, sizeof(qcamera_pp_data_t)); 317166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!extra_pp_job) { 317266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for qcamera_pp_data_t"); 317366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = NO_MEMORY; 317466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 317566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 317666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin extra_pp_job->reprocCount = ppreq_job->reprocCount; 317766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_ongoingPPQ.enqueue((void *)extra_pp_job)) { 317866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("m_ongoingJpegQ is not active!!!"); 317966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseOngoingPPData(extra_pp_job, this); 318066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(extra_pp_job); 318166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin extra_pp_job = NULL; 318266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin goto end; 318366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 318466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 318566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 318666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 318766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = mPPChannels[mCurChannelIdx]->doReprocess(ppInputFrame, 318866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_parent->mParameters, pMetaStream, meta_buf_index); 318966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 319066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 319166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Reprocess channel is NULL"); 319266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret = UNKNOWN_ERROR; 319366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 319466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 319566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinend: 319666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ret != NO_ERROR) { 319766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin releaseOngoingPPData(ppreq_job, this); 319866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (ppreq_job != NULL) { 319966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(ppreq_job); 320066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ppreq_job = NULL; 320166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 320266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 320366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return ret; 320466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 320566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 320666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 320766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getReprocChannel 320866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 320966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Returns reprocessing channel handle 321066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 321166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : index for reprocessing array 321266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 321366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : QCameraReprocessChannel * type of pointer 321466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL if no reprocessing channel 321566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 321666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel * QCameraPostProcessor::getReprocChannel(uint8_t index) 321766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 321866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (index >= mPPChannelCount) { 321966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid index value"); 322066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 322166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 322266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mPPChannels[index]; 322366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 322466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 322566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 322666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopCapture 322766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 322866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Trigger image capture stop 322966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 323066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 323166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * None 323266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 323366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 323466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 323566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 323666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 323766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::stopCapture() 323866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 323966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int rc = NO_ERROR; 324066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 324166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_parent->isRegularCapture()) { 324266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_parent->processAPI( 324366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCAMERA_SM_EVT_STOP_CAPTURE_CHANNEL, 324466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin NULL); 324566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 324666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 324766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 324866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 324966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 325066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 325166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getJpegPaddingReq 325266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 325366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to add an entry to exif data 325466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 325566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 325666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @padding_info : jpeg specific padding requirement 325766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 325866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 325966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 326066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 326166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 326266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::getJpegPaddingReq(cam_padding_info_t &padding_info) 326366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 326466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // TODO: hardcode for now, needs to query from mm-jpeg-interface 326566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.width_padding = CAM_PAD_NONE; 326666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.height_padding = CAM_PAD_TO_16; 326766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.plane_padding = CAM_PAD_TO_WORD; 326866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.offset_info.offset_x = 0; 326966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding_info.offset_info.offset_y = 0; 327066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 327166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 327266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 327366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 327466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setYUVFrameInfo 327566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 327666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set Raw YUV frame data info for up-layer 327766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 327866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 327966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : process frame received from mm-camera-interface 328066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 328166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 328266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 328366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 328466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 328566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NOTE : currently we return frame len, y offset, cbcr offset and frame format 328666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 328766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPostProcessor::setYUVFrameInfo(mm_camera_super_buf_t *recvd_frame) 328866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 328966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pChannel = m_parent->getChannelByHandle(recvd_frame->ch_id); 329066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // check reprocess channel if not found 329166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 329266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int8_t i = 0; i < mPPChannelCount; i++) { 329366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mPPChannels[i] != NULL) && 329466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mPPChannels[i]->getMyHandle() == recvd_frame->ch_id)) { 329566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel = mPPChannels[i]; 329666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 329766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 329866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 329966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 330066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 330166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pChannel == NULL) { 330266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No corresponding channel (ch_id = %d) exist, return here", 330366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->ch_id); 330466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 330566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 330666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 330766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // find snapshot frame 330866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 330966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = 331066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pChannel->getStreamByHandle(recvd_frame->bufs[i]->stream_id); 331166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 331266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 331366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 331466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //get the main frame, use stream info 331566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t frame_offset; 331666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_dimension_t frame_dim; 331766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_format_t frame_fmt; 331866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin const char *fmt_string; 331966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameDimension(frame_dim); 332066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameOffset(frame_offset); 332166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFormat(frame_fmt); 332266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin fmt_string = m_parent->mParameters.getFrameFmtString(frame_fmt); 332366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 332466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int cbcr_offset = (int32_t)frame_offset.mp[0].len - 332566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_dim.width * frame_dim.height; 332666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 332766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("frame width=%d, height=%d, yoff=%d, cbcroff=%d, fmt_string=%s", 332866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame_dim.width, frame_dim.height, frame_offset.mp[0].offset, cbcr_offset, fmt_string); 332966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 333066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 333366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 333466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 333566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 333666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 333766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraPostProcessor::matchJobId(void *data, void *, void *match_data) 333866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 333966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin qcamera_jpeg_data_t * job = (qcamera_jpeg_data_t *) data; 334066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t job_id = *((uint32_t *) match_data); 334166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return job->jobId == job_id; 334266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 334366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 334466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 334566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getJpegMemory 334666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 334766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: buffer allocation function 334866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to pass to jpeg interface 334966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 335066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 335166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @out_buf : buffer descriptor struct 335266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 335366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 335466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 335566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 335666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 335766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCameraPostProcessor::getJpegMemory(omx_jpeg_ouput_buf_t *out_buf) 335866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 335966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Allocating jpeg out buffer of size: %d", out_buf->size); 336066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraPostProcessor *procInst = (QCameraPostProcessor *) out_buf->handle; 336166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *cam_mem = procInst->m_parent->mGetMemory(out_buf->fd, out_buf->size, 1U, 336266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin procInst->m_parent->mCallbackCookie); 336366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin out_buf->mem_hdl = cam_mem; 336466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin out_buf->vaddr = cam_mem->data; 336566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 336666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return 0; 336766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 336866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 336966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 337066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseJpegMemory 337166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 337266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release jpeg memory function 337366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * to pass to jpeg interface, in case of abort 337466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 337566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 337666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @out_buf : buffer descriptor struct 337766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 337866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 337966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 338066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 338166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 338266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCameraPostProcessor::releaseJpegMemory(omx_jpeg_ouput_buf_t *out_buf) 338366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 338466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (out_buf && out_buf->mem_hdl) { 338566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("releasing jpeg out buffer of size: %d", out_buf->size); 338666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_memory_t *cam_mem = (camera_memory_t*)out_buf->mem_hdl; 338766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_mem->release(cam_mem); 338866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin out_buf->mem_hdl = NULL; 338966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin out_buf->vaddr = NULL; 339066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 339166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 339266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 339366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 339466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 339566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 339666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraExif 339766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 339866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraExif 339966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 340066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 340166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 340266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 340366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 340466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraExif::QCameraExif() 340566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin : m_nNumEntries(0) 340666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 340766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(m_Entries, 0, sizeof(m_Entries)); 340866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 340966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 341066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 341166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraExif 341266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 341366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deconstructor of QCameraExif. Will release internal memory ptr. 341466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 341566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 341666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 341766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 341866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 341966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraExif::~QCameraExif() 342066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 342166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < m_nNumEntries; i++) { 342266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (m_Entries[i].tag_entry.type) { 342366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_BYTE: 342466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 342566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.count > 1 && 342666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._bytes != NULL) { 342766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._bytes); 342866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._bytes = NULL; 342966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 343266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_ASCII: 343366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 343466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.data._ascii != NULL) { 343566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._ascii); 343666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._ascii = NULL; 343766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 343966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 344066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_SHORT: 344166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 344266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.count > 1 && 344366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._shorts != NULL) { 344466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._shorts); 344566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._shorts = NULL; 344666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 344766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 344866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 344966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_LONG: 345066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 345166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.count > 1 && 345266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._longs != NULL) { 345366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._longs); 345466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._longs = NULL; 345566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 345666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 345766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 345866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_RATIONAL: 345966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 346066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.count > 1 && 346166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._rats != NULL) { 346266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._rats); 346366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._rats = NULL; 346466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 346566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 346666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 346766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_UNDEFINED: 346866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 346966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.data._undefined != NULL) { 347066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._undefined); 347166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._undefined = NULL; 347266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 347366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 347466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 347566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_SLONG: 347666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 347766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.count > 1 && 347866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._slongs != NULL) { 347966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._slongs); 348066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._slongs = NULL; 348166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 348266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 348366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 348466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_SRATIONAL: 348566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 348666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_Entries[i].tag_entry.count > 1 && 348766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._srats != NULL) { 348866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(m_Entries[i].tag_entry.data._srats); 348966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[i].tag_entry.data._srats = NULL; 349066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 349166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 349266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 349366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 349466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 349566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 349666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 349766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 349866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addEntry 349966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 350066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to add an entry to exif data 350166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 350266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 350366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @tagid : exif tag ID 350466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @type : data type 350566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @count : number of data in uint of its type 350666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : input data ptr 350766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 350866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 350966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 351066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 351166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 351266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraExif::addEntry(exif_tag_id_t tagid, 351366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin exif_tag_type_t type, 351466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t count, 351566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *data) 351666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 351766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 351866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if(m_nNumEntries >= MAX_EXIF_TABLE_ENTRIES) { 351966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Number of entries exceeded limit"); 352066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 352166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 352266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 352366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_id = tagid; 352466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.type = type; 352566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.count = count; 352666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.copy = 1; 352766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin switch (type) { 352866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_BYTE: 352966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 353066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (count > 1) { 353166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t *values = (uint8_t *)malloc(count); 353266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (values == NULL) { 353366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for byte array"); 353466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 353566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 353666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(values, data, count); 353766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._bytes = values; 353866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 353966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 354066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._byte = *(uint8_t *)data; 354166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 354266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 354366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 354466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_ASCII: 354566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 354666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin char *str = NULL; 354766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin str = (char *)malloc(count + 1); 354866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (str == NULL) { 354966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for ascii string"); 355066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 355166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 355266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(str, 0, count + 1); 355366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(str, data, count); 355466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._ascii = str; 355566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 355666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 355766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 355866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_SHORT: 355966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 3560d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch uint16_t *exif_data = (uint16_t *)data; 356166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (count > 1) { 356266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint16_t *values = (uint16_t *)malloc(count * sizeof(uint16_t)); 356366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (values == NULL) { 356466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for short array"); 356566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 356666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 3567d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch memcpy(values, exif_data, count * sizeof(uint16_t)); 356866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._shorts = values; 356966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 357066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 357166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._short = *(uint16_t *)data; 357266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 357366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 357466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 357566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_LONG: 357666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 3577d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch uint32_t *exif_data = (uint32_t *)data; 357866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (count > 1) { 357966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t *values = (uint32_t *)malloc(count * sizeof(uint32_t)); 358066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (values == NULL) { 358166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for long array"); 358266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 358366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 3584d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch memcpy(values, exif_data, count * sizeof(uint32_t)); 358566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._longs = values; 358666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 358766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 358866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._long = *(uint32_t *)data; 358966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 359066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 359166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 359266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_RATIONAL: 359366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 3594d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch rat_t *exif_data = (rat_t *)data; 359566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (count > 1) { 359666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rat_t *values = (rat_t *)malloc(count * sizeof(rat_t)); 359766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (values == NULL) { 359866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for rational array"); 359966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 360066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 3601d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch memcpy(values, exif_data, count * sizeof(rat_t)); 360266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._rats = values; 360366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 360566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._rat = *(rat_t *)data; 360666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 360866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 360966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_UNDEFINED: 361066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 361166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t *values = (uint8_t *)malloc(count); 361266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (values == NULL) { 361366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for undefined array"); 361466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 361566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 361666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memcpy(values, data, count); 361766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._undefined = values; 361866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 361966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 362066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 362166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_SLONG: 362266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 3623d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch uint32_t *exif_data = (uint32_t *)data; 362466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (count > 1) { 362566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t *values = (int32_t *)malloc(count * sizeof(int32_t)); 362666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (values == NULL) { 362766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for signed long array"); 362866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 362966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 3630d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch memcpy(values, exif_data, count * sizeof(int32_t)); 363166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._slongs = values; 363266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 363366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 363466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._slong = *(int32_t *)data; 363566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 363666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 363766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 363866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin case EXIF_SRATIONAL: 363966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin { 3640d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch srat_t *exif_data = (srat_t *)data; 364166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (count > 1) { 364266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin srat_t *values = (srat_t *)malloc(count * sizeof(srat_t)); 364366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (values == NULL) { 364466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for signed rational array"); 364566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 364666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 3647d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch memcpy(values, exif_data, count * sizeof(srat_t)); 364866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._srats = values; 364966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 365066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 365166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_Entries[m_nNumEntries].tag_entry.data._srat = *(srat_t *)data; 365266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 365366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 365466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 365566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 365666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 365766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Increase number of entries 365866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_nNumEntries++; 365966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 366066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 366166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 366266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 3663