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