16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* Redistribution and use in source and binary forms, with or without 46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* modification, are permitted provided that the following conditions are 56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* met: 66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions of source code must retain the above copyright 76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* notice, this list of conditions and the following disclaimer. 86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions in binary form must reproduce the above 96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* copyright notice, this list of conditions and the following 106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* disclaimer in the documentation and/or other materials provided 116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* with the distribution. 126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Neither the name of The Linux Foundation nor the names of its 136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* contributors may be used to endorse or promote products derived 146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* from this software without specific prior written permission. 156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*/ 296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define LOG_TAG "QCameraPostProc" 316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <stdlib.h> 336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/Errors.h> 346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h" 366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraPostProc.h" 376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera { 396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraPostProcessor 426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraPostProcessor. 446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_ctrl : ptr to HWI object 476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPostProcessor::QCameraPostProcessor(QCamera2HardwareInterface *cam_ctrl) 516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev : m_parent(cam_ctrl), 526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegCB(NULL), 536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegUserData(NULL), 546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegClientHandle(0), 556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegSessionId(0), 566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegOutputMem(NULL), 576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegExifObj(NULL), 586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bThumbnailNeeded(TRUE), 596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pReprocChannel(NULL), 606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_inputPPQ(releasePPInputData, this), 616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_ongoingPPQ(releaseOngoingPPData, this), 626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_inputJpegQ(releaseJpegData, this), 636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_ongoingJpegQ(releaseJpegData, this), 646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_inputRawQ(releasePPInputData, this) 656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&mJpegHandle, 0, sizeof(mJpegHandle)); 676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCameraPostProcessor 716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: deconstructor of QCameraPostProcessor. 736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPostProcessor::~QCameraPostProcessor() 796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pJpegOutputMem != NULL) { 816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegOutputMem->deallocate(); 826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pJpegOutputMem; 836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegOutputMem = NULL; 846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pJpegExifObj != NULL) { 866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pJpegExifObj; 876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegExifObj = NULL; 886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pReprocChannel != NULL) { 906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pReprocChannel->stop(); 916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pReprocChannel; 926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pReprocChannel = NULL; 936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : init 986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: initialization of postprocessor 1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @jpeg_cb : callback to handle jpeg event from mm-camera-interface 1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user_data : user data ptr for jpeg callback 1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::init(jpeg_encode_callback_t jpeg_cb, void *user_data) 1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegCB = jpeg_cb; 1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegUserData = user_data; 1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegClientHandle = jpeg_open(&mJpegHandle); 1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(!mJpegClientHandle) { 1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : jpeg_open did not work", __func__); 1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.launch(dataProcessRoutine, this); 1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : deinit 1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: de-initialization of postprocessor 1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::deinit() 1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.exit(); 1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(mJpegClientHandle > 0) { 1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = mJpegHandle.close(mJpegClientHandle); 1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Jpeg closed, rc = %d, mJpegClientHandle = %x", 1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, rc, mJpegClientHandle); 1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mJpegClientHandle = 0; 1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&mJpegHandle, 0, sizeof(mJpegHandle)); 1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : start 1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start postprocessor. Data process thread and data notify thread 1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * will be launched. 1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pSrcChannel : source channel obj ptr that possibly needs reprocess 1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : if any reprocess is needed, a reprocess channel/stream 1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * will be started. 1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::start(QCameraChannel *pSrcChannel) 1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_parent->needReprocess()) { 1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pReprocChannel != NULL) { 1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pReprocChannel; 1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pReprocChannel = NULL; 1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // if reprocess is needed, start reprocess channel 1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pReprocChannel = m_parent->addOnlineReprocChannel(pSrcChannel); 1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pReprocChannel == NULL) { 1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot add reprocess channel", __func__); 1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 18272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li rc = m_pReprocChannel->start(); 1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != 0) { 1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot start reprocess channel", __func__); 1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pReprocChannel; 1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pReprocChannel = NULL; 1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, FALSE); 1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->m_cbNotifier.startSnapshots(); 1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stop 1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop postprocessor. Data process and notify thread will be stopped. 2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : reprocess channel will be stopped and deleted if there is any 2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::stop() 2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->m_cbNotifier.stopSnapshots(); 2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // dataProc Thread need to process "stop" as sync call because abort jpeg job should be a sync call 2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, TRUE, TRUE); 2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getJpegEncodingConfig 2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to prepare encoding job information 2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @encode_parm : param to be filled with encoding configuration 2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::getJpegEncodingConfig(mm_jpeg_encode_params_t& encode_parm, 2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *main_stream, 2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *thumb_stream) 2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s : E", __func__); 2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = NO_ERROR; 2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *jpeg_mem = NULL; 2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.jpeg_cb = mJpegCB; 2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.userdata = mJpegUserData; 2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bThumbnailNeeded = TRUE; // need encode thumbnail by default 2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_dimension_t thumbnailSize; 2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&thumbnailSize, 0, sizeof(cam_dimension_t)); 2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->getThumbnailSize(thumbnailSize); 246744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (thumbnailSize.width == 0 || thumbnailSize.height == 0) { 2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // (0,0) means no thumbnail 2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bThumbnailNeeded = FALSE; 2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.encode_thumbnail = m_bThumbnailNeeded; 2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // get color format 2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_format_t img_fmt = CAM_FORMAT_YUV_420_NV12; 2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev main_stream->getFormat(img_fmt); 2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.color_format = getColorfmtFromImgFmt(img_fmt); 2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // get jpeg quality 2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.quality = m_parent->getJpegQuality(); 2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (encode_parm.quality <= 0) { 2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.quality = 85; 2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // get exif data 2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pJpegExifObj != NULL) { 2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pJpegExifObj; 2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegExifObj = NULL; 2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegExifObj = m_parent->getExifData(); 2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pJpegExifObj != NULL) { 2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.exif_info.exif_data = m_pJpegExifObj->getEntries(); 2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.exif_info.numOfEntries = m_pJpegExifObj->getNumOfEntries(); 2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_frame_len_offset_t main_offset; 2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&main_offset, 0, sizeof(cam_frame_len_offset_t)); 2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev main_stream->getFrameOffset(main_offset); 2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // src buf config 2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraMemory *pStreamMem = main_stream->getStreamBufs(); 2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStreamMem == NULL) { 2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot get stream bufs from main stream", __func__); 2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = BAD_VALUE; 2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto on_error; 2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.num_src_bufs = pStreamMem->getCnt(); 2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (uint32_t i = 0; i < encode_parm.num_src_bufs; i++) { 2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *stream_mem = pStreamMem->getMemory(i, false); 2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (stream_mem != NULL) { 2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_main_buf[i].index = i; 2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_main_buf[i].buf_size = stream_mem->size; 2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_main_buf[i].buf_vaddr = (uint8_t *)stream_mem->data; 2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_main_buf[i].fd = pStreamMem->getFd(i); 2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_main_buf[i].format = MM_JPEG_FMT_YUV; 2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_main_buf[i].offset = main_offset; 2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_bThumbnailNeeded == TRUE) { 2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (thumb_stream == NULL) { 3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_stream = main_stream; 3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStreamMem = thumb_stream->getStreamBufs(); 3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStreamMem == NULL) { 3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cannot get stream bufs from thumb stream", __func__); 3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = BAD_VALUE; 3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto on_error; 3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_frame_len_offset_t thumb_offset; 3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&thumb_offset, 0, sizeof(cam_frame_len_offset_t)); 3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_stream->getFrameOffset(thumb_offset); 311a1073a9efa1819daac891932fb928d785a5a1008Kamen Kirov encode_parm.num_tmb_bufs = pStreamMem->getCnt(); 3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < pStreamMem->getCnt(); i++) { 3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *stream_mem = pStreamMem->getMemory(i, false); 3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (stream_mem != NULL) { 3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_thumb_buf[i].index = i; 3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_thumb_buf[i].buf_size = stream_mem->size; 3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_thumb_buf[i].buf_vaddr = (uint8_t *)stream_mem->data; 3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_thumb_buf[i].fd = pStreamMem->getFd(i); 3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_thumb_buf[i].format = MM_JPEG_FMT_YUV; 3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.src_thumb_buf[i].offset = thumb_offset; 3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // allocate output buf for jpeg encoding 3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pJpegOutputMem != NULL) { 3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegOutputMem->deallocate(); 3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pJpegOutputMem; 3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegOutputMem = NULL; 3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 331744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy m_pJpegOutputMem = new QCameraStreamMemory(m_parent->mGetMemory, 332744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy QCAMERA_ION_USE_CACHE); 3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == m_pJpegOutputMem) { 3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = NO_MEMORY; 3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : No memory for m_pJpegOutputMem", __func__); 3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto on_error; 3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = m_pJpegOutputMem->allocate(1, main_offset.frame_len); 3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(ret != OK) { 3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = NO_MEMORY; 3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : No memory for m_pJpegOutputMem", __func__); 3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto on_error; 3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_mem = m_pJpegOutputMem->getMemory(0, false); 3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == jpeg_mem) { 3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = NO_MEMORY; 3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : initHeapMem for jpeg, ret = NO_MEMORY", __func__); 3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto on_error; 3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.num_dst_bufs = 1; 3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.dest_buf[0].index = 0; 3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.dest_buf[0].buf_size = jpeg_mem->size; 3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.dest_buf[0].buf_vaddr = (uint8_t *)jpeg_mem->data; 3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.dest_buf[0].fd = m_pJpegOutputMem->getFd(0); 3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.dest_buf[0].format = MM_JPEG_FMT_YUV; 3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev encode_parm.dest_buf[0].offset = main_offset; 3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s : X", __func__); 3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevon_error: 3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pJpegOutputMem != NULL) { 3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegOutputMem->deallocate(); 3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pJpegOutputMem; 3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegOutputMem = NULL; 3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pJpegExifObj != NULL) { 3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete m_pJpegExifObj; 3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pJpegExifObj = NULL; 3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s : X with error %d", __func__, ret); 3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 3736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : sendEvtNotify 3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send event notify through notify callback registered by upper layer 3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type: msg type of notify 3826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ext1 : extension 3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ext2 : extension 3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::sendEvtNotify(int32_t msg_type, 3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ext1, 3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ext2) 3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return m_parent->sendEvtNotify(msg_type, ext1, ext2); 3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : sendDataNotify 3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enqueue data into dataNotify thread 4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msg_type: data callback msg type 4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : ptr to data memory struct 4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @index : index to data buffer 4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @metadata: ptr to meta data buffer if there is any 4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @release_data : ptr to struct indicating if data need to be released 4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * after notify 4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::sendDataNotify(int32_t msg_type, 4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *data, 4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t index, 4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_frame_metadata_t *metadata, 4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_release_data_t *release_data) 4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_data_argm_t *data_cb = (qcamera_data_argm_t *)malloc(sizeof(qcamera_data_argm_t)); 4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == data_cb) { 4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for acamera_data_argm_t", __func__); 4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(data_cb, 0, sizeof(qcamera_data_argm_t)); 4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev data_cb->msg_type = msg_type; 4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev data_cb->data = data; 4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev data_cb->index = index; 4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev data_cb->metadata = metadata; 4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (release_data != NULL) { 4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev data_cb->release_data = *release_data; 4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_DATA_SNAPSHOT_CALLBACK; 4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = msg_type; 4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.data = data; 4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.metadata = metadata; 4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.user_data = data_cb; 4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cookie = this; 4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.release_cb = releaseNotifyData; 4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int rc = m_parent->m_cbNotifier.notifyCallback(cbArg); 4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NO_ERROR != rc ) { 4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Error enqueuing jpeg data into notify queue", __func__); 4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(data_cb); 4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processData 4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enqueue data into dataProc thread 4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @frame : process frame received from mm-camera-interface 4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : depends on if offline reprocess is needed, received frame will 4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * be sent to either input queue of postprocess or jpeg encoding 4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::processData(mm_camera_super_buf_t *frame) 4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_parent->needReprocess()) { 4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: need reprocess", __func__); 4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // enqueu to post proc input queue 4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_inputPPQ.enqueue((void *)frame); 4737fde32d818742141a39fda194e66b84109182affEmilian Peev } else if (m_parent->mParameters.isNV16PictureFormat()) { 4747fde32d818742141a39fda194e66b84109182affEmilian Peev processRawData(frame); 4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: no need offline reprocess, sending to jpeg encoding", __func__); 4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_data_t *jpeg_job = 4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (qcamera_jpeg_data_t *)malloc(sizeof(qcamera_jpeg_data_t)); 4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (jpeg_job == NULL) { 4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for jpeg job", __func__); 4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(jpeg_job, 0, sizeof(qcamera_jpeg_data_t)); 4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_job->src_frame = frame; 4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // enqueu to jpeg input queue 4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_inputJpegQ.enqueue((void *)jpeg_job); 4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processRawData 4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enqueue raw data into dataProc thread 4996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @frame : process frame received from mm-camera-interface 5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::processRawData(mm_camera_super_buf_t *frame) 5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // enqueu to raw input queue 5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_inputRawQ.enqueue((void *)frame); 5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processJpegEvt 5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process jpeg event from mm-jpeg-interface. 5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @evt : payload of jpeg event, including information about jpeg encoding 5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * status, jpeg size and so on. 5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : This event will also trigger DataProc thread to move to next job 5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * processing (i.e., send a new jpeg encoding job to mm-jpeg-interface 5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * if there is any pending job in jpeg input queue) 5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::processJpegEvt(qcamera_jpeg_evt_payload_t *evt) 5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *jpeg_mem = NULL; 5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // find job by jobId 5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_data_t *job = findJpegJobByJobId(evt->jobId); 5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (job == NULL) { 5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Cannot find jpeg job by jobId(%d)", __func__, evt->jobId); 5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = BAD_VALUE; 5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto end; 5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 546fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s : jpeg job %d", __func__, evt->jobId); 547fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li 5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_parent->mDataCb == NULL || 5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->msgTypeEnabledWithLock(CAMERA_MSG_COMPRESSED_IMAGE) == 0 ) { 5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: No dataCB or CAMERA_MSG_COMPRESSED_IMAGE not enabled", 5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__); 5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_ERROR; 5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto end; 5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(evt->status == JPEG_JOB_STATUS_ERROR) { 5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Error event handled from jpeg, status = %d", 5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, evt->status); 5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = FAILED_TRANSACTION; 5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto end; 5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->dumpFrameToFile(evt->out_data.buf_vaddr, 5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev evt->out_data.buf_filled_len, 5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev evt->jobId, 5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCAMERA_DUMP_FRM_JPEG); 5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: Dump jpeg_size=%d", __func__, evt->out_data.buf_filled_len); 5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // alloc jpeg memory to pass to upper layer 5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_mem = m_parent->mGetMemory(-1, evt->out_data.buf_filled_len, 1, m_parent->mCallbackCookie); 5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == jpeg_mem) { 5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : getMemory for jpeg, ret = NO_MEMORY", __func__); 5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev goto end; 5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(jpeg_mem->data, evt->out_data.buf_vaddr, evt->out_data.buf_filled_len); 5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : Calling upperlayer callback to store JPEG image", __func__); 5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_release_data_t release_data; 5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&release_data, 0, sizeof(qcamera_release_data_t)); 5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev release_data.data = jpeg_mem; 5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE, 5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_mem, 5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0, 5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL, 5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev &release_data); 5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevend: 5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // send error msg to upper layer 59128a189e17a0c825b01fb3e0f092c150578787f73Muhua Li sendEvtNotify(CAMERA_MSG_ERROR, 59228a189e17a0c825b01fb3e0f092c150578787f73Muhua Li UNKNOWN_ERROR, 59328a189e17a0c825b01fb3e0f092c150578787f73Muhua Li 0); 5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != jpeg_mem) { 5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_mem->release(jpeg_mem); 5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_mem = NULL; 5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // release internal data for jpeg job 6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (job != NULL) { 6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev releaseJpegJobData(job); 6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(job); 6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // wait up data proc thread to do next job, 6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // if previous request is blocked due to ongoing jpeg job 6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processPPData 6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process received frame after reprocess. 6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @frame : received frame from reprocess channel. 6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : The frame after reprocess need to send to jpeg encoding. 6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::processPPData(mm_camera_super_buf_t *frame) 6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_pp_data_t *job = (qcamera_pp_data_t *)m_ongoingPPQ.dequeue(); 6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (job == NULL || job->src_frame == NULL) { 6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Cannot find reprocess job", __func__); 6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 637744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (m_parent->mParameters.isNV16PictureFormat()) { 638744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy releaseSuperBuf(job->src_frame); 639744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy free(job->src_frame); 640744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy free(job); 641744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy return processRawData(frame); 642744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } 643744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy 6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_data_t *jpeg_job = 6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (qcamera_jpeg_data_t *)malloc(sizeof(qcamera_jpeg_data_t)); 6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (jpeg_job == NULL) { 6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for jpeg job", __func__); 6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(jpeg_job, 0, sizeof(qcamera_jpeg_data_t)); 6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_job->src_frame = frame; 6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_job->src_reproc_frame = job->src_frame; 6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // free pp job buf 6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(job); 6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // enqueu reprocessed frame to jpeg input queue 6596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_inputJpegQ.enqueue((void *)jpeg_job); 6606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // wait up data proc thread 6626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataProcTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE); 6636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 6656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : findJpegJobByJobId 6696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: find a jpeg job from ongoing Jpeg queue by its job ID 6716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 6736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @jobId : job Id of the job 6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : ptr to a jpeg job struct. NULL if not found. 6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : Currently only one job is sending to mm-jpeg-interface for jpeg 6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * encoding. Therefore simply dequeue from the ongoing Jpeg Queue 6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * will serve the purpose to find the jpeg job. 6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevqcamera_jpeg_data_t *QCameraPostProcessor::findJpegJobByJobId(uint32_t jobId) 6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_data_t * job = NULL; 6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (jobId == 0) { 6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: not a valid jpeg jobId", __func__); 6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // currely only one jpeg job ongoing, so simply dequeue the head 6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev job = (qcamera_jpeg_data_t *)m_ongoingJpegQ.dequeue(); 6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return job; 6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releasePPInputData 6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: callback function to release post process input data node 6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : ptr to post process input data 7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user_data : user data ptr (QCameraReprocessor) 7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraPostProcessor::releasePPInputData(void *data, void *user_data) 7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data; 7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != pme) { 7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseSuperBuf((mm_camera_super_buf_t *)data); 7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseJpegData 7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: callback function to release jpeg job node 7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : ptr to ongoing jpeg job data 7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user_data : user data ptr (QCameraReprocessor) 7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraPostProcessor::releaseJpegData(void *data, void *user_data) 7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data; 7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != pme) { 7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseJpegJobData((qcamera_jpeg_data_t *)data); 7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseOngoingPPData 7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: callback function to release ongoing postprocess job node 7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : ptr to onging postprocess job 7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user_data : user data ptr (QCameraReprocessor) 7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraPostProcessor::releaseOngoingPPData(void *data, void *user_data) 7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPostProcessor *pme = (QCameraPostProcessor *)user_data; 7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != pme) { 7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_pp_data_t *pp_job = (qcamera_pp_data_t *)data; 7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != pp_job->src_frame) { 7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseSuperBuf(pp_job->src_frame); 7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(pp_job->src_frame); 7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_job->src_frame = NULL; 7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseNotifyData 7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to release internal resources in notify data struct 7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user_data : ptr user data 7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cookie : callback cookie 7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : deallocate jpeg heap memory if it's not NULL 7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraPostProcessor::releaseNotifyData(void *user_data, void *cookie) 7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_data_argm_t *app_cb = ( qcamera_data_argm_t * ) user_data; 7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPostProcessor *postProc = ( QCameraPostProcessor * ) cookie; 7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( ( NULL != app_cb ) && ( NULL != postProc ) ) { 7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (app_cb && NULL != app_cb->release_data.data) { 7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev app_cb->release_data.data->release(app_cb->release_data.data); 7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev app_cb->release_data.data = NULL; 7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (app_cb && NULL != app_cb->release_data.frame) { 7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev postProc->releaseSuperBuf(app_cb->release_data.frame); 7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(app_cb->release_data.frame); 7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev app_cb->release_data.frame = NULL; 7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(app_cb); 7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseSuperBuf 7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to release a superbuf frame by returning back to kernel 7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @super_buf : ptr to the superbuf frame 7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraPostProcessor::releaseSuperBuf(mm_camera_super_buf_t *super_buf) 7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 799744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy QCameraChannel *pChannel = NULL; 800744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy 8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != super_buf) { 802744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy pChannel = m_parent->getChannelByHandle(super_buf->ch_id); 803744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy 804744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if ( NULL == pChannel ) { 805744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (m_pReprocChannel != NULL && 806744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy m_pReprocChannel->getMyHandle() == super_buf->ch_id) { 807744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy pChannel = m_pReprocChannel; 808744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } 809744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } 810744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy 8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pChannel != NULL) { 8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel->bufDone(super_buf); 813744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } else { 814744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy ALOGE(" %s : Channel id %d not found!!", 815744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy __func__, 816744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy super_buf->ch_id); 8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseJpegJobData 8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to release internal resources in jpeg job struct 8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @job : ptr to jpeg job struct 8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE : original source frame need to be queued back to kernel for 8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * future use. Output buf of jpeg job need to be released since 8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * it's allocated for each job. Exif object need to be deleted. 8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraPostProcessor::releaseJpegJobData(qcamera_jpeg_data_t *job) 8366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s: E", __func__); 8386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != job) { 8396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != job->src_reproc_frame) { 8406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev releaseSuperBuf(job->src_reproc_frame); 8416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(job->src_reproc_frame); 8426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev job->src_reproc_frame = NULL; 8436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != job->src_frame) { 8466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev releaseSuperBuf(job->src_frame); 8476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(job->src_frame); 8486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev job->src_frame = NULL; 8496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s: X", __func__); 8526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 8556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getColorfmtFromImgFmt 8566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to return jpeg color format based on its image format 8586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 8606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @img_fmt : image format 8616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : jpeg color format that can be understandable by omx lib 8636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevmm_jpeg_color_format QCameraPostProcessor::getColorfmtFromImgFmt(cam_format_t img_fmt) 8656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (img_fmt) { 8676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_NV21: 8686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 8696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_NV21_ADRENO: 8706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 8716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_NV12: 8726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2; 8736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_YV12: 8746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V2; 8756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_422_NV61: 8766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V1; 8776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_422_NV16: 8786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_COLOR_FORMAT_YCBCRLP_H2V1; 8796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 8806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_COLOR_FORMAT_YCRCBLP_H2V2; 8816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 8856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getJpegImgTypeFromImgFmt 8866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to return jpeg encode image type based on its image format 8886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 8906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @img_fmt : image format 8916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : return jpeg source image format (YUV or Bitstream) 8936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevmm_jpeg_format_t QCameraPostProcessor::getJpegImgTypeFromImgFmt(cam_format_t img_fmt) 8956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (img_fmt) { 8976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_NV21: 8986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_NV21_ADRENO: 8996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_NV12: 9006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_420_YV12: 9016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_422_NV61: 9026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAM_FORMAT_YUV_422_NV16: 9036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_FMT_YUV; 9046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 9056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return MM_JPEG_FMT_YUV; 9066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 9086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 9106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : encodeData 9116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to prepare encoding job information and send to 9136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * mm-jpeg-interface to do the encoding job 9146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 9166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @jpeg_job_data : ptr to a struct saving job related information 9176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @needNewSess : flag to indicate if a new jpeg encoding session need 9186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * to be created. After creation, this flag will be toggled 9196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 9206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 9216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 9226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 9236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 9246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::encodeData(qcamera_jpeg_data_t *jpeg_job_data, 9256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t &needNewSess) 9266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 9276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s : E", __func__); 9286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t ret = NO_ERROR; 9296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_jpeg_job_t jpg_job; 9306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t jobId = 0; 9316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *main_stream = NULL; 9326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_buf_def_t *main_frame = NULL; 9336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *thumb_stream = NULL; 9346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_buf_def_t *thumb_frame = NULL; 9356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t *recvd_frame = jpeg_job_data->src_frame; 9366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // find channel 9386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pChannel = m_parent->getChannelByHandle(recvd_frame->ch_id); 9396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // check reprocess channel if not found 9406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pChannel == NULL) { 9416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pReprocChannel != NULL && 9426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pReprocChannel->getMyHandle() == recvd_frame->ch_id) { 9436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel = m_pReprocChannel; 9446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pChannel == NULL) { 9476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No corresponding channel (ch_id = %d) exist, return here", 9486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, recvd_frame->ch_id); 9496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 9506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // find snapshot frame and thumnail frame 9536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < recvd_frame->num_bufs; i++) { 9546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pStream = 9556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pChannel->getStreamByHandle(recvd_frame->bufs[i]->stream_id); 9566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream != NULL) { 9576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 958025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy pStream->isTypeOf(CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT) || 959025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 960025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy pStream->isOrignalTypeOf(CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT)) { 9616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev main_stream = pStream; 9626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev main_frame = recvd_frame->bufs[i]; 9636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 964744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 965744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) || 966744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) { 9676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_stream = pStream; 9686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_frame = recvd_frame->bufs[i]; 9696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(NULL == main_frame){ 9746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : Main frame is NULL", __func__); 9756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 9766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraMemory *memObj = (QCameraMemory *)main_frame->mem_info; 9796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == memObj) { 9806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s : Memeory Obj of main frame is NULL", __func__); 9816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 9826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // dump snapshot frame if enabled 9856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->dumpFrameToFile(main_frame->buffer, main_frame->frame_len, 9866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev main_frame->frame_idx, QCAMERA_DUMP_FRM_SNAPSHOT); 9876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // send upperlayer callback for raw image 9896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *mem = memObj->getMemory(main_frame->buf_idx, false); 9906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != m_parent->mDataCb && 9916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE) > 0) { 9926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 9936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 9946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_DATA_CALLBACK; 9956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = CAMERA_MSG_RAW_IMAGE; 9966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.data = mem; 9976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.index = 1; 9986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->m_cbNotifier.notifyCallback(cbArg); 9996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != m_parent->mNotifyCb && 10016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE_NOTIFY) > 0) { 10026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 10036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 10046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 10056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = CAMERA_MSG_RAW_IMAGE_NOTIFY; 10066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext1 = 0; 10076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext2 = 0; 10086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->m_cbNotifier.notifyCallback(cbArg); 10096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (thumb_frame != NULL) { 10126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // dump thumbnail frame if enabled 10136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->dumpFrameToFile(thumb_frame->buffer, thumb_frame->frame_len, 10146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_frame->frame_idx, QCAMERA_DUMP_FRM_THUMBNAIL); 10156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mJpegClientHandle <= 0) { 10186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Error: bug here, mJpegClientHandle is 0", __func__); 10196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 10206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (needNewSess) { 10236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // create jpeg encoding session 10246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_jpeg_encode_params_t encodeParam; 10256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&encodeParam, 0, sizeof(mm_jpeg_encode_params_t)); 10266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev getJpegEncodingConfig(encodeParam, main_stream, thumb_stream); 1027fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s : call jpeg create_session", __func__); 10286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mJpegHandle.create_session(mJpegClientHandle, &encodeParam, &mJpegSessionId); 10296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret != NO_ERROR) { 10306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: error creating a new jpeg encoding session", __func__); 10316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 10326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev needNewSess = FALSE; 10346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Fill in new job 10376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&jpg_job, 0, sizeof(mm_jpeg_job_t)); 10386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.job_type = JPEG_JOB_TYPE_ENCODE; 10396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.session_id = mJpegSessionId; 10406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.src_index = main_frame->buf_idx; 10416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.dst_index = 0; 10426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_rect_t crop; 10446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&crop, 0, sizeof(cam_rect_t)); 10456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev main_stream->getCropInfo(crop); 10466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_dimension_t src_dim; 10486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&src_dim, 0, sizeof(cam_dimension_t)); 10496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev main_stream->getFrameDimension(src_dim); 10506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // main dim 10526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.main_dim.src_dim = src_dim; 10536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.main_dim.dst_dim = src_dim; 10546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.main_dim.crop = crop; 10556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // thumbnail dim 10576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_bThumbnailNeeded == TRUE) { 10586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (thumb_stream == NULL) { 10596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // need jpeg thumbnail, but no postview/preview stream exists 10606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // we use the main stream/frame to encode thumbnail 10616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_stream = main_stream; 10626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_frame = main_frame; 10636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&crop, 0, sizeof(cam_rect_t)); 10656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_stream->getCropInfo(crop); 10666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&src_dim, 0, sizeof(cam_dimension_t)); 10676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev thumb_stream->getFrameDimension(src_dim); 10686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.thumb_dim.src_dim = src_dim; 10696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->getThumbnailSize(jpg_job.encode_job.thumb_dim.dst_dim); 1070744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy int rotation = m_parent->getJpegRotation(); 1071744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (rotation == 90 || rotation ==270) { 1072744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy // swap dimension if rotation is 90 or 270 1073744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy int32_t temp = jpg_job.encode_job.thumb_dim.dst_dim.height; 1074744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy jpg_job.encode_job.thumb_dim.dst_dim.height = 1075744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy jpg_job.encode_job.thumb_dim.dst_dim.width; 1076744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy jpg_job.encode_job.thumb_dim.dst_dim.width = temp; 1077744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } 10786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.thumb_dim.crop = crop; 10796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.thumb_index = thumb_frame->buf_idx; 10806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // set rotation only when no online rotation or offline pp rotation is done before 1083744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (!m_parent->needRotationReprocess()) { 10846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpg_job.encode_job.rotation = m_parent->getJpegRotation(); 10856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGV("%s: jpeg rotation is set to %d", __func__, jpg_job.encode_job.rotation); 10876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 10886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // find meta data frame 10896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_buf_def_t *meta_frame = NULL; 10906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < jpeg_job_data->src_frame->num_bufs; i++) { 10916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // look through input superbuf 10926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (jpeg_job_data->src_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 10936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev meta_frame = jpeg_job_data->src_frame->bufs[i]; 10946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 10956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 10976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (meta_frame == NULL && jpeg_job_data->src_reproc_frame != NULL) { 10986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // look through reprocess source superbuf 10996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < jpeg_job_data->src_reproc_frame->num_bufs; i++) { 11006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (jpeg_job_data->src_reproc_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 11016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev meta_frame = jpeg_job_data->src_reproc_frame->bufs[i]; 11026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 11036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (meta_frame != NULL) { 11076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // fill in meta data frame ptr 11087a737278045be557b6b1b8a1bd53033faec67166Ajay Dudani jpg_job.encode_job.p_metadata_v1 = (cam_metadata_info_t *)meta_frame->buffer; 11096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1111fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li ALOGD("[KPI Perf] %s : call jpeg start_job", __func__); 11126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mJpegHandle.start_job(&jpg_job, &jobId); 11136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret == NO_ERROR) { 11146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // remember job info 11156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_job_data->jobId = jobId; 11166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 11196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 11206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 11226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processRawImageImpl 11236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to send raw image to upper layer 11256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 11276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @recvd_frame : frame to be encoded 11286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 11296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 11306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 11316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 11326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 11336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::processRawImageImpl(mm_camera_super_buf_t *recvd_frame) 11346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 11356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 11366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11377fde32d818742141a39fda194e66b84109182affEmilian Peev mm_camera_buf_def_t *frame = NULL; 11387fde32d818742141a39fda194e66b84109182affEmilian Peev for ( int i= 0 ; i < recvd_frame->num_bufs ; i++ ) { 11397fde32d818742141a39fda194e66b84109182affEmilian Peev if ( recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_SNAPSHOT || 1140025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT || 11417fde32d818742141a39fda194e66b84109182affEmilian Peev recvd_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_RAW ) { 11427fde32d818742141a39fda194e66b84109182affEmilian Peev frame = recvd_frame->bufs[i]; 11437fde32d818742141a39fda194e66b84109182affEmilian Peev break; 11447fde32d818742141a39fda194e66b84109182affEmilian Peev } 11457fde32d818742141a39fda194e66b84109182affEmilian Peev } 11467fde32d818742141a39fda194e66b84109182affEmilian Peev if ( NULL == frame ) { 11477fde32d818742141a39fda194e66b84109182affEmilian Peev ALOGE("%s: No valid raw buffer", __func__); 11487fde32d818742141a39fda194e66b84109182affEmilian Peev return BAD_VALUE; 11497fde32d818742141a39fda194e66b84109182affEmilian Peev } 11507fde32d818742141a39fda194e66b84109182affEmilian Peev 11516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraMemory *rawMemObj = (QCameraMemory *)frame->mem_info; 11526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_memory_t *raw_mem = NULL; 11536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rawMemObj != NULL) { 11556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev raw_mem = rawMemObj->getMemory(frame->buf_idx, false); 11566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != rawMemObj && NULL != raw_mem) { 11596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // dump frame into file 11606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->dumpFrameToFile(frame->buffer, frame->frame_len, 11616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev frame->frame_idx, QCAMERA_DUMP_FRM_RAW); 11626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // send data callback / notify for RAW_IMAGE 11646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != m_parent->mDataCb && 11656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE) > 0) { 11666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 11676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 11686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_DATA_CALLBACK; 11696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = CAMERA_MSG_RAW_IMAGE; 11706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.data = raw_mem; 11716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.index = 0; 11726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->m_cbNotifier.notifyCallback(cbArg); 11736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != m_parent->mNotifyCb && 11756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->msgTypeEnabledWithLock(CAMERA_MSG_RAW_IMAGE_NOTIFY) > 0) { 11766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_callback_argm_t cbArg; 11776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&cbArg, 0, sizeof(qcamera_callback_argm_t)); 11786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK; 11796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.msg_type = CAMERA_MSG_RAW_IMAGE_NOTIFY; 11806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext1 = 0; 11816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cbArg.ext2 = 0; 11826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->m_cbNotifier.notifyCallback(cbArg); 11836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 11856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ((m_parent->mDataCb != NULL) && 11866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_parent->msgTypeEnabledWithLock(CAMERA_MSG_COMPRESSED_IMAGE) > 0) { 11876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_release_data_t release_data; 11886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&release_data, 0, sizeof(qcamera_release_data_t)); 11896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev release_data.frame = recvd_frame; 11906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sendDataNotify(CAMERA_MSG_COMPRESSED_IMAGE, 11916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev raw_mem, 11926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0, 11936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL, 11946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev &release_data); 11956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 11966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 11976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Cannot get raw mem", __func__); 11986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = UNKNOWN_ERROR; 11996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 12026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 12036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 12056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : dataProcessRoutine 12066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 12076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: data process routine that handles input data either from input 12086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Jpeg Queue to do jpeg encoding, or from input PP Queue to do 12096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * reprocess. 12106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 12116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 12126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : user data ptr (QCameraPostProcessor) 12136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 12146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 12156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 12166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid *QCameraPostProcessor::dataProcessRoutine(void *data) 12176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 12186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int running = 1; 12196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret; 12206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t is_active = FALSE; 12216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t needNewSess = TRUE; 12226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraPostProcessor *pme = (QCameraPostProcessor *)data; 12236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraCmdThread *cmdThread = &pme->m_dataProcTh; 12246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: E", __func__); 12266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev do { 12276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev do { 12286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = cam_sem_wait(&cmdThread->cmd_sem); 12296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (ret != 0 && errno != EINVAL) { 12306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: cam_sem_wait error (%s)", 12316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, strerror(errno)); 12326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 12336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } while (ret != 0); 12356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // we got notified about new cmd avail in cmd queue 12376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_cmd_type_t cmd = cmdThread->getCmd(); 12386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (cmd) { 12396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAMERA_CMD_TYPE_START_DATA_PROC: 12406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: start data proc", __func__); 12416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev is_active = TRUE; 12426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev needNewSess = TRUE; 12436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 12446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAMERA_CMD_TYPE_STOP_DATA_PROC: 12456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 12466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: stop data proc", __func__); 12476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev is_active = FALSE; 12486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // cancel all ongoing jpeg jobs 12506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_data_t *jpeg_job = 12516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (qcamera_jpeg_data_t *)pme->m_ongoingJpegQ.dequeue(); 12526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev while (jpeg_job != NULL) { 12536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->mJpegHandle.abort_job(jpeg_job->jobId); 12546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseJpegJobData(jpeg_job); 12566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(jpeg_job); 12576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpeg_job = (qcamera_jpeg_data_t *)pme->m_ongoingJpegQ.dequeue(); 12596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // destroy jpeg encoding session 12626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( 0 < pme->mJpegSessionId ) { 12636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->mJpegHandle.destroy_session(pme->mJpegSessionId); 12646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->mJpegSessionId = 0; 12656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // free jpeg out buf and exif obj 12686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pme->m_pJpegOutputMem != NULL) { 12696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_pJpegOutputMem->deallocate(); 12706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pme->m_pJpegOutputMem; 12716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_pJpegOutputMem = NULL; 12726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pme->m_pJpegExifObj != NULL) { 12746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pme->m_pJpegExifObj; 12756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_pJpegExifObj = NULL; 12766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev needNewSess = TRUE; 12786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // stop reproc channel if exists 12806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pme->m_pReprocChannel != NULL) { 12816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_pReprocChannel->stop(); 12826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pme->m_pReprocChannel; 12836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_pReprocChannel = NULL; 12846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 12856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // flush ongoing postproc Queue 12876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_ongoingPPQ.flush(); 12886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // flush input jpeg Queue 12906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_inputJpegQ.flush(); 12916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // flush input Postproc Queue 12936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_inputPPQ.flush(); 12946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // flush input raw Queue 12966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_inputRawQ.flush(); 12976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 12986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // signal cmd is completed 12996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_sem_post(&cmdThread->sync_sem); 13006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 13026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAMERA_CMD_TYPE_DO_NEXT_JOB: 13036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 13046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: Do next job, active is %d", __func__, is_active); 13056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (is_active == TRUE) { 13066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // check if there is any ongoing jpeg jobs 13076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pme->m_ongoingJpegQ.isEmpty()) { 13086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // no ongoing jpeg job, we are fine to send jpeg encoding job 13096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_jpeg_data_t *jpeg_job = 13106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (qcamera_jpeg_data_t *)pme->m_inputJpegQ.dequeue(); 13116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != jpeg_job) { 13136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev //play shutter sound 13146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_parent->playShutter(); 13156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // add into ongoing jpeg job Q 13176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_ongoingJpegQ.enqueue((void *)jpeg_job); 13186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = pme->encodeData(jpeg_job, needNewSess); 13196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NO_ERROR != ret) { 13206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // dequeue the last one 13216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_ongoingJpegQ.dequeue(false); 13226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseJpegJobData(jpeg_job); 13246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(jpeg_job); 132528a189e17a0c825b01fb3e0f092c150578787f73Muhua Li pme->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); 13266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // process raw data if any 13316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t *super_buf = 13326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (mm_camera_super_buf_t *)pme->m_inputRawQ.dequeue(); 13336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != super_buf) { 13356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev //play shutter sound 13366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_parent->playShutter(); 13376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = pme->processRawImageImpl(super_buf); 13386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NO_ERROR != ret) { 13396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseSuperBuf(super_buf); 13406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(super_buf); 134128a189e17a0c825b01fb3e0f092c150578787f73Muhua Li pme->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); 13426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_super_buf_t *pp_frame = 13466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue(); 13476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != pp_frame) { 13486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev qcamera_pp_data_t *pp_job = 13496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (qcamera_pp_data_t *)malloc(sizeof(qcamera_pp_data_t)); 13506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pp_job != NULL) { 13516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(pp_job, 0, sizeof(qcamera_pp_data_t)); 13526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pme->m_pReprocChannel != NULL) { 13536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // add into ongoing PP job Q 13546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pp_job->src_frame = pp_frame; 13556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_ongoingPPQ.enqueue((void *)pp_job); 13566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = pme->m_pReprocChannel->doReprocess(pp_frame); 13576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NO_ERROR != ret) { 13586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // remove from ongoing PP job Q 13596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->m_ongoingPPQ.dequeue(false); 13606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 13626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Reprocess channel is NULL", __func__); 13636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = -1; 13646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 13666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for qcamera_pp_data_t", __func__); 13676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = -1; 13686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 13706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (0 != ret) { 13716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // free pp_job 13726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pp_job != NULL) { 13736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(pp_job); 13746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // free frame 13766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pp_frame != NULL) { 13776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseSuperBuf(pp_frame); 13786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(pp_frame); 13796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // send error notify 138128a189e17a0c825b01fb3e0f092c150578787f73Muhua Li pme->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0); 13826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 13856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // not active, simply return buf and do no op 1386744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy qcamera_jpeg_data_t *jpeg_data = 1387744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy (qcamera_jpeg_data_t *)pme->m_inputJpegQ.dequeue(); 1388744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (NULL != jpeg_data) { 1389744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy pme->releaseJpegJobData(jpeg_data); 1390744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy free(jpeg_data); 13916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1392744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy mm_camera_super_buf_t *super_buf = 1393744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy (mm_camera_super_buf_t *)pme->m_inputRawQ.dequeue(); 13946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != super_buf) { 13956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseSuperBuf(super_buf); 13966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(super_buf); 13976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 13986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev super_buf = (mm_camera_super_buf_t *)pme->m_inputPPQ.dequeue(); 13996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != super_buf) { 14006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pme->releaseSuperBuf(super_buf); 14016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(super_buf); 14026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CAMERA_CMD_TYPE_EXIT: 14076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev running = 0; 14086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 14106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } while (running); 14136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGD("%s: X", __func__); 14146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 14156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 14166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 14186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getJpegPaddingReq 14196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to add an entry to exif data 14216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 14236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @padding_info : jpeg specific padding requirement 14246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 14266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 14276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 14286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 14296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPostProcessor::getJpegPaddingReq(cam_padding_info_t &padding_info) 14306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 14316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // TODO: hardcode for now, needs to query from mm-jpeg-interface 14326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev padding_info.width_padding = CAM_PAD_NONE; 14336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev padding_info.height_padding = CAM_PAD_TO_16; 14346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev padding_info.plane_padding = CAM_PAD_TO_WORD; 14356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 14366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 14376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 14396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraExif 14406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraExif 14426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 14446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 14466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 14476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraExif::QCameraExif() 14486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev : m_nNumEntries(0) 14496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 14506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(m_Entries, 0, sizeof(m_Entries)); 14516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 14526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 14536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 14546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCameraExif 14556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: deconstructor of QCameraExif. Will release internal memory ptr. 14576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 14596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 14606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 14616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 14626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraExif::~QCameraExif() 14636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 14646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (uint32_t i = 0; i < m_nNumEntries; i++) { 14656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (m_Entries[i].tag_entry.type) { 14666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_BYTE: 14676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 14686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.count > 1 && 14696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._bytes != NULL) { 14706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._bytes); 14716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._bytes = NULL; 14726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_ASCII: 14766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 14776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.data._ascii != NULL) { 14786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._ascii); 14796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._ascii = NULL; 14806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_SHORT: 14846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 14856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.count > 1 && 14866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._shorts != NULL) { 14876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._shorts); 14886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._shorts = NULL; 14896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 14926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_LONG: 14936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 14946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.count > 1 && 14956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._longs != NULL) { 14966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._longs); 14976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._longs = NULL; 14986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 14996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 15016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_RATIONAL: 15026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 15036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.count > 1 && 15046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._rats != NULL) { 15056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._rats); 15066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._rats = NULL; 15076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 15106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_UNDEFINED: 15116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 15126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.data._undefined != NULL) { 15136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._undefined); 15146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._undefined = NULL; 15156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 15186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_SLONG: 15196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 15206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.count > 1 && 15216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._slongs != NULL) { 15226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._slongs); 15236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._slongs = NULL; 15246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 15276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_SRATIONAL: 15286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 15296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_Entries[i].tag_entry.count > 1 && 15306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._srats != NULL) { 15316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(m_Entries[i].tag_entry.data._srats); 15326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[i].tag_entry.data._srats = NULL; 15336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 15366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 15396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 15406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 15416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addEntry 15426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: function to add an entry to exif data 15446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 15466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @tagid : exif tag ID 15476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @type : data type 15486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @count : number of data in uint of its type 15496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : input data ptr 15506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 15516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 15526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 15536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 15546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 15556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraExif::addEntry(exif_tag_id_t tagid, 15566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev exif_tag_type_t type, 15576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t count, 15586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *data) 15596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 15606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 15616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(m_nNumEntries >= MAX_EXIF_TABLE_ENTRIES) { 15626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Number of entries exceeded limit", __func__); 15636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 15646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 15666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_id = tagid; 15676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.type = type; 15686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.count = count; 15696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.copy = 1; 15706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (type) { 15716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_BYTE: 15726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 15736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (count > 1) { 15746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t *values = (uint8_t *)malloc(count); 15756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (values == NULL) { 15766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for byte array", __func__); 15776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 15786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 15796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(values, data, count); 15806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._bytes = values; 15816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 15836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._byte = *(uint8_t *)data; 15846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 15876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_ASCII: 15886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 15896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev char *str = NULL; 15906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev str = (char *)malloc(count + 1); 15916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (str == NULL) { 15926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for ascii string", __func__); 15936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 15946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 15956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(str, 0, count + 1); 15966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(str, data, count); 15976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._ascii = str; 15986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 15996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 16016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_SHORT: 16026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 16036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (count > 1) { 16046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint16_t *values = (uint16_t *)malloc(count * sizeof(uint16_t)); 16056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (values == NULL) { 16066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for short array", __func__); 16076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 16086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(values, data, count * sizeof(uint16_t)); 16106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._shorts = values; 16116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._short = *(uint16_t *)data; 16146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 16176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_LONG: 16186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 16196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (count > 1) { 16206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t *values = (uint32_t *)malloc(count * sizeof(uint32_t)); 16216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (values == NULL) { 16226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for long array", __func__); 16236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 16246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(values, data, count * sizeof(uint32_t)); 16266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._longs = values; 16276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._long = *(uint32_t *)data; 16306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 16336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_RATIONAL: 16346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 16356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (count > 1) { 16366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rat_t *values = (rat_t *)malloc(count * sizeof(rat_t)); 16376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (values == NULL) { 16386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for rational array", __func__); 16396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 16406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(values, data, count * sizeof(rat_t)); 16426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._rats = values; 16436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._rat = *(rat_t *)data; 16466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 16496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_UNDEFINED: 16506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 16516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t *values = (uint8_t *)malloc(count); 16526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (values == NULL) { 16536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for undefined array", __func__); 16546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 16556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(values, data, count); 16576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._undefined = values; 16586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 16616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_SLONG: 16626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 16636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (count > 1) { 16646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t *values = (int32_t *)malloc(count * sizeof(int32_t)); 16656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (values == NULL) { 16666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for signed long array", __func__); 16676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 16686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(values, data, count * sizeof(int32_t)); 16706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._slongs = values; 16716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._slong = *(int32_t *)data; 16746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 16776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIF_SRATIONAL: 16786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 16796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (count > 1) { 16806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev srat_t *values = (srat_t *)malloc(count * sizeof(srat_t)); 16816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (values == NULL) { 16826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for signed rational array", __func__); 16836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 16846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memcpy(values, data, count * sizeof(srat_t)); 16866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._srats = values; 16876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 16896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_Entries[m_nNumEntries].tag_entry.data._srat = *(srat_t *)data; 16906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 16936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 16946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 16956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Increase number of entries 16966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_nNumEntries++; 16976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 16986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 16996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 17006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera 1701