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