13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*/
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QCameraChannel"
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Errors.h>
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera2HWI.h"
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" {
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h"
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace android;
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera {
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraChannel
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constrcutor of QCameraChannel
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
573d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraChannel::QCameraChannel(uint32_t cam_handle,
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               mm_camera_ops_t *cam_ops)
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camHandle = cam_handle;
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camOps = cam_ops;
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bIsActive = false;
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bAllowDynBufAlloc = false;
64cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mDualChannel = is_dual_camera_by_handle(cam_handle);
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_handle = 0;
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraChannel
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constrcutor of QCameraChannel
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
773d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraChannel::QCameraChannel()
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camHandle = 0;
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camOps = NULL;
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bIsActive = false;
82cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mDualChannel = 0;
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_handle = 0;
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCameraChannel
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraChannel
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
953d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraChannel::~QCameraChannel()
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_bIsActive) {
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stop();
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mStreams[i] != NULL) {
102cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            if (validate_handle(m_handle, mStreams[i]->getChannelHandle())) {
103cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                delete mStreams[i];
104cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            }
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mStreams.clear();
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camOps->delete_channel(m_camHandle, m_handle);
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_handle = 0;
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : deleteChannel
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: deletes a camera channel
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraChannel::deleteChannel()
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_bIsActive) {
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stop();
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
127cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if ((mStreams[i] != NULL) &&
128cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) {
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreams[i]->deleteStream();
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camOps->delete_channel(m_camHandle, m_handle);
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setStreamSyncCB
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: reg callback function to stream of stream type
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @stream_type : Stream type for which callback needs to be registered.
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @stream_cb   : Callback function
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              non-zero failure code
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::setStreamSyncCB (cam_stream_type_t stream_type,
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stream_cb_routine stream_cb)
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = UNKNOWN_ERROR;
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((mStreams[i] != NULL) && (stream_type == mStreams[i]->getMyType())) {
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mStreams[i]->setSyncDataCB(stream_cb);
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : init
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: initialization of channel
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @attr    : channel bundle attribute setting
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @dataCB  : data notify callback
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @userData: user data ptr
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::init(mm_camera_channel_attr_t *attr,
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             mm_camera_buf_notify_t dataCB,
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             void *userData)
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_handle = m_camOps->add_channel(m_camHandle,
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      attr,
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      dataCB,
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      userData);
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_handle == 0) {
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Add channel failed");
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return UNKNOWN_ERROR;
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1872896d129511c499aef15b8162df05fa299860f59Thierry Strudel
1882896d129511c499aef15b8162df05fa299860f59Thierry Strudel    mActiveCameras = MM_CAMERA_TYPE_MAIN;
189cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    if (isDualChannel()) {
1902896d129511c499aef15b8162df05fa299860f59Thierry Strudel        mActiveCameras |= MM_CAMERA_TYPE_AUX;
191cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    }
1922896d129511c499aef15b8162df05fa299860f59Thierry Strudel    mMasterCamera = MM_CAMERA_TYPE_MAIN;
1932896d129511c499aef15b8162df05fa299860f59Thierry Strudel    mBundledSnapshot = false;
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
198cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * FUNCTION   : getChHandleForStream
199cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
200cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * DESCRIPTION: return actual channel handle based on use case per stream
201cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
202cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * PARAMETERS :
203cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *   @ch_type  : type of channel
204cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
205cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * RETURN     : number of buffers needed
206cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * NOTE :  Based on the use cases and auxillary camera type,
207cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel           we can decide channel handle for streams.
208cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel           Incase, we want to avoid any stream for auxillary camera,
209cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel           we can decide here.
210cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *==========================================================================*/
211cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudeluint32_t QCameraChannel::getChHandleForStream(cam_stream_type_t stream_type)
212cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel{
213cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    uint32_t handle = m_handle;
214cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    if (!mDualChannel) {
215cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        return m_handle;
216cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    }
217cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
218cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    /*Based on the use case, decide channel handle for channel*/
219cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    switch (stream_type) {
220cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_PREVIEW:
221cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_SNAPSHOT:
222cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_VIDEO:
223cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_METADATA:
224cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_ANALYSIS:
225cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_CALLBACK:
226cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        handle = m_handle;
227cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        break;
228cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_POSTVIEW:
229cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_RAW:
230cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_OFFLINE_PROC:
231cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_DEFAULT:
232cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    case CAM_STREAM_TYPE_MAX:
233cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    default:
234cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        handle = get_main_camera_handle(m_handle);
235cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        break;
236cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    }
237cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    return handle;
238cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel}
239cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
240cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*===========================================================================
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : addStream
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: add a stream into channel
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @allocator      : stream related buffer allocator
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamInfoBuf  : ptr to buf that contains stream info
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @miscBuf        : ptr to buf that contains misc buffers
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @minStreamBufNum: number of stream buffers needed
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @paddingInfo    : padding information
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream_cb      : stream data notify callback
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @userdata       : user data ptr
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @bDynAllocBuf   : flag indicating if allow allocate buffers in 2 steps
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @online_rotation: rotation applied online
2552896d129511c499aef15b8162df05fa299860f59Thierry Strudel *   @cam_type       : Camera type in case of dual camera
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::addStream(QCameraAllocator &allocator,
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCameraHeapMemory *streamInfoBuf, QCameraHeapMemory *miscBuf,
263cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        cam_padding_info_t *paddingInfo, stream_cb_routine stream_cb,
264cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        void *userdata, bool bDynAllocBuf, bool bDeffAlloc,
2652896d129511c499aef15b8162df05fa299860f59Thierry Strudel        cam_rotation_t online_rotation,
2662896d129511c499aef15b8162df05fa299860f59Thierry Strudel        uint32_t cam_type)
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
2692896d129511c499aef15b8162df05fa299860f59Thierry Strudel    uint32_t ch_handle = m_handle;
2702896d129511c499aef15b8162df05fa299860f59Thierry Strudel
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mStreams.size() >= MAX_STREAM_NUM_IN_BUNDLE) {
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("stream number (%zu) exceeds max limit (%d)",
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               mStreams.size(), MAX_STREAM_NUM_IN_BUNDLE);
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (streamInfoBuf != NULL) {
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfoBuf->deallocate();
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            delete streamInfoBuf;
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfoBuf = NULL;
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2812896d129511c499aef15b8162df05fa299860f59Thierry Strudel
2822896d129511c499aef15b8162df05fa299860f59Thierry Strudel    if (cam_type == MM_CAMERA_TYPE_MAIN) {
2832896d129511c499aef15b8162df05fa299860f59Thierry Strudel        ch_handle = get_main_camera_handle(m_handle);
2842896d129511c499aef15b8162df05fa299860f59Thierry Strudel    } else if (cam_type == MM_CAMERA_TYPE_AUX) {
2852896d129511c499aef15b8162df05fa299860f59Thierry Strudel        ch_handle = get_aux_camera_handle(m_handle);
2862896d129511c499aef15b8162df05fa299860f59Thierry Strudel    }
2872896d129511c499aef15b8162df05fa299860f59Thierry Strudel
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraStream *pStream = new QCameraStream(allocator,
2892896d129511c499aef15b8162df05fa299860f59Thierry Strudel            m_camHandle, ch_handle, m_camOps, paddingInfo, bDeffAlloc,
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            online_rotation);
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (pStream == NULL) {
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No mem for Stream");
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (streamInfoBuf != NULL) {
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfoBuf->deallocate();
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            delete streamInfoBuf;
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfoBuf = NULL;
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_MEMORY;
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
301cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    rc = pStream->init(streamInfoBuf, miscBuf,
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                       stream_cb, userdata, bDynAllocBuf);
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == 0) {
304cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        Mutex::Autolock lock(mStreamLock);
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mStreams.add(pStream);
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete pStream;
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : linkStream
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: link a stream into channel
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @ch      : Channel which the stream belongs to
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream  : Stream which needs to be linked
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::linkStream(QCameraChannel *ch, QCameraStream *stream)
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((0 == m_handle) || (NULL == ch) || (NULL == stream)) {
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t handle = m_camOps->link_stream(m_camHandle,
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ch->getMyHandle(),
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            stream->getMyHandle(),
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_handle);
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 == handle) {
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Linking of stream failed");
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = INVALID_OPERATION;
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
341cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        Mutex::Autolock lock(mStreamLock);
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mStreams.add(stream);
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : start
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: start channel, which will start all streams belong to this channel
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::start()
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(m_bIsActive) {
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Attempt to start active channel");
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
368cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    // there is more than one stream in the channel
369cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    // we need to notify mctl that all streams in this channel need to be bundled
370cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
371cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if ((mStreams[i] != NULL) &&
372cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) {
373cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            mStreams[i]->setBundleInfo();
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
377cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((mStreams[i] != NULL) &&
380cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) {
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreams[i]->start();
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
384ce5b8667939a3d4678b0178011ad519013c86384Chien-Yu Chen    rc = m_camOps->start_channel(m_camHandle, m_handle, /*start_sensor_streaming*/true);
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != NO_ERROR) {
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (size_t i = 0; i < mStreams.size(); i++) {
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((mStreams[i] != NULL) &&
389cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) {
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mStreams[i]->stop();
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_bIsActive = true;
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (size_t i = 0; i < mStreams.size(); i++) {
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (mStreams[i] != NULL) {
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mStreams[i]->cond_signal();
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stop
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop a channel, which will stop all streams belong to this channel
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::stop()
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    size_t i = 0;
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_bIsActive) {
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
425cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    {
426cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        Mutex::Autolock lock(mStreamLock);
427cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        while(i < mStreams.size()) {
428cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            if (mStreams[i] != NULL) {
429cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                if (validate_handle(m_handle, mStreams[i]->getChannelHandle())) {
430cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    mStreams[i]->stop();
431cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    i++;
432cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                } else {
433cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    // Remove linked stream from stream list
434cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    mStreams.removeAt(i);
435cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                }
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44009cb28ee5fe4b3664777977d75fde8a6372d2f32Chien-Yu Chen    rc = m_camOps->stop_channel(m_camHandle, m_handle, /*stop_immediately*/false);
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bIsActive = false;
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : bufDone
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return a stream buf back to kernel
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @recvd_frame  : stream buf frame to be returned
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame)
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) {
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (recvd_frame->bufs[i] != NULL) {
463cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            for (uint32_t j = 0; j < mStreams.size(); j++) {
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (mStreams[j] != NULL &&
465cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                         (validate_handle(mStreams[j]->getMyHandle(),
466cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                         recvd_frame->bufs[i]->stream_id))) {
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx);
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break; // break loop j
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : bufDone
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return specified buffer from super buffer to kernel
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @recvd_frame  : stream buf frame to be returned
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream_id      : stream ID of the buffer to be released
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame, uint32_t stream_id)
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t index;
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (int32_t i = 0; i < (int32_t)recvd_frame->num_bufs; i++) {
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        index = -1;
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((recvd_frame->bufs[i] != NULL) &&
4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (recvd_frame->bufs[i]->stream_id == stream_id)) {
498cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            for (uint32_t j = 0; j < mStreams.size(); j++) {
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if ((mStreams[j] != NULL) &&
500cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        (validate_handle(mStreams[j]->getMyHandle(),
501cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        recvd_frame->bufs[i]->stream_id))) {
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx);
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    index = i;
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break; // break loop j
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((index >= 0) && (index < (int32_t)recvd_frame->num_bufs)) {
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                for (int32_t j = index; j < (int32_t)(recvd_frame->num_bufs - 1); j++) {
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    recvd_frame->bufs[j] = recvd_frame->bufs[j + 1];
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                recvd_frame->num_bufs--;
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                i--;
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : processZoomDone
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: process zoom done event
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @previewWindoe : ptr to preview window ops table, needed to set preview
5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                    crop information
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @crop_info     : crop info as a result of zoom operation
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::processZoomDone(preview_stream_ops_t *previewWindow,
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        cam_crop_data_t &crop_info)
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
538cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    Mutex::Autolock lock(mStreamLock);
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((mStreams[i] != NULL) &&
541cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) {
5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mStreams[i]->processZoomDone(previewWindow, crop_info);
5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamByHandle
5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by stream handle
5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamHandle : stream handle
5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : stream object. NULL if not found
5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
5583d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream *QCameraChannel::getStreamByHandle(uint32_t streamHandle)
5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
561cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if (mStreams[i] != NULL &&
562cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(mStreams[i]->getMyHandle(), streamHandle))) {
5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return mStreams[i];
5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamByServerID
5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by stream server ID from daemon
5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @serverID : stream server ID
5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : stream object. NULL if not found
5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
5793d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream *QCameraChannel::getStreamByServerID(uint32_t serverID)
5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mStreams[i] != NULL && mStreams[i]->getMyServerID() == serverID) {
5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return mStreams[i];
5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamByIndex
5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by index of streams in the channel
5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @index : index of stream in the channel
5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : stream object. NULL if not found
5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
5993d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream *QCameraChannel::getStreamByIndex(uint32_t index)
6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (index >= MAX_STREAM_NUM_IN_BUNDLE) {
6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (index < mStreams.size()) {
6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return mStreams[index];
6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : UpdateStreamBasedParameters
6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: update any stream based settings from parameters
6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @param   : reference to parameters object
6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::UpdateStreamBasedParameters(QCameraParametersIntf &param)
6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
626cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    Mutex::Autolock lock(mStreamLock);
6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (param.isPreviewFlipChanged()) {
6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // try to find preview stream
6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (size_t i = 0; i < mStreams.size(); i++) {
6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((mStreams[i] != NULL) &&
631cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    (validate_handle(m_handle, mStreams[i]->getChannelHandle())) &&
6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW))) ) {
6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_stream_parm_buffer_t param_buf;
6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                memset(&param_buf, 0, sizeof(cam_stream_parm_buffer_t));
6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP;
6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param_buf.flipInfo.flip_mask =
6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_PREVIEW);
6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = mStreams[i]->setParameter(param_buf);
6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGW("set preview stream flip failed");
6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
6443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (param.isVideoFlipChanged()) {
6473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // try to find video stream
6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (size_t i = 0; i < mStreams.size(); i++) {
6493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((mStreams[i] != NULL) &&
650cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    (validate_handle(m_handle, mStreams[i]->getChannelHandle())) &&
6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO) ||
6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_VIDEO))) ) {
6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_stream_parm_buffer_t param_buf;
6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                memset(&param_buf, 0, sizeof(cam_stream_parm_buffer_t));
6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP;
6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param_buf.flipInfo.flip_mask =
6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_VIDEO);
6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = mStreams[i]->setParameter(param_buf);
6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGW("set video stream flip failed");
6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (param.isSnapshotFlipChanged()) {
6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // try to find snapshot/postview stream
6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (size_t i = 0; i < mStreams.size(); i++) {
6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (mStreams[i] != NULL &&
669cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    (validate_handle(m_handle, mStreams[i]->getChannelHandle())) &&
6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) ||
6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) ||
6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     mStreams[i]->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) ||
6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW) ) ) {
6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_stream_parm_buffer_t param_buf;
6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                memset(&param_buf, 0, sizeof(cam_stream_parm_buffer_t));
6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP;
6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param_buf.flipInfo.flip_mask =
6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT);
6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = mStreams[i]->setParameter(param_buf);
6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGW("set snapshot stream flip failed");
6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
690cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * FUNCTION   : processCameraControl
691cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
692cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * DESCRIPTION:  Suspend and resume camera
693cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
694cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * PARAMETERS :
695cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *   @camState   : Camera start. MAIN/AUX/MAIN&AUX
696cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
697cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * RETURN     : int32_t type of status
698cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *              NO_ERROR  -- success
699cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *              none-zero failure code
700cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *==========================================================================*/
7012896d129511c499aef15b8162df05fa299860f59Thierry Strudelint32_t QCameraChannel::processCameraControl(
7022896d129511c499aef15b8162df05fa299860f59Thierry Strudel        uint32_t camState,
7032896d129511c499aef15b8162df05fa299860f59Thierry Strudel        bool     bundledSnapshot)
704cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel{
705cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    int32_t ret = NO_ERROR;
706cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
707cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
708cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if (mStreams[i] != NULL && mStreams[i]->isDualStream()) {
709cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            ret = mStreams[i]->processCameraControl(camState);
710cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            if (ret != NO_ERROR) {
71154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel                LOGE("Stream handle failed");
712cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
713cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            }
714cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        }
715cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    }
716cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
7172896d129511c499aef15b8162df05fa299860f59Thierry Strudel    mActiveCameras   = camState;
7182896d129511c499aef15b8162df05fa299860f59Thierry Strudel    mBundledSnapshot = bundledSnapshot;
719cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    return ret;
720cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel}
721cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
722cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*===========================================================================
723cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * FUNCTION   : switchChannelCb
724cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
725cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * DESCRIPTION: switch channel's in case of dual camera
726cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
727cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * PARAMETERS :
7282896d129511c499aef15b8162df05fa299860f59Thierry Strudel * @camMaster : Master camera
729cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *
730cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * RETURN     : int32_t type of status
731cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *              NO_ERROR  -- success
732cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *              none-zero failure code
733cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *==========================================================================*/
7342896d129511c499aef15b8162df05fa299860f59Thierry Strudelint32_t QCameraChannel::switchChannelCb(uint32_t camMaster)
735cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel{
736cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    int32_t ret = NO_ERROR;
737cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
738cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
739cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if (mStreams[i] != NULL && mStreams[i]->isDualStream()) {
7402896d129511c499aef15b8162df05fa299860f59Thierry Strudel            ret = mStreams[i]->switchStreamCb(camMaster);
741cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            if (ret != NO_ERROR) {
742cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                LOGE("Stream Switch Failed");
743cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
744cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            }
745cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        }
746cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    }
747cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
7482896d129511c499aef15b8162df05fa299860f59Thierry Strudel    // Update master camera
7492896d129511c499aef15b8162df05fa299860f59Thierry Strudel    mMasterCamera = camMaster;
7502896d129511c499aef15b8162df05fa299860f59Thierry Strudel    return ret;
7512896d129511c499aef15b8162df05fa299860f59Thierry Strudel}
7522896d129511c499aef15b8162df05fa299860f59Thierry Strudel
7532896d129511c499aef15b8162df05fa299860f59Thierry Strudel/*===========================================================================
7542896d129511c499aef15b8162df05fa299860f59Thierry Strudel * FUNCTION   : getSnapshotHandle
7552896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
7562896d129511c499aef15b8162df05fa299860f59Thierry Strudel * DESCRIPTION: Get the camera handle for snapshot based on the bundlesnapshot
7572896d129511c499aef15b8162df05fa299860f59Thierry Strudel *              flag and active camera state
7582896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
7592896d129511c499aef15b8162df05fa299860f59Thierry Strudel * PARAMETERS : None
7602896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
7612896d129511c499aef15b8162df05fa299860f59Thierry Strudel * RETURN     : camera handle for snapshot
7622896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
7632896d129511c499aef15b8162df05fa299860f59Thierry Strudel *==========================================================================*/
7642896d129511c499aef15b8162df05fa299860f59Thierry Strudeluint32_t QCameraChannel::getSnapshotHandle()
7652896d129511c499aef15b8162df05fa299860f59Thierry Strudel{
7662896d129511c499aef15b8162df05fa299860f59Thierry Strudel    uint32_t snapshotHandle = 0;
7672896d129511c499aef15b8162df05fa299860f59Thierry Strudel
7682896d129511c499aef15b8162df05fa299860f59Thierry Strudel    if ((mActiveCameras == MM_CAMERA_DUAL_CAM) && mBundledSnapshot) {
7692896d129511c499aef15b8162df05fa299860f59Thierry Strudel        snapshotHandle = m_handle;
77054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    } else {
7712896d129511c499aef15b8162df05fa299860f59Thierry Strudel        snapshotHandle = (mMasterCamera == MM_CAMERA_TYPE_MAIN) ?
7722896d129511c499aef15b8162df05fa299860f59Thierry Strudel                get_main_camera_handle(m_handle) : get_aux_camera_handle(m_handle);
773cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    }
77454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
7752896d129511c499aef15b8162df05fa299860f59Thierry Strudel    return snapshotHandle;
776cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel}
777cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
778cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*===========================================================================
7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraPicChannel
7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCameraPicChannel
7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
7893d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraPicChannel::QCameraPicChannel(uint32_t cam_handle,
7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     mm_camera_ops_t *cam_ops) :
7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraChannel(cam_handle, cam_ops)
7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bAllowDynBufAlloc = true;
7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraPicChannel
7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constructor of QCameraPicChannel
8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8053d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraPicChannel::QCameraPicChannel()
8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bAllowDynBufAlloc = true;
8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCameraPicChannel
8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraPicChannel
8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8193d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraPicChannel::~QCameraPicChannel()
8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : takePicture
8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: send request for queued snapshot frames
8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buf : request buf info
8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::takePicture (mm_camera_req_buf_t *buf)
8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8372896d129511c499aef15b8162df05fa299860f59Thierry Strudel    uint32_t snapshotHandle = getSnapshotHandle();
8382896d129511c499aef15b8162df05fa299860f59Thierry Strudel    LOGD("mSnapshotHandle = 0x%x", snapshotHandle);
8392896d129511c499aef15b8162df05fa299860f59Thierry Strudel    int32_t rc = m_camOps->request_super_buf(m_camHandle, snapshotHandle, buf);
8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : cancelPicture
8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: cancel request for queued snapshot frames
8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::cancelPicture()
8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle);
8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
8583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
8593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stopAdvancedCapture
8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop advanced capture based on advanced capture type.
8643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @type : advanced capture type.
8673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
8703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::stopAdvancedCapture(mm_camera_advanced_capture_t type)
8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = m_camOps->process_advanced_capture(m_camHandle,
8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_handle, type, 0, NULL);
8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : startAdvancedCapture
8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: start advanced capture based on advanced capture type.
8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @type : advanced capture type.
8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @config: advance capture config
8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::startAdvancedCapture(mm_camera_advanced_capture_t type,
8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_capture_frame_config_t *config)
8943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8972896d129511c499aef15b8162df05fa299860f59Thierry Strudel    rc = m_camOps->process_advanced_capture(m_camHandle, getSnapshotHandle(), type,
8983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            1, config);
8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
9003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* FUNCTION   : flushSuperbuffer
9043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush the all superbuffer frames.
9063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
9083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame_idx : frame index of focused frame
9093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
9113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
9123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
9133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::flushSuperbuffer(uint32_t frame_idx)
9153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = m_camOps->flush_super_buf_queue(m_camHandle, m_handle, frame_idx);
9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
9183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraVideoChannel
9223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCameraVideoChannel
9243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
9263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
9273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
9283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
9303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9313d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraVideoChannel::QCameraVideoChannel(uint32_t cam_handle,
9323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         mm_camera_ops_t *cam_ops) :
9333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraChannel(cam_handle, cam_ops)
9343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraVideoChannel
9393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constructor of QCameraVideoChannel
9413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
9433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
9453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9463d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraVideoChannel::QCameraVideoChannel()
9473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCameraVideoChannel
9523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraVideoChannel
9543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
9563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
9583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9593d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraVideoChannel::~QCameraVideoChannel()
9603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : takePicture
9653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: send request for queued snapshot frames
9673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
9693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @mm_camera_req_buf_t : request buf info
9703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
9723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
9733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
9743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraVideoChannel::takePicture(mm_camera_req_buf_t *buf)
9763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9772896d129511c499aef15b8162df05fa299860f59Thierry Strudel    uint32_t snapshotHandle = getSnapshotHandle();
9782896d129511c499aef15b8162df05fa299860f59Thierry Strudel    LOGD("mSnapshotHandle = 0x%x", snapshotHandle);
9792896d129511c499aef15b8162df05fa299860f59Thierry Strudel    int32_t rc = m_camOps->request_super_buf(m_camHandle, snapshotHandle, buf);
9803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
9813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : cancelPicture
9853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: cancel request for queued snapshot frames
9873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
9893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
9913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraVideoChannel::cancelPicture()
9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle);
9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : releaseFrame
10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return video frame from app
10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @opaque     : ptr to video frame to be returned
10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @isMetaData : if frame is a metadata or real frame
10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraVideoChannel::releaseFrame(const void * opaque, bool isMetaData)
10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraStream *pVideoStream = NULL;
10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
10173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mStreams[i] != NULL && mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO)) {
10183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pVideoStream = mStreams[i];
10193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
10203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
10223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == pVideoStream) {
10243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No video stream in the channel");
10253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
10263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
10273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = pVideoStream->bufDone(opaque, isMetaData);
10293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
10303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraReprocessChannel
10343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCameraReprocessChannel
10363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
10383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
10393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
10403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
10423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10433d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraReprocessChannel::QCameraReprocessChannel(uint32_t cam_handle,
10443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                 mm_camera_ops_t *cam_ops) :
10453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraChannel(cam_handle, cam_ops),
10463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_pSrcChannel(NULL),
10473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPassCount(0)
10483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
10503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCameraReprocessChannel
10543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constructor of QCameraReprocessChannel
10563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
10583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
10603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10613d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraReprocessChannel::QCameraReprocessChannel() :
10623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_pSrcChannel(NULL),
10633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPassCount(0)
10643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCameraReprocessChannel
10693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraReprocessChannel
10713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
10733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
10753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10763d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraReprocessChannel::~QCameraReprocessChannel()
10773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : addReprocStreamsFromSource
10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: add reprocess streams from input source channel
10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @allocator      : stream related buffer allocator
10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @featureConfig  : pp feature configuration
10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pSrcChannel    : ptr to input source channel that needs reprocess
10893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @minStreamBufNum: number of stream buffers needed
10903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @burstNum       : number of burst captures needed
10913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @paddingInfo    : padding information
10923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @param          : reference to parameters
10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @contStream     : continous streaming mode or burst
10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @offline        : configure for offline reprocessing
10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::addReprocStreamsFromSource(
11013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCameraAllocator& allocator, cam_pp_feature_config_t &featureConfig,
11023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCameraChannel *pSrcChannel, uint8_t minStreamBufNum, uint8_t burstNum,
11033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_padding_info_t *paddingInfo, QCameraParametersIntf &param, bool contStream,
11043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        bool offline)
11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraStream *pStream = NULL;
11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraHeapMemory *pStreamInfoBuf = NULL;
11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraHeapMemory *pMiscBuf = NULL;
11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_info_t *streamInfo = NULL;
11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_padding_info_t padding;
11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == paddingInfo) {
11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    padding = *paddingInfo;
11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Use maximum padding so that the buffer
11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //can be rotated
11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    padding.width_padding = MAX(padding.width_padding, padding.height_padding);
11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    padding.height_padding = padding.width_padding;
11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    padding.offset_info.offset_x = 0;
11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    padding.offset_info.offset_y = 0;
11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("num of src stream = %d", pSrcChannel->getNumOfStreams());
11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < pSrcChannel->getNumOfStreams(); i++) {
11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_pp_feature_config_t pp_featuremask = featureConfig;
11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pStream = pSrcChannel->getStreamByIndex(i);
11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pStream != NULL) {
11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (param.getofflineRAW() && !((pStream->isTypeOf(CAM_STREAM_TYPE_RAW))
11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    || (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW))
11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    || (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA))
1133c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))
1134c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) {
11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW
11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                continue;
11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (pStream->isTypeOf(CAM_STREAM_TYPE_RAW)
11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    && (!param.getofflineRAW())) {
11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Skip raw for reprocess now because PP module cannot handle
11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // meta data&raw. May need furthur discussion if Imaginglib need meta data
11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                continue;
11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA))
1147c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    && !((param.getManualCaptureMode() >=
1148c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    CAM_MANUAL_CAPTURE_TYPE_3) || (param.getQuadraCfa())))
11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) {
1150c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                // Skip metadata, if not manual capture or quadra cfa
11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                continue;
11523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
11553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) ||
11563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
11573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) {
11583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_feature_mask_t feature_mask = featureConfig.feature_mask;
11593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // skip thumbnail reprocessing if not needed
11613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (!param.needThumbnailReprocess(&feature_mask)) {
11623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    continue;
11633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
11643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // CAC, SHARPNESS, FLIP and WNR would have been already applied -
11653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // on preview/postview stream in realtime.
11663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // So, need not apply again.
11673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                feature_mask &= ~(CAM_QCOM_FEATURE_DENOISE2D |
11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        CAM_QCOM_FEATURE_CAC |
11693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        CAM_QCOM_FEATURE_SHARPNESS |
11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        CAM_QCOM_FEATURE_FLIP |
11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        CAM_QCOM_FEATURE_RAW_PROCESSING);
11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (!feature_mask) {
11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // Skip thumbnail stream reprocessing since no other
11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    //reprocessing is enabled.
11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    continue;
11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1179c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            // For quadra CFA, assign metada_bypass for first pass feature mask.
1180c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            // For second pass in quadra CFA mode, assign metadata_processing.
1181c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            // For normal reprocess(no quadra CFA), assign metadata_processing.
1182c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            if (!param.getQuadraCfa()) {
1183c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
1184c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    pp_featuremask.feature_mask = 0;
1185c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_PROCESSING;
1186c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                }
1187c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            } else {
1188c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
1189c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    // First reprocess pass in quadra CFA mode
1190c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    // Skip processing of the offline metadata for first pass,
1191c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    pp_featuremask.feature_mask = 0;
1192c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_BYPASS;
1193c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                } else if (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)) {
1194c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    // Second reprocess pass in quadra CFA mode
1195c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    // offline Metadata processing needed for second pass.
1196c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    // offline meta data will be copied from backend.
1197c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    pp_featuremask.feature_mask = 0;
1198c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_PROCESSING;
1199c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                }
12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC);
12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (pStreamInfoBuf == NULL) {
12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("no mem for stream info buf");
12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = NO_MEMORY;
12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfo = (cam_stream_info_t *)pStreamInfoBuf->getPtr(0);
12103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(streamInfo, 0, sizeof(cam_stream_info_t));
12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfo->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC;
12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Enable CPP high performance mode to put it in turbo frequency mode for
12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // burst/longshot/HDR snapshot cases
12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfo->perf_mode = CAM_PERF_HIGH_PERFORMANCE;
12159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel            if (param.getofflineRAW() && (pStream->isTypeOf(CAM_STREAM_TYPE_RAW)
12169e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                    || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))) {
12179e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                if (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_QUADRA_CFA) {
12189e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                    param.getStreamFormat(CAM_STREAM_TYPE_OFFLINE_PROC, streamInfo->fmt);
12199e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                } else {
12209e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                    streamInfo->fmt = CAM_FORMAT_YUV_420_NV21;
12219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                }
12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = pStream->getFormat(streamInfo->fmt);
12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
12273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) ||
12283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
12293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) {
12303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_SCALE) {
12313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    param.getThumbnailSize(&(streamInfo->dim.width),
12323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            &(streamInfo->dim.height));
12333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
12343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->getFrameDimension(streamInfo->dim);
12353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
12363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
12372896d129511c499aef15b8162df05fa299860f59Thierry Strudel                if ((param.isPostProcScaling() || param.isDCmAsymmetricSnapMode()) &&
12383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_SCALE)) {
12393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = param.getStreamDimension(CAM_STREAM_TYPE_OFFLINE_PROC,
12403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            streamInfo->dim);
12413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else if ((param.getofflineRAW()) &&
12429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                        ((pStream->isTypeOf(CAM_STREAM_TYPE_RAW)) ||
12439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                        (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)))) {
12449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                         if ((param.getQuadraCfa()) &&
12459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                             (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_QUADRA_CFA)) {
12469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                             rc = pStream->getFrameDimension(streamInfo->dim);
12479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                         } else {
12489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                             param.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,streamInfo->dim);
12499e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel                         }
12503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
12513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = pStream->getFrameDimension(streamInfo->dim);
12523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
12533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ( contStream ) {
12563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
12573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->num_of_burst = 0;
12583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
12593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST;
12603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->num_of_burst = burstNum;
12613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfo->num_bufs = minStreamBufNum;
1263cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            streamInfo->buf_cnt = streamInfo->num_bufs;
12643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cam_stream_reproc_config_t rp_cfg;
12663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(&rp_cfg, 0, sizeof(cam_stream_reproc_config_t));
12673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (offline) {
12683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_frame_len_offset_t offset;
12693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                memset(&offset, 0, sizeof(cam_frame_len_offset_t));
12703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rp_cfg.pp_type = CAM_OFFLINE_REPROCESS_TYPE;
12723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pStream->getFormat(rp_cfg.offline.input_fmt);
12733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pStream->getFrameDimension(rp_cfg.offline.input_dim);
12743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pStream->getFrameOffset(offset);
12753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rp_cfg.offline.input_buf_planes.plane_info = offset;
12763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rp_cfg.offline.input_type = pStream->getMyOriginalType();
12773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //For input metadata + input buffer
12783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rp_cfg.offline.num_of_bufs = 2;
12793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
12803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rp_cfg.pp_type = CAM_ONLINE_REPROCESS_TYPE;
12813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rp_cfg.online.input_stream_id = pStream->getMyServerID();
12823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rp_cfg.online.input_stream_type = pStream->getMyOriginalType();
12833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.getStreamRotation(streamInfo->stream_type,
12853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    streamInfo->pp_config, streamInfo->dim);
12863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfo->reprocess_config = rp_cfg;
12873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamInfo->reprocess_config.pp_feature_config = pp_featuremask;
12883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (!(pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)
12903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT)
12913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                || pStream->isTypeOf(CAM_STREAM_TYPE_RAW)
12923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))) {
12933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // CAC, SHARPNESS, FLIP and WNR would have been already applied -
12943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // on preview/postview stream in realtime. Need not apply again.
12953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
12963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        ~CAM_QCOM_FEATURE_CAC;
12973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
12983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        ~CAM_QCOM_FEATURE_SHARPNESS;
12993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
13003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        ~CAM_QCOM_FEATURE_FLIP;
13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //Don't do WNR for thumbnail
13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        ~CAM_QCOM_FEATURE_DENOISE2D;
13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        ~CAM_QCOM_FEATURE_CDS;
13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        ~CAM_QCOM_FEATURE_DSDN;
13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //No need of RAW processing for other than RAW streams
13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        ~CAM_QCOM_FEATURE_RAW_PROCESSING;
13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (param.isHDREnabled()
13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                  && !param.isHDRThumbnailProcessNeeded()){
13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    streamInfo->reprocess_config.pp_feature_config.feature_mask
13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                      &= ~CAM_QCOM_FEATURE_HDR;
13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cam_stream_type_t type = CAM_STREAM_TYPE_DEFAULT;
13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (offline) {
13213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                type = streamInfo->reprocess_config.offline.input_type;
13223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
13233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                type = streamInfo->reprocess_config.online.input_stream_type;
13243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (type == CAM_STREAM_TYPE_SNAPSHOT) {
13263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                int flipMode = param.getFlipMode(type);
13273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (flipMode > 0) {
13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    streamInfo->reprocess_config.pp_feature_config.feature_mask |=
13293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            CAM_QCOM_FEATURE_FLIP;
13303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    streamInfo->reprocess_config.pp_feature_config.flip = (uint32_t)flipMode;
13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((streamInfo->reprocess_config.pp_feature_config.feature_mask
13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    & CAM_QCOM_FEATURE_SCALE)
13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    && param.isReprocScaleEnabled()
13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    && param.isUnderReprocScaling()) {
13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //we only Scale Snapshot frame
13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) {
13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    streamInfo->dim.width =
13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            streamInfo->reprocess_config.pp_feature_config.scale_param.output_width;
13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    streamInfo->dim.height =
13433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            streamInfo->reprocess_config.pp_feature_config.scale_param.output_height;
13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("stream width=%d, height=%d.",
13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         streamInfo->dim.width, streamInfo->dim.height);
13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // save source stream handler
1350cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            if (mDualChannel) {
1351cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                mSrcStreamHandles[mStreams.size()] = pStream->getMyHandle();
1352cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            } else if (get_main_camera_handle(pStream->getMyHandle())) {
1353cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                mSrcStreamHandles[mStreams.size()] =
1354cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        get_main_camera_handle(pStream->getMyHandle());
1355cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            } else if (get_aux_camera_handle(pStream->getMyHandle())) {
1356cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                mSrcStreamHandles[mStreams.size()] =
1357cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        get_aux_camera_handle(pStream->getMyHandle());
1358cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            } else {
1359cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                LOGE("Invalid Handle. ");
1360cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                rc = BAD_VALUE;
1361cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                break;
1362cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            }
13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1364cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            mSrcStreamHandles[mStreams.size()] = pStream->getMyHandle();
13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pMiscBuf = allocator.allocateMiscBuf(streamInfo);
13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13672896d129511c499aef15b8162df05fa299860f59Thierry Strudel            if (offline) {
13682896d129511c499aef15b8162df05fa299860f59Thierry Strudel                LOGH("Configure Reprocessing Input stream = %d Input: res = %dX%d,"
13692896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        "fmt = %d, buf_cnt = %d",
13702896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        streamInfo->reprocess_config.offline.input_type,
13712896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        rp_cfg.offline.input_dim.width,
13722896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        rp_cfg.offline.input_dim.height,
13732896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        rp_cfg.offline.input_fmt, rp_cfg.offline.num_of_bufs);
13742896d129511c499aef15b8162df05fa299860f59Thierry Strudel            }
13752896d129511c499aef15b8162df05fa299860f59Thierry Strudel
13762896d129511c499aef15b8162df05fa299860f59Thierry Strudel            LOGH("Configure Reprocessing Output: stream = %d, res = %dX%d, fmt = %d,"
1377cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    "type = %d buf_cnt = %d",
13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pStream->getMyOriginalType(), streamInfo->dim.width,
1379cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    streamInfo->dim.height, streamInfo->fmt, type, minStreamBufNum);
13803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // add reprocess stream
13823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (streamInfo->reprocess_config.pp_feature_config.feature_mask
13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    & CAM_QCOM_FEATURE_ROTATION) {
13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = addStream(allocator, pStreamInfoBuf, pMiscBuf,
1385cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        &padding, NULL, NULL, false, false,
13862896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        streamInfo->reprocess_config.pp_feature_config.rotation,
13872896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        pStream->getMyCamType());
13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = addStream(allocator, pStreamInfoBuf, pMiscBuf,
13902896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        &padding, NULL, NULL, false, false, ROTATE_0,
13912896d129511c499aef15b8162df05fa299860f59Thierry Strudel                        pStream->getMyCamType());
13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("add reprocess stream failed, ret = %d", rc);
13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == NO_ERROR) {
14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pSrcChannel = pSrcChannel;
14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamBySrouceHandle
14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: find reprocess stream by its source stream handle
14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @srcHandle : source stream handle
14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : ptr to reprocess stream if found. NULL if not found
14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14163d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream * QCameraReprocessChannel::getStreamBySrouceHandle(uint32_t srcHandle)
14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraStream *pStream = NULL;
14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
1421cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if (validate_handle(mSrcStreamHandles[i], srcHandle)) {
14223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pStream = mStreams[i];
14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return pStream;
14283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stop
14323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop channel and unmap offline buffers
14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::stop()
14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = QCameraChannel::stop();
14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!mOfflineBuffers.empty()) {
14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCameraStream *stream = NULL;
14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        List<OfflineBuffer>::iterator it = mOfflineBuffers.begin();
14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int error = NO_ERROR;
14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for( ; it != mOfflineBuffers.end(); it++) {
14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            stream = (*it).stream;
14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NULL != stream) {
14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                error = stream->unmapBuf((*it).type,
14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         (*it).index,
14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         -1);
14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (NO_ERROR != error) {
14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("Error during offline buffer unmap %d",
14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                           error);
14583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
14603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineBuffers.clear();
14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
14643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : doReprocessOffline
14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do offline reprocess on the frame
14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
14723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame   : frame to be performed a reprocess
14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @meta_buf : Metadata buffer for reprocessing
14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pStream  : Actual reprocess stream
14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
14783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_buf_def_t *frame,
14813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_buf_def_t *meta_buf, QCameraStream *pStream)
14823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    OfflineBuffer mappedBuffer;
14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t buf_index = 0;
14863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t meta_buf_index = 0;
14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((frame == NULL) || (meta_buf == NULL)) {
14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid Input Paramters");
14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return INVALID_OPERATION;
14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (pStream == NULL) {
14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pStream = getStreamBySrouceHandle(frame->stream_id);
14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pStream == NULL) {
14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Input validation failed.");
14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return INVALID_OPERATION;
14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!mOfflineBuffers.empty()) {
15023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        List<OfflineBuffer>::iterator it = mOfflineBuffers.begin();
15033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for( ; it != mOfflineBuffers.end(); it++) {
15043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            buf_index = (buf_index < ((*it).index)) ? ((*it).index) : buf_index;
15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        buf_index += 1;
15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    meta_buf_index = buf_index;
15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (meta_buf != NULL) {
15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF,
15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                meta_buf_index,
15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                -1,
15143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                meta_buf->fd,
15153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                meta_buf->buffer,
15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                meta_buf->frame_len);
15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc ) {
15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error during metadata buffer mapping");
15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = -1;
15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.index = meta_buf_index;
15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.stream = pStream;
15253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF;
15263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineBuffers.push_back(mappedBuffer);
15273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        buf_index += 1;
15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             buf_index,
15323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             -1,
15333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             frame->fd,
15343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             frame->buffer,
15353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             frame->frame_len);
15363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR != rc ) {
15373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error during reprocess input buffer mapping");
15383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = -1;
15393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
15403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mappedBuffer.index = buf_index;
15423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mappedBuffer.stream = pStream;
15433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF;
15443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mOfflineBuffers.push_back(mappedBuffer);
15453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_parm_buffer_t param;
15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    param.reprocess.buf_index = buf_index;
15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    param.reprocess.frame_idx = frame->frame_idx;
155254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel    param.reprocess.is_uv_subsampled = frame->is_uv_subsampled;
1553c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    cam_stream_info_t *streamInfo =
1554c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            reinterpret_cast<cam_stream_info_t *>(pStream->getStreamInfoBuf()->getPtr(0));
1555c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
1556c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)) && streamInfo &&
1557c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel             (streamInfo->reprocess_config.pp_feature_config.feature_mask &
1558c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel             CAM_QCOM_FEATURE_METADATA_BYPASS)) {
1559c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        LOGH("set meta bypass for quadra cfa first pass");
1560c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        // Backend will skip processing of metadata for first pass
1561c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        param.reprocess.is_offline_meta_bypass = 1;
1562c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    }
15633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (meta_buf != NULL) {
15643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.reprocess.meta_present = 1;
15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.reprocess.meta_buf_index = meta_buf_index;
15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGI("Offline reprocessing id = %d buf Id = %d meta index = %d type = %d",
15693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             param.reprocess.frame_idx, param.reprocess.buf_index,
15703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.meta_buf_index, pStream->getMyOriginalType());
15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = pStream->setParameter(param);
15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != NO_ERROR) {
15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("stream setParameter for reprocess failed");
15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
15793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : doReprocessOffline
15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do offline reprocess on the frame
15843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame   : frame to be performed a reprocess
15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @meta_buf : Metadata buffer for reprocessing
15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @mParameter : camera parameters
15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
15913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
15923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
15933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
15943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_super_buf_t *frame,
15953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_buf_def_t *meta_buf, QCameraParametersIntf &mParameter)
15963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
15973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
15983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraStream *pStream = NULL;
15993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mStreams.size() < 1) {
16013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No reprocess streams");
16023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
16033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_pSrcChannel == NULL) {
16053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No source channel for reprocess");
16063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (frame == NULL) {
16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid source frame");
16113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
16123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < frame->num_bufs; i++) {
16153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id);
16163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((pStream != NULL) &&
1617cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle,pStream->getChannelHandle()))) {
16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (mParameter.getofflineRAW() &&
16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))
16203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) {
16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                continue;
16223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
16233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)
1625c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                     && ((mParameter.getManualCaptureMode()
1626c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                     < CAM_MANUAL_CAPTURE_TYPE_3) && (!mParameter.getQuadraCfa())))
16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) {
16283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Skip metadata for reprocess now because PP module cannot handle meta data
16293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // May need furthur discussion if Imaginglib need meta data
1630c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                // Do not skip metadata for manual capture or quadra CFA mode.
16313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                continue;
16323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
16333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Update Metadata
16353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (meta_buf != NULL) {
16363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                uint32_t stream_id = frame->bufs[i]->stream_id;
16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                QCameraStream *srcStream =
16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_pSrcChannel->getStreamByHandle(stream_id);
16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                metadata_buffer_t *pMetaData =
16403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (metadata_buffer_t *)meta_buf->buffer;
16413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if ((NULL != pMetaData) && (NULL != srcStream)) {
16423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    IF_META_AVAILABLE(cam_crop_data_t, crop,
16433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            CAM_INTF_META_CROP_DATA, pMetaData) {
16443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (MAX_NUM_STREAMS > crop->num_of_streams) {
16453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            for (int j = 0; j < MAX_NUM_STREAMS; j++) {
16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                if (crop->crop_info[j].stream_id ==
16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            srcStream->getMyServerID()) {
16483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    // Store crop/roi information for offline reprocess
16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    // in the reprocess stream slot
16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop->crop_info[crop->num_of_streams].crop =
16513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            crop->crop_info[j].crop;
16523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop->crop_info[crop->num_of_streams].roi_map =
16533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            crop->crop_info[j].roi_map;
16543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    for (uint8_t k = 0; k < mStreams.size(); k++) {
16553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        if (srcStream->getMyType() ==
16563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                mStreams[k]->getMyOriginalType()) {
16573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            crop->crop_info[crop->num_of_streams].stream_id =
16583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                    mStreams[k]->getMyServerID();
16593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                            break;
16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        }
16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    }
16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop->num_of_streams++;
16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    break;
16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                }
16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            }
16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        } else {
16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGE("No space to add reprocess stream crop/roi information");
16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
16693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
1671cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            } else {
1672cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                LOGE("Metadata NULL");
16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1675295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            if (mParameter.getofflineRAW()) {
1676295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                //For offline RAW reprocessing, make sure cache is clean & invalidated
1677295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                frame->bufs[i]->cache_flags |= CPU_HAS_READ_WRITTEN;
1678295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            }
1679295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            //Do Cache ops before sending to reprocess
1680295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            if (frame->bufs[i] != NULL) {
1681295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                pStream->handleCacheOps(frame->bufs[i]);
1682295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            }
16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = doReprocessOffline (frame->bufs[i], meta_buf, pStream);
16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
16853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : doReprocess
16913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do a reprocess on the frame
16933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame   : frame to be performed a reprocess
16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @mParameter : camera parameters
16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pMetaStream: Metadata stream handle
16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @meta_buf_index : Metadata buffer index
16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocess(mm_camera_super_buf_t *frame,
17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCameraParametersIntf &mParameter, QCameraStream *pMetaStream,
17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint8_t meta_buf_index)
17073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mStreams.size() < 1) {
17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No reprocess streams");
17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_pSrcChannel == NULL) {
17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No source channel for reprocess");
17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (pMetaStream == NULL) {
17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Null Metadata buffer for processing");
17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < frame->num_bufs; i++) {
17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCameraStream *pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id);
1724cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if ((pStream != NULL) &&
1725cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle, pStream->getChannelHandle()))) {
17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (mParameter.getofflineRAW() && !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))
17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW))
17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) {
17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW
17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                continue;
17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)
1733c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                     && ((mParameter.getManualCaptureMode()
1734c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                     < CAM_MANUAL_CAPTURE_TYPE_3) && (!mParameter.getQuadraCfa())))
17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) {
17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Skip metadata for reprocess now because PP module cannot handle meta data
17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // May need furthur discussion if Imaginglib need meta data
1738c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                // Do not skip metadata for manual capture or quadra CFA mode.
17393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                continue;
17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1742295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            //Do Cache ops before sending to reprocess
1743295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            if (frame->bufs[i] != NULL) {
1744295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                pStream->handleCacheOps(frame->bufs[i]);
1745295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            }
1746295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel
17473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cam_stream_parm_buffer_t param;
17483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.buf_index = frame->bufs[i]->buf_idx;
17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.frame_idx = frame->bufs[i]->frame_idx;
175254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel            param.reprocess.is_uv_subsampled = frame->bufs[i]->is_uv_subsampled;
17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (pMetaStream != NULL) {
17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // we have meta data frame bundled, sent together with reprocess frame
17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param.reprocess.meta_present = 1;
17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param.reprocess.meta_stream_handle = pMetaStream->getMyServerID();
17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                param.reprocess.meta_buf_index = meta_buf_index;
17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGI("Online reprocessing id = %d buf Id = %d meta index = %d type = %d",
17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     param.reprocess.frame_idx, param.reprocess.buf_index,
17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    param.reprocess.meta_buf_index, pStream->getMyOriginalType());
17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = pStream->setParameter(param);
17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("stream setParameter for reprocess failed");
17673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
17683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
17703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
17723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
17733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : doReprocess
17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do a reprocess on the frame
17783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
17803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buf_fd     : fd to the input buffer that needs reprocess
17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buffer     : buffer pointer of actual buffer
17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buf_lenght : length of the input buffer
17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @ret_val    : result of reprocess.
17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                 Example: Could be faceID in case of register face image.
17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocess(int buf_fd, void *buffer,
17913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        size_t buf_length, int32_t &ret_val)
17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mStreams.size() < 1) {
17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No reprocess streams");
17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t buf_idx = 0;
18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < mStreams.size(); i++) {
18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((mStreams[i] != NULL) &&
1802cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) {
18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            continue;
18043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 buf_idx, -1,
18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 buf_fd, buffer, buf_length);
18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc == NO_ERROR) {
18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cam_stream_parm_buffer_t param;
18113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
18123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.buf_index = buf_idx;
18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mStreams[i]->setParameter(param);
18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ret_val = param.reprocess.ret_val;
18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  buf_idx, -1);
18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace qcamera
1826