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