16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* Redistribution and use in source and binary forms, with or without
46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* modification, are permitted provided that the following conditions are
56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* met:
66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Redistributions of source code must retain the above copyright
76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       notice, this list of conditions and the following disclaimer.
86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Redistributions in binary form must reproduce the above
96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       copyright notice, this list of conditions and the following
106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       disclaimer in the documentation and/or other materials provided
116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       with the distribution.
126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Neither the name of The Linux Foundation nor the names of its
136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       contributors may be used to endorse or promote products derived
146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       from this software without specific prior written permission.
156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*/
296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define LOG_TAG "QCameraChannel"
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/Errors.h>
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraParameters.h"
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h"
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraChannel.h"
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevusing namespace android;
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera {
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraChannel
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constrcutor of QCameraChannel
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_handle : camera handle
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_ops    : ptr to camera ops table
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel::QCameraChannel(uint32_t cam_handle,
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                               mm_camera_ops_t *cam_ops)
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_camHandle = cam_handle;
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_camOps = cam_ops;
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_bIsActive = false;
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_handle = 0;
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_numStreams = 0;
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(mStreams, 0, sizeof(mStreams));
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraChannel
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constrcutor of QCameraChannel
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel::QCameraChannel()
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_camHandle = 0;
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_camOps = NULL;
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_bIsActive = false;
786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_handle = 0;
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_numStreams = 0;
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(mStreams, 0, sizeof(mStreams));
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : ~QCameraChannel
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraChannel
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel::~QCameraChannel()
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_bIsActive) {
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stop();
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mStreams[i] != NULL) {
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delete mStreams[i];
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mStreams[i] = 0;
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_numStreams = 0;
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_camOps->delete_channel(m_camHandle, m_handle);
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_handle = 0;
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : init
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: initialization of channel
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @attr    : channel bundle attribute setting
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dataCB  : data notify callback
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userData: user data ptr
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::init(mm_camera_channel_attr_t *attr,
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             mm_camera_buf_notify_t dataCB,
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             void *userData)
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_handle = m_camOps->add_channel(m_camHandle,
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      attr,
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      dataCB,
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                      userData);
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_handle == 0) {
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Add channel failed", __func__);
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addStream
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a stream into channel
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @allocator      : stream related buffer allocator
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @streamInfoBuf  : ptr to buf that constains stream info
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @minStreamBufNum: number of stream buffers needed
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @paddingInfo    : padding information
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @stream_cb      : stream data notify callback
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userdata       : user data ptr
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::addStream(QCameraAllocator &allocator,
1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  QCameraHeapMemory *streamInfoBuf,
1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  uint8_t minStreamBufNum,
1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  cam_padding_info_t *paddingInfo,
1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  stream_cb_routine stream_cb,
1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  void *userdata)
1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_numStreams >= MAX_STREAM_NUM_IN_BUNDLE) {
1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: stream number (%d) exceeds max limit (%d)",
1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev              __func__, m_numStreams, MAX_STREAM_NUM_IN_BUNDLE);
1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStream *pStream = new QCameraStream(allocator,
1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                               m_camHandle,
1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                               m_handle,
1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                               m_camOps,
1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                               paddingInfo);
1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pStream == NULL) {
1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No mem for Stream", __func__);
1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pStream->init(streamInfoBuf, minStreamBufNum, stream_cb, userdata);
1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == 0) {
1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mStreams[m_numStreams] = pStream;
1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_numStreams++;
1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pStream;
1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : start
1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start channel, which will start all streams belong to this channel
1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * PARAMETERS : None
1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
20072594c0844ef2066190ecaddf73c9207a983ad90Muhua Liint32_t QCameraChannel::start()
2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_numStreams > 1) {
2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // there is more than one stream in the channel
2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // we need to notify mctl that all streams in this channel need to be bundled
2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        cam_bundle_config_t bundleInfo;
2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        memset(&bundleInfo, 0, sizeof(bundleInfo));
2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = m_camOps->get_bundle_info(m_camHandle, m_handle, &bundleInfo);
2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rc != NO_ERROR) {
2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: get_bundle_info failed", __func__);
2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return rc;
2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (bundleInfo.num_of_streams > 1) {
21572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li            for (int i = 0; i < bundleInfo.num_of_streams; i++) {
21672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                QCameraStream *pStream = getStreamByServerID(bundleInfo.stream_ids[i]);
21772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                if (pStream != NULL) {
21872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
21972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                        // Skip metadata for reprocess now because PP module cannot handle meta data
22072594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                        // May need furthur discussion if Imaginglib need meta data
22172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                        continue;
22272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    }
22372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li
22472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    cam_stream_parm_buffer_t param;
22572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
22672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    param.type = CAM_STREAM_PARAM_TYPE_SET_BUNDLE_INFO;
22772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    param.bundleInfo = bundleInfo;
22872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    rc = pStream->setParameter(param);
22972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    if (rc != NO_ERROR) {
23072594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                        ALOGE("%s: stream setParameter for set bundle failed", __func__);
23172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                        return rc;
23272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                    }
23372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li                }
2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mStreams[i] != NULL) {
2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mStreams[i]->start();
2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = m_camOps->start_channel(m_camHandle, m_handle);
2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        for (int i = 0; i < m_numStreams; i++) {
2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (mStreams[i] != NULL) {
2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                mStreams[i]->stop();
2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_bIsActive = true;
2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stop
2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop a channel, which will stop all streams belong to this channel
2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::stop()
2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = m_camOps->stop_channel(m_camHandle, m_handle);
2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mStreams[i] != NULL) {
2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mStreams[i]->stop();
2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_bIsActive = false;
2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : bufDone
2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return a stream buf back to kernel
2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @recvd_frame  : stream buf frame to be returned
2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame)
2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < recvd_frame->num_bufs; i++) {
3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         if (recvd_frame->bufs[i] != NULL) {
3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev             for (int j = 0; j < m_numStreams; j++) {
3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                 if (mStreams[j] != NULL &&
3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                     mStreams[j]->getMyHandle() == recvd_frame->bufs[i]->stream_id) {
3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                     rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx);
3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                     break; // break loop j
3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                 }
3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev             }
3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         }
3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processZoomDone
3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process zoom done event
3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @previewWindoe : ptr to preview window ops table, needed to set preview
3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                    crop information
3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @crop_info     : crop info as a result of zoom operation
3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::processZoomDone(preview_stream_ops_t *previewWindow,
3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        cam_crop_data_t &crop_info)
3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mStreams[i] != NULL) {
3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mStreams[i]->processZoomDone(previewWindow, crop_info);
3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getStreamByHandle
3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return stream object by stream handle
3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @streamHandle : stream handle
3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : stream object. NULL if not found
3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStream *QCameraChannel::getStreamByHandle(uint32_t streamHandle)
3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mStreams[i] != NULL && mStreams[i]->getMyHandle() == streamHandle) {
3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return mStreams[i];
3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NULL;
3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
36172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * FUNCTION   : getStreamByServerID
3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * DESCRIPTION: return stream object by stream server ID from daemon
3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
36672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li *   @serverID : stream server ID
36772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li *
36872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * RETURN     : stream object. NULL if not found
36972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li *==========================================================================*/
37072594c0844ef2066190ecaddf73c9207a983ad90Muhua LiQCameraStream *QCameraChannel::getStreamByServerID(uint32_t serverID)
37172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li{
37272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li    for (int i = 0; i < m_numStreams; i++) {
37372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li        if (mStreams[i] != NULL && mStreams[i]->getMyServerID() == serverID) {
37472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li            return mStreams[i];
37572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li        }
37672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li    }
37772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li    return NULL;
37872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li}
37972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li
38072594c0844ef2066190ecaddf73c9207a983ad90Muhua Li/*===========================================================================
38172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * FUNCTION   : getStreamByIndex
38272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li *
38372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * DESCRIPTION: return stream object by index of streams in the channel
38472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li *
38572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * PARAMETERS :
38672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li *   @index : index of stream in the channel
3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : stream object. NULL if not found
3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStream *QCameraChannel::getStreamByIndex(uint8_t index)
3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (index < m_numStreams) {
3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return mStreams[index];
3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NULL;
3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraPicChannel
4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraPicChannel
4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_handle : camera handle
4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_ops    : ptr to camera ops table
4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPicChannel::QCameraPicChannel(uint32_t cam_handle,
4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     mm_camera_ops_t *cam_ops) :
4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel(cam_handle, cam_ops)
4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraPicChannel
4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constructor of QCameraPicChannel
4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPicChannel::QCameraPicChannel()
4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : ~QCameraPicChannel
4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraPicChannel
4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPicChannel::~QCameraPicChannel()
4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : takePicture
4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send request for queued snapshot frames
4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @num_of_snapshot : number of snapshot frames requested
4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPicChannel::takePicture(uint8_t num_of_snapshot)
4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = m_camOps->request_super_buf(m_camHandle,
4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             m_handle,
4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             num_of_snapshot);
4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : cancelPicture
4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel request for queued snapshot frames
4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPicChannel::cancelPicture()
4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle);
4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraVideoChannel
4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraVideoChannel
4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_handle : camera handle
4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_ops    : ptr to camera ops table
4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraVideoChannel::QCameraVideoChannel(uint32_t cam_handle,
4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                         mm_camera_ops_t *cam_ops) :
4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel(cam_handle, cam_ops)
4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraVideoChannel
4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constructor of QCameraVideoChannel
4996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraVideoChannel::QCameraVideoChannel()
5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : ~QCameraVideoChannel
5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraVideoChannel
5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraVideoChannel::~QCameraVideoChannel()
5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : releaseFrame
5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return video frame from app
5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @opaque     : ptr to video frame to be returned
5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @isMetaData : if frame is a metadata or real frame
5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraVideoChannel::releaseFrame(const void * opaque, bool isMetaData)
5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStream *pVideoStream = NULL;
5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mStreams[i] != NULL && mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO)) {
5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pVideoStream = mStreams[i];
5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pVideoStream) {
5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No video stream in the channel", __func__);
5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = pVideoStream->bufDone(opaque, isMetaData);
5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraReprocessChannel
5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraReprocessChannel
5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_handle : camera handle
5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cam_ops    : ptr to camera ops table
5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @pp_mask    : post-proccess feature mask
5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel::QCameraReprocessChannel(uint32_t cam_handle,
5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                 mm_camera_ops_t *cam_ops) :
5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel(cam_handle, cam_ops),
5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_pSrcChannel(NULL)
5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCameraReprocessChannel
5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constructor of QCameraReprocessChannel
5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel::QCameraReprocessChannel() :
5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_pSrcChannel(NULL)
5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : ~QCameraReprocessChannel
5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraReprocessChannel
5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel::~QCameraReprocessChannel()
5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addReprocStreamsFromSource
6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add reprocess streams from input source channel
6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @allocator      : stream related buffer allocator
6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @config         : pp feature configuration
6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @pSrcChannel    : ptr to input source channel that needs reprocess
6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @minStreamBufNum: number of stream buffers needed
6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @paddingInfo    : padding information
6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraReprocessChannel::addReprocStreamsFromSource(QCameraAllocator& allocator,
6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                            cam_pp_feature_config_t &config,
6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                            QCameraChannel *pSrcChannel,
6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                            uint8_t minStreamBufNum,
6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                            cam_padding_info_t *paddingInfo)
6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStream *pStream = NULL;
6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraHeapMemory *pStreamInfoBuf = NULL;
6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_stream_info_t *streamInfo = NULL;
6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < pSrcChannel->getNumOfStreams(); i++) {
6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        pStream = pSrcChannel->getStreamByIndex(i);
6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (pStream != NULL) {
6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // Skip metadata for reprocess now because PP module cannot handle meta data
6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // May need furthur discussion if Imaginglib need meta data
6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                continue;
6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC);
6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (pStreamInfoBuf == NULL) {
6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: no mem for stream info buf", __func__);
6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = NO_MEMORY;
6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo = (cam_stream_info_t *)pStreamInfoBuf->getPtr(0);
6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            memset(streamInfo, 0, sizeof(cam_stream_info_t));
6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC;
6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = pStream->getFormat(streamInfo->fmt);
6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = pStream->getFrameDimension(streamInfo->dim);
6509fc8e6ba592de8575c9f9901260b74b0ce84fa0cMuhua Li            streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST;
6519fc8e6ba592de8575c9f9901260b74b0ce84fa0cMuhua Li            streamInfo->num_of_burst = minStreamBufNum;
6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->reprocess_config.pp_type = CAM_ONLINE_REPROCESS_TYPE;
6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->reprocess_config.online.input_stream_id = pStream->getMyServerID();
6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->reprocess_config.online.input_stream_type = pStream->getMyType();
6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->reprocess_config.pp_feature_config = config;
6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
658744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            if (!(pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) ||
659025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy                pStream->isTypeOf(CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT) ||
660025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy                pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) ||
661025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy                pStream->isOrignalTypeOf(CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT))) {
662744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                streamInfo->reprocess_config.pp_feature_config.feature_mask &= ~CAM_QCOM_FEATURE_CAC;
663744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            }
664744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            if (streamInfo->reprocess_config.pp_feature_config.feature_mask & CAM_QCOM_FEATURE_ROTATION) {
665744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                if (streamInfo->reprocess_config.pp_feature_config.rotation == ROTATE_90 ||
666744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    streamInfo->reprocess_config.pp_feature_config.rotation == ROTATE_270) {
667744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    // rotated by 90 or 270, need to switch width and height
668744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    int32_t temp = streamInfo->dim.height;
669744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    streamInfo->dim.height = streamInfo->dim.width;
670744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                    streamInfo->dim.width = temp;
671744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy                }
672744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy            }
673744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy
6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // save source stream handler
6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mSrcStreamHandles[m_numStreams] = pStream->getMyHandle();
6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // add reprocess stream
6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = addStream(allocator,
6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           pStreamInfoBuf, minStreamBufNum,
6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           paddingInfo,
6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                           NULL, NULL);
6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc != NO_ERROR) {
6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: add reprocess stream failed, ret = %d", __func__, rc);
6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_pSrcChannel = pSrcChannel;
6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getStreamBySrouceHandle
6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: find reprocess stream by its source stream handle
6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @srcHandle : source stream handle
7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : ptr to reprocess stream if found. NULL if not found
7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStream * QCameraReprocessChannel::getStreamBySrouceHandle(uint32_t srcHandle)
7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStream *pStream = NULL;
7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mSrcStreamHandles[i] == srcHandle) {
7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pStream = mStreams[i];
7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            break;
7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return pStream;
7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : doReprocess
7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: request to do a reprocess on the frame
7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @frame   : frame to be performed a reprocess
7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraReprocessChannel::doReprocess(mm_camera_super_buf_t *frame)
7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_numStreams < 1) {
7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No reprocess stream is created", __func__);
7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_pSrcChannel == NULL) {
7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No source channel for reprocess", __func__);
7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // find meta data stream and index of meta data frame in the superbuf
7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStream *pMetaStream = NULL;
7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t meta_buf_index = 0;
7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < frame->num_bufs; i++) {
7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        QCameraStream *pStream = m_pSrcChannel->getStreamByHandle(frame->bufs[i]->stream_id);
7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (pStream != NULL) {
7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                meta_buf_index = frame->bufs[i]->buf_idx;
7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                pMetaStream = pStream;
7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < frame->num_bufs; i++) {
7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        QCameraStream *pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id);
7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (pStream != NULL) {
7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // Skip metadata for reprocess now because PP module cannot handle meta data
7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // May need furthur discussion if Imaginglib need meta data
7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                continue;
7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            cam_stream_parm_buffer_t param;
7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            param.reprocess.buf_index = frame->bufs[i]->buf_idx;
7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            param.reprocess.frame_idx = frame->bufs[i]->frame_idx;
7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (pMetaStream != NULL) {
7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // we have meta data frame bundled, sent together with reprocess frame
7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                param.reprocess.meta_present = 1;
7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                param.reprocess.meta_stream_handle = pMetaStream->getMyServerID();
7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                param.reprocess.meta_buf_index = meta_buf_index;
7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = pStream->setParameter(param);
7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc != NO_ERROR) {
7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: stream setParameter for reprocess failed", __func__);
7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : doReprocess
7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: request to do a reprocess on the frame
7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_fd     : fd to the input buffer that needs reprocess
7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @buf_lenght : length of the input buffer
7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ret_val    : result of reprocess.
7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                 Example: Could be faceID in case of register face image.
7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraReprocessChannel::doReprocess(int buf_fd,
8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             uint32_t buf_length,
8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             int32_t &ret_val)
8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = 0;
8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_numStreams < 1) {
8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No reprocess stream is created", __func__);
8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t buf_idx = 0;
8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < m_numStreams; i++) {
8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                 buf_idx, -1,
8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                 buf_fd, buf_length);
8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rc == NO_ERROR) {
8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            cam_stream_parm_buffer_t param;
8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            param.reprocess.buf_index = buf_idx;
8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mStreams[i]->setParameter(param);
8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ret_val = param.reprocess.ret_val;
8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  buf_idx, -1);
8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera
835