166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without
466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are
566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met:
666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*     * Redistributions of source code must retain the above copyright
766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       notice, this list of conditions and the following disclaimer.
866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*     * Redistributions in binary form must reproduce the above
966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       copyright notice, this list of conditions and the following
1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       disclaimer in the documentation and/or other materials provided
1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       with the distribution.
1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*     * Neither the name of The Linux Foundation nor the names of its
1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       contributors may be used to endorse or promote products derived
1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*       from this software without specific prior written permission.
1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/
2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QCameraChannel"
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h>
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2HWI.h"
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" {
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h"
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinusing namespace android;
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera {
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraChannel
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constrcutor of QCameraChannel
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraChannel::QCameraChannel(uint32_t cam_handle,
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               mm_camera_ops_t *cam_ops)
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camHandle = cam_handle;
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camOps = cam_ops;
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bIsActive = false;
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bAllowDynBufAlloc = false;
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_handle = 0;
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraChannel
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constrcutor of QCameraChannel
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraChannel::QCameraChannel()
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camHandle = 0;
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camOps = NULL;
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bIsActive = false;
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_handle = 0;
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCameraChannel
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraChannel
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraChannel::~QCameraChannel()
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_bIsActive) {
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stop();
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL) {
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (m_handle == mStreams[i]->getChannelHandle()) {
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    delete mStreams[i];
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mStreams.clear();
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camOps->delete_channel(m_camHandle, m_handle);
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_handle = 0;
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : deleteChannel
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deletes a camera channel
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraChannel::deleteChannel()
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_bIsActive) {
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stop();
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((mStreams[i] != NULL) && (m_handle == mStreams[i]->getChannelHandle())) {
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreams[i]->deleteStream();
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camOps->delete_channel(m_camHandle, m_handle);
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setStreamSyncCB
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: reg callback function to stream of stream type
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @stream_type : Stream type for which callback needs to be registered.
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @stream_cb   : Callback function
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              non-zero failure code
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::setStreamSyncCB (cam_stream_type_t stream_type,
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream_cb_routine stream_cb)
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = UNKNOWN_ERROR;
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((mStreams[i] != NULL) && (stream_type == mStreams[i]->getMyType())) {
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mStreams[i]->setSyncDataCB(stream_cb);
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : init
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: initialization of channel
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @attr    : channel bundle attribute setting
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @dataCB  : data notify callback
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @userData: user data ptr
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::init(mm_camera_channel_attr_t *attr,
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                             mm_camera_buf_notify_t dataCB,
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                             void *userData)
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_handle = m_camOps->add_channel(m_camHandle,
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      attr,
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      dataCB,
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      userData);
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_handle == 0) {
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Add channel failed");
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return UNKNOWN_ERROR;
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : addStream
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a stream into channel
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @allocator      : stream related buffer allocator
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamInfoBuf  : ptr to buf that contains stream info
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @miscBuf        : ptr to buf that contains misc buffers
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @minStreamBufNum: number of stream buffers needed
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @paddingInfo    : padding information
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream_cb      : stream data notify callback
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @userdata       : user data ptr
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @bDynAllocBuf   : flag indicating if allow allocate buffers in 2 steps
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @online_rotation: rotation applied online
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::addStream(QCameraAllocator &allocator,
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraHeapMemory *streamInfoBuf, QCameraHeapMemory *miscBuf,
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint8_t minStreamBufNum, cam_padding_info_t *paddingInfo,
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream_cb_routine stream_cb, void *userdata, bool bDynAllocBuf,
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        bool bDeffAlloc, cam_rotation_t online_rotation)
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mStreams.size() >= MAX_STREAM_NUM_IN_BUNDLE) {
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("stream number (%zu) exceeds max limit (%d)",
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               mStreams.size(), MAX_STREAM_NUM_IN_BUNDLE);
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (streamInfoBuf != NULL) {
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfoBuf->deallocate();
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            delete streamInfoBuf;
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfoBuf = NULL;
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraStream *pStream = new QCameraStream(allocator,
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_camHandle, m_handle, m_camOps, paddingInfo, bDeffAlloc,
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            online_rotation);
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (pStream == NULL) {
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No mem for Stream");
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (streamInfoBuf != NULL) {
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfoBuf->deallocate();
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            delete streamInfoBuf;
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfoBuf = NULL;
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_MEMORY;
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = pStream->init(streamInfoBuf, miscBuf, minStreamBufNum,
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                       stream_cb, userdata, bDynAllocBuf);
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == 0) {
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreams.add(pStream);
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete pStream;
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : linkStream
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: link a stream into channel
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @ch      : Channel which the stream belongs to
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream  : Stream which needs to be linked
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::linkStream(QCameraChannel *ch, QCameraStream *stream)
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((0 == m_handle) || (NULL == ch) || (NULL == stream)) {
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t handle = m_camOps->link_stream(m_camHandle,
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ch->getMyHandle(),
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            stream->getMyHandle(),
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_handle);
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 == handle) {
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Linking of stream failed");
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = INVALID_OPERATION;
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreams.add(stream);
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : start
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start channel, which will start all streams belong to this channel
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::start()
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mStreams.size() > 1) {
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // there is more than one stream in the channel
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // we need to notify mctl that all streams in this channel need to be bundled
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_bundle_config_t bundleInfo;
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&bundleInfo, 0, sizeof(bundleInfo));
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = m_camOps->get_bundle_info(m_camHandle, m_handle, &bundleInfo);
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("get_bundle_info failed");
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (bundleInfo.num_of_streams > 1) {
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            for (int i = 0; i < bundleInfo.num_of_streams; i++) {
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                QCameraStream *pStream = getStreamByServerID(bundleInfo.stream_ids[i]);
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (pStream != NULL) {
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    if ((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA))
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            || (pStream->isTypeOf(CAM_STREAM_TYPE_OFFLINE_PROC))) {
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        // Skip metadata for reprocess now because PP module cannot handle meta data
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        // May need furthur discussion if Imaginglib need meta data
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        continue;
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    }
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_stream_parm_buffer_t param;
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.type = CAM_STREAM_PARAM_TYPE_SET_BUNDLE_INFO;
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.bundleInfo = bundleInfo;
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    rc = pStream->setParameter(param);
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    if (rc != NO_ERROR) {
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        LOGE("stream setParameter for set bundle failed");
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        return rc;
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    }
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((mStreams[i] != NULL) &&
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                (m_handle == mStreams[i]->getChannelHandle())) {
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreams[i]->start();
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = m_camOps->start_channel(m_camHandle, m_handle);
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != NO_ERROR) {
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (size_t i = 0; i < mStreams.size(); i++) {
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((mStreams[i] != NULL) &&
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (m_handle == mStreams[i]->getChannelHandle())) {
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mStreams[i]->stop();
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_bIsActive = true;
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (size_t i = 0; i < mStreams.size(); i++) {
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (mStreams[i] != NULL) {
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mStreams[i]->cond_signal();
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : stop
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop a channel, which will stop all streams belong to this channel
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::stop()
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
375d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    size_t i = 0;
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!m_bIsActive) {
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
381d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch    while(i < mStreams.size()) {
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL) {
383d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch            if (m_handle == mStreams[i]->getChannelHandle()) {
384d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch                mStreams[i]->stop();
385d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch                i++;
386d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch            } else {
387d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch                // Remove linked stream from stream list
388d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch                mStreams.removeAt(i);
389d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch            }
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = m_camOps->stop_channel(m_camHandle, m_handle);
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bIsActive = false;
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : bufDone
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return a stream buf back to kernel
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @recvd_frame  : stream buf frame to be returned
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame)
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) {
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (recvd_frame->bufs[i] != NULL) {
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            for (size_t j = 0; j < mStreams.size(); j++) {
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (mStreams[j] != NULL &&
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mStreams[j]->getMyHandle() == recvd_frame->bufs[i]->stream_id) {
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx);
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break; // break loop j
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : bufDone
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return specified buffer from super buffer to kernel
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @recvd_frame  : stream buf frame to be returned
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream_id      : stream ID of the buffer to be released
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame, uint32_t stream_id)
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t index;
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (int32_t i = 0; i < (int32_t)recvd_frame->num_bufs; i++) {
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        index = -1;
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((recvd_frame->bufs[i] != NULL) &&
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                (recvd_frame->bufs[i]->stream_id == stream_id)) {
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            for (size_t j = 0; j < mStreams.size(); j++) {
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if ((mStreams[j] != NULL) &&
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (mStreams[j]->getMyHandle() == stream_id)) {
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx);
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    index = i;
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break; // break loop j
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((index >= 0) && (index < (int32_t)recvd_frame->num_bufs)) {
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                for (int32_t j = index; j < (int32_t)(recvd_frame->num_bufs - 1); j++) {
46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    recvd_frame->bufs[j] = recvd_frame->bufs[j + 1];
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                recvd_frame->num_bufs--;
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                i--;
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : processZoomDone
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process zoom done event
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @previewWindoe : ptr to preview window ops table, needed to set preview
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *                    crop information
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @crop_info     : crop info as a result of zoom operation
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::processZoomDone(preview_stream_ops_t *previewWindow,
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        cam_crop_data_t &crop_info)
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((mStreams[i] != NULL) &&
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                (m_handle == mStreams[i]->getChannelHandle())) {
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mStreams[i]->processZoomDone(previewWindow, crop_info);
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamByHandle
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by stream handle
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamHandle : stream handle
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : stream object. NULL if not found
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream *QCameraChannel::getStreamByHandle(uint32_t streamHandle)
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL && mStreams[i]->getMyHandle() == streamHandle) {
51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return mStreams[i];
51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NULL;
51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamByServerID
52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by stream server ID from daemon
52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @serverID : stream server ID
52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : stream object. NULL if not found
52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
52866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream *QCameraChannel::getStreamByServerID(uint32_t serverID)
52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL && mStreams[i]->getMyServerID() == serverID) {
53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return mStreams[i];
53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NULL;
53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamByIndex
54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by index of streams in the channel
54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @index : index of stream in the channel
54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : stream object. NULL if not found
54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
54866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream *QCameraChannel::getStreamByIndex(uint32_t index)
54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (index >= MAX_STREAM_NUM_IN_BUNDLE) {
55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (index < mStreams.size()) {
55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return mStreams[index];
55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NULL;
55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : UpdateStreamBasedParameters
56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: update any stream based settings from parameters
56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @param   : reference to parameters object
56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::UpdateStreamBasedParameters(QCameraParametersIntf &param)
57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (param.isPreviewFlipChanged()) {
57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // try to find preview stream
57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (size_t i = 0; i < mStreams.size(); i++) {
57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((mStreams[i] != NULL) &&
57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (m_handle == mStreams[i]->getChannelHandle()) &&
58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW))) ) {
58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                cam_stream_parm_buffer_t param_buf;
58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                memset(&param_buf, 0, sizeof(cam_stream_parm_buffer_t));
58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP;
58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param_buf.flipInfo.flip_mask =
58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_PREVIEW);
58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = mStreams[i]->setParameter(param_buf);
58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (rc != NO_ERROR) {
58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGW("set preview stream flip failed");
59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (param.isVideoFlipChanged()) {
59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // try to find video stream
59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (size_t i = 0; i < mStreams.size(); i++) {
59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((mStreams[i] != NULL) &&
59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (m_handle == mStreams[i]->getChannelHandle()) &&
59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO) ||
60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_VIDEO))) ) {
60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                cam_stream_parm_buffer_t param_buf;
60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                memset(&param_buf, 0, sizeof(cam_stream_parm_buffer_t));
60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP;
60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param_buf.flipInfo.flip_mask =
60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_VIDEO);
60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = mStreams[i]->setParameter(param_buf);
60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (rc != NO_ERROR) {
60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGW("set video stream flip failed");
60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (param.isSnapshotFlipChanged()) {
61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // try to find snapshot/postview stream
61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (size_t i = 0; i < mStreams.size(); i++) {
61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (mStreams[i] != NULL &&
61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (m_handle == mStreams[i]->getChannelHandle()) &&
61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) ||
61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) ||
62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     mStreams[i]->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) ||
62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW) ) ) {
62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                cam_stream_parm_buffer_t param_buf;
62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                memset(&param_buf, 0, sizeof(cam_stream_parm_buffer_t));
62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP;
62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param_buf.flipInfo.flip_mask =
62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT);
62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = mStreams[i]->setParameter(param_buf);
62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (rc != NO_ERROR) {
62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGW("set snapshot stream flip failed");
63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraPicChannel
63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraPicChannel
64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
64866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPicChannel::QCameraPicChannel(uint32_t cam_handle,
64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     mm_camera_ops_t *cam_ops) :
65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraChannel(cam_handle, cam_ops)
65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bAllowDynBufAlloc = true;
65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraPicChannel
65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCameraPicChannel
65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
66466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPicChannel::QCameraPicChannel()
66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bAllowDynBufAlloc = true;
66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCameraPicChannel
67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraPicChannel
67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
67866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPicChannel::~QCameraPicChannel()
67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : takePicture
68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send request for queued snapshot frames
68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buf : request buf info
68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::takePicture (mm_camera_req_buf_t *buf)
69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_camOps->request_super_buf(m_camHandle, m_handle, buf);
69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : cancelPicture
70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel request for queued snapshot frames
70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::cancelPicture()
71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle);
71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : stopAdvancedCapture
71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop advanced capture based on advanced capture type.
72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @type : advanced capture type.
72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::stopAdvancedCapture(mm_camera_advanced_capture_t type)
73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_camOps->process_advanced_capture(m_camHandle,
73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_handle, type, 0, NULL);
73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : startAdvancedCapture
73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start advanced capture based on advanced capture type.
74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @type : advanced capture type.
74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @config: advance capture config
74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::startAdvancedCapture(mm_camera_advanced_capture_t type,
75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_capture_frame_config_t *config)
75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = m_camOps->process_advanced_capture(m_camHandle, m_handle, type,
75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            1, config);
75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* FUNCTION   : flushSuperbuffer
76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush the all superbuffer frames.
76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frame_idx : frame index of focused frame
76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::flushSuperbuffer(uint32_t frame_idx)
77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_camOps->flush_super_buf_queue(m_camHandle, m_handle, frame_idx);
77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraVideoChannel
77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraVideoChannel
78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
78866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraVideoChannel::QCameraVideoChannel(uint32_t cam_handle,
78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                         mm_camera_ops_t *cam_ops) :
79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraChannel(cam_handle, cam_ops)
79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraVideoChannel
79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCameraVideoChannel
79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
80366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraVideoChannel::QCameraVideoChannel()
80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCameraVideoChannel
80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraVideoChannel
81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
81666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraVideoChannel::~QCameraVideoChannel()
81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : takePicture
82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send request for queued snapshot frames
82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @mm_camera_req_buf_t : request buf info
82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraVideoChannel::takePicture(mm_camera_req_buf_t *buf)
83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_camOps->request_super_buf(m_camHandle, m_handle, buf);
83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : cancelPicture
84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel request for queued snapshot frames
84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraVideoChannel::cancelPicture()
85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle);
85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : releaseFrame
85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return video frame from app
85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @opaque     : ptr to video frame to be returned
86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @isMetaData : if frame is a metadata or real frame
86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraVideoChannel::releaseFrame(const void * opaque, bool isMetaData)
86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraStream *pVideoStream = NULL;
87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL && mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO)) {
87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pVideoStream = mStreams[i];
87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == pVideoStream) {
87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No video stream in the channel");
88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = pVideoStream->bufDone(opaque, isMetaData);
88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraReprocessChannel
88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraReprocessChannel
89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pp_mask    : post-proccess feature mask
89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
89966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel::QCameraReprocessChannel(uint32_t cam_handle,
90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                 mm_camera_ops_t *cam_ops) :
90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraChannel(cam_handle, cam_ops),
90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_pSrcChannel(NULL),
90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPassCount(0)
90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCameraReprocessChannel
91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCameraReprocessChannel
91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
91766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel::QCameraReprocessChannel() :
91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_pSrcChannel(NULL),
91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPassCount(0)
92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCameraReprocessChannel
92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraReprocessChannel
92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
93266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel::~QCameraReprocessChannel()
93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : addReprocStreamsFromSource
93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add reprocess streams from input source channel
94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @allocator      : stream related buffer allocator
94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @featureConfig  : pp feature configuration
94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pSrcChannel    : ptr to input source channel that needs reprocess
94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @minStreamBufNum: number of stream buffers needed
94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @burstNum       : number of burst captures needed
94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @paddingInfo    : padding information
94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @param          : reference to parameters
94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @contStream     : continous streaming mode or burst
95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @offline        : configure for offline reprocessing
95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::addReprocStreamsFromSource(
95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraAllocator& allocator, cam_pp_feature_config_t &featureConfig,
95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraChannel *pSrcChannel, uint8_t minStreamBufNum, uint8_t burstNum,
95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_padding_info_t *paddingInfo, QCameraParametersIntf &param, bool contStream,
96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        bool offline)
96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraStream *pStream = NULL;
96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraHeapMemory *pStreamInfoBuf = NULL;
96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraHeapMemory *pMiscBuf = NULL;
96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_info_t *streamInfo = NULL;
96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_padding_info_t padding;
96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == paddingInfo) {
97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    padding = *paddingInfo;
97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Use maximum padding so that the buffer
97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //can be rotated
97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    padding.width_padding = MAX(padding.width_padding, padding.height_padding);
97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    padding.height_padding = padding.width_padding;
97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    padding.offset_info.offset_x = 0;
97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    padding.offset_info.offset_y = 0;
98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("num of src stream = %d", pSrcChannel->getNumOfStreams());
98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < pSrcChannel->getNumOfStreams(); i++) {
98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_pp_feature_config_t pp_featuremask = featureConfig;
98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pStream = pSrcChannel->getStreamByIndex(i);
98666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (pStream != NULL) {
98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (param.getofflineRAW() && !((pStream->isTypeOf(CAM_STREAM_TYPE_RAW))
98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    || (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW))
98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    || (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA))
99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)))) {
99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW
99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                continue;
99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pStream->isTypeOf(CAM_STREAM_TYPE_RAW)
99666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    && (!param.getofflineRAW())) {
99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Skip raw for reprocess now because PP module cannot handle
99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // meta data&raw. May need furthur discussion if Imaginglib need meta data
99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                continue;
100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA))
100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    && !(param.getManualCaptureMode() >=
100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    CAM_MANUAL_CAPTURE_TYPE_3))
100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) {
100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Skip metadata
100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                continue;
100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) ||
101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) ||
101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) {
101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                uint32_t feature_mask = featureConfig.feature_mask;
101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // skip thumbnail reprocessing if not needed
101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (!param.needThumbnailReprocess(&feature_mask)) {
101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    continue;
101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // CAC, SHARPNESS, FLIP and WNR would have been already applied -
102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // on preview/postview stream in realtime.
102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // So, need not apply again.
102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                feature_mask &= ~(CAM_QCOM_FEATURE_DENOISE2D |
102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        CAM_QCOM_FEATURE_CAC |
102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        CAM_QCOM_FEATURE_SHARPNESS |
102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        CAM_QCOM_FEATURE_FLIP |
102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        CAM_QCOM_FEATURE_RAW_PROCESSING);
102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (!feature_mask) {
102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    // Skip thumbnail stream reprocessing since no other
103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    //reprocessing is enabled.
103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    continue;
103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) {
103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                pp_featuremask.feature_mask = 0;
103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_PROCESSING;
103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC);
104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pStreamInfoBuf == NULL) {
104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("no mem for stream info buf");
104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = NO_MEMORY;
104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfo = (cam_stream_info_t *)pStreamInfoBuf->getPtr(0);
104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(streamInfo, 0, sizeof(cam_stream_info_t));
104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfo->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC;
105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Enable CPP high performance mode to put it in turbo frequency mode for
105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // burst/longshot/HDR snapshot cases
105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfo->perf_mode = CAM_PERF_HIGH_PERFORMANCE;
105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (param.getofflineRAW() && pStream->isTypeOf(CAM_STREAM_TYPE_RAW)) {
105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->fmt = CAM_FORMAT_YUV_420_NV21;
105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = pStream->getFormat(streamInfo->fmt);
105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) ||
106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW)) {
106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param.getThumbnailSize(&(streamInfo->dim.width), &(streamInfo->dim.height));
106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if ((param.isPostProcScaling()) &&
106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_SCALE)) {
106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    rc = param.getStreamDimension(CAM_STREAM_TYPE_OFFLINE_PROC,
106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            streamInfo->dim);
106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else if ((param.getofflineRAW()) &&
106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (pStream->isTypeOf(CAM_STREAM_TYPE_RAW))) {
106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,streamInfo->dim);
107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    rc = pStream->getFrameDimension(streamInfo->dim);
107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ( contStream ) {
107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->num_of_burst = 0;
107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST;
108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->num_of_burst = burstNum;
108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfo->num_bufs = minStreamBufNum;
108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_stream_reproc_config_t rp_cfg;
108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(&rp_cfg, 0, sizeof(cam_stream_reproc_config_t));
108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (offline) {
108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                cam_frame_len_offset_t offset;
108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                memset(&offset, 0, sizeof(cam_frame_len_offset_t));
108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rp_cfg.pp_type = CAM_OFFLINE_REPROCESS_TYPE;
109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                pStream->getFormat(rp_cfg.offline.input_fmt);
109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                pStream->getFrameDimension(rp_cfg.offline.input_dim);
109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                pStream->getFrameOffset(offset);
109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rp_cfg.offline.input_buf_planes.plane_info = offset;
109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rp_cfg.offline.input_type = pStream->getMyOriginalType();
109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //For input metadata + input buffer
109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rp_cfg.offline.num_of_bufs = 2;
109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rp_cfg.pp_type = CAM_ONLINE_REPROCESS_TYPE;
110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rp_cfg.online.input_stream_id = pStream->getMyServerID();
110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rp_cfg.online.input_stream_type = pStream->getMyOriginalType();
110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.getStreamRotation(streamInfo->stream_type,
110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    streamInfo->pp_config, streamInfo->dim);
110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfo->reprocess_config = rp_cfg;
110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamInfo->reprocess_config.pp_feature_config = pp_featuremask;
110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (!(pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)
110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT)
111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                || pStream->isTypeOf(CAM_STREAM_TYPE_RAW)
111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))) {
111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // CAC, SHARPNESS, FLIP and WNR would have been already applied -
111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // on preview/postview stream in realtime. Need not apply again.
111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        ~CAM_QCOM_FEATURE_CAC;
111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        ~CAM_QCOM_FEATURE_SHARPNESS;
111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        ~CAM_QCOM_FEATURE_FLIP;
112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //Don't do WNR for thumbnail
112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        ~CAM_QCOM_FEATURE_DENOISE2D;
112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        ~CAM_QCOM_FEATURE_CDS;
112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        ~CAM_QCOM_FEATURE_DSDN;
112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //No need of RAW processing for other than RAW streams
112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamInfo->reprocess_config.pp_feature_config.feature_mask &=
112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        ~CAM_QCOM_FEATURE_RAW_PROCESSING;
113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (param.isHDREnabled()
113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                  && !param.isHDRThumbnailProcessNeeded()){
113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    streamInfo->reprocess_config.pp_feature_config.feature_mask
113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                      &= ~CAM_QCOM_FEATURE_HDR;
113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_stream_type_t type = CAM_STREAM_TYPE_DEFAULT;
113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (offline) {
114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                type = streamInfo->reprocess_config.offline.input_type;
114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                type = streamInfo->reprocess_config.online.input_stream_type;
114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (type == CAM_STREAM_TYPE_SNAPSHOT) {
114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                int flipMode = param.getFlipMode(type);
114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (flipMode > 0) {
114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    streamInfo->reprocess_config.pp_feature_config.feature_mask |=
114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            CAM_QCOM_FEATURE_FLIP;
114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    streamInfo->reprocess_config.pp_feature_config.flip = (uint32_t)flipMode;
115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((streamInfo->reprocess_config.pp_feature_config.feature_mask
115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    & CAM_QCOM_FEATURE_SCALE)
115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    && param.isReprocScaleEnabled()
115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    && param.isUnderReprocScaling()) {
115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //we only Scale Snapshot frame
115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) {
115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    streamInfo->dim.width =
116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            streamInfo->reprocess_config.pp_feature_config.scale_param.output_width;
116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    streamInfo->dim.height =
116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            streamInfo->reprocess_config.pp_feature_config.scale_param.output_height;
116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGH("stream width=%d, height=%d.",
116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         streamInfo->dim.width, streamInfo->dim.height);
116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // save source stream handler
116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mSrcStreamHandles[mStreams.size()] = pStream->getMyHandle();
117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pMiscBuf = allocator.allocateMiscBuf(streamInfo);
117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGH("Configure Reprocessing: stream = %d, res = %dX%d, fmt = %d, type = %d",
117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    pStream->getMyOriginalType(), streamInfo->dim.width,
117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    streamInfo->dim.height, streamInfo->fmt, type);
117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // add reprocess stream
117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (streamInfo->reprocess_config.pp_feature_config.feature_mask
117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    & CAM_QCOM_FEATURE_ROTATION) {
118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = addStream(allocator, pStreamInfoBuf, pMiscBuf,
118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        minStreamBufNum, &padding, NULL, NULL, false, false,
118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        streamInfo->reprocess_config.pp_feature_config.rotation);
118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = addStream(allocator, pStreamInfoBuf, pMiscBuf,
118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        minStreamBufNum, &padding, NULL, NULL, false, false);
118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc != NO_ERROR) {
118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("add reprocess stream failed, ret = %d", rc);
118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == NO_ERROR) {
119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_pSrcChannel = pSrcChannel;
119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
120166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamBySrouceHandle
120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: find reprocess stream by its source stream handle
120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
120666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @srcHandle : source stream handle
120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : ptr to reprocess stream if found. NULL if not found
120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
121066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream * QCameraReprocessChannel::getStreamBySrouceHandle(uint32_t srcHandle)
121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraStream *pStream = NULL;
121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mSrcStreamHandles[i] == srcHandle) {
121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pStream = mStreams[i];
121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return pStream;
122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : stop
122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop channel and unmap offline buffers
122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::stop()
123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = QCameraChannel::stop();
123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mOfflineBuffers.empty()) {
124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraStream *stream = NULL;
124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        List<OfflineBuffer>::iterator it = mOfflineBuffers.begin();
124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int error = NO_ERROR;
124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for( ; it != mOfflineBuffers.end(); it++) {
124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            stream = (*it).stream;
124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NULL != stream) {
124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                error = stream->unmapBuf((*it).type,
124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                         (*it).index,
124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                         -1);
124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (NO_ERROR != error) {
125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("Error during offline buffer unmap %d",
125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                           error);
125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineBuffers.clear();
125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : doReprocessOffline
126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do offline reprocess on the frame
126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frame   : frame to be performed a reprocess
126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @meta_buf : Metadata buffer for reprocessing
126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pStream  : Actual reprocess stream
126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_buf_def_t *frame,
127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_camera_buf_def_t *meta_buf, QCameraStream *pStream)
127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OfflineBuffer mappedBuffer;
127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t buf_index = 0;
128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t meta_buf_index = 0;
128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((frame == NULL) || (meta_buf == NULL)) {
128366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid Input Paramters");
128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return INVALID_OPERATION;
128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (pStream == NULL) {
128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pStream = getStreamBySrouceHandle(frame->stream_id);
128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (pStream == NULL) {
129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Input validation failed.");
129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return INVALID_OPERATION;
129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mOfflineBuffers.empty()) {
129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        List<OfflineBuffer>::iterator it = mOfflineBuffers.begin();
129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for( ; it != mOfflineBuffers.end(); it++) {
129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            buf_index = (buf_index < ((*it).index)) ? ((*it).index) : buf_index;
129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        buf_index += 1;
130166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    meta_buf_index = buf_index;
130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (meta_buf != NULL) {
130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF,
130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                meta_buf_index,
130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                -1,
130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                meta_buf->fd,
130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                meta_buf->frame_len);
131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc ) {
131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error during metadata buffer mapping");
131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = -1;
131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.index = meta_buf_index;
131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.stream = pStream;
131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF;
131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineBuffers.push_back(mappedBuffer);
132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        buf_index += 1;
132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             buf_index,
132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             -1,
132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             frame->fd,
132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             frame->frame_len);
132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR != rc ) {
132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error during reprocess input buffer mapping");
133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = -1;
133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mappedBuffer.index = buf_index;
133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mappedBuffer.stream = pStream;
133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF;
133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mOfflineBuffers.push_back(mappedBuffer);
133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_parm_buffer_t param;
133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.reprocess.buf_index = buf_index;
134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.reprocess.frame_idx = frame->frame_idx;
134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
134566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (meta_buf != NULL) {
134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.meta_present = 1;
134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.meta_buf_index = meta_buf_index;
134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGI("Offline reprocessing id = %d buf Id = %d meta index = %d type = %d",
135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             param.reprocess.frame_idx, param.reprocess.buf_index,
135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.meta_buf_index, pStream->getMyOriginalType());
135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = pStream->setParameter(param);
135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != NO_ERROR) {
135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("stream setParameter for reprocess failed");
135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : doReprocessOffline
136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do offline reprocess on the frame
136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frame   : frame to be performed a reprocess
136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @meta_buf : Metadata buffer for reprocessing
137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @mParameter : camera parameters
137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_super_buf_t *frame,
137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_camera_buf_def_t *meta_buf, QCameraParametersIntf &mParameter)
137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraStream *pStream = NULL;
138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mStreams.size() < 1) {
138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No reprocess streams");
138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_pSrcChannel == NULL) {
138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No source channel for reprocess");
138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (frame == NULL) {
139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid source frame");
139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < frame->num_bufs; i++) {
139766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id);
139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((pStream != NULL) &&
139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                (m_handle == pStream->getChannelHandle())) {
140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (mParameter.getofflineRAW() &&
140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))
140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) {
140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                continue;
140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)
140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     && (mParameter.getManualCaptureMode()
140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     < CAM_MANUAL_CAPTURE_TYPE_3))
140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) {
141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Skip metadata for reprocess now because PP module cannot handle meta data
141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // May need furthur discussion if Imaginglib need meta data
141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                continue;
141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Update Metadata
141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (meta_buf != NULL) {
141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                uint32_t stream_id = frame->bufs[i]->stream_id;
141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                QCameraStream *srcStream =
141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        m_pSrcChannel->getStreamByHandle(stream_id);
142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                metadata_buffer_t *pMetaData =
142166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (metadata_buffer_t *)meta_buf->buffer;
142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if ((NULL != pMetaData) && (NULL != srcStream)) {
142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    IF_META_AVAILABLE(cam_crop_data_t, crop,
142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            CAM_INTF_META_CROP_DATA, pMetaData) {
142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        if (MAX_NUM_STREAMS > crop->num_of_streams) {
142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            for (int j = 0; j < MAX_NUM_STREAMS; j++) {
142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                if (crop->crop_info[j].stream_id ==
142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            srcStream->getMyServerID()) {
142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    // Store crop/roi information for offline reprocess
143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    // in the reprocess stream slot
143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop->crop_info[crop->num_of_streams].crop =
143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            crop->crop_info[j].crop;
143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop->crop_info[crop->num_of_streams].roi_map =
143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            crop->crop_info[j].roi_map;
143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    for (uint8_t k = 0; k < mStreams.size(); k++) {
143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        if (srcStream->getMyType() ==
143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                mStreams[k]->getMyOriginalType()) {
143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            crop->crop_info[crop->num_of_streams].stream_id =
143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                    mStreams[k]->getMyServerID();
144066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                            break;
144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        }
144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    }
144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop->num_of_streams++;
144466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    break;
144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                }
144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            }
144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        } else {
144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            LOGE("No space to add reprocess stream crop/roi information");
144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        }
145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    }
145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = doReprocessOffline (frame->bufs[i], meta_buf, pStream);
145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : doReprocess
146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do a reprocess on the frame
146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frame   : frame to be performed a reprocess
146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @mParameter : camera parameters
146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pMetaStream: Metadata stream handle
146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @meta_buf_index : Metadata buffer index
147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocess(mm_camera_super_buf_t *frame,
147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraParametersIntf &mParameter, QCameraStream *pMetaStream,
147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint8_t meta_buf_index)
147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mStreams.size() < 1) {
148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No reprocess streams");
148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_pSrcChannel == NULL) {
148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No source channel for reprocess");
148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (pMetaStream == NULL) {
149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGW("Null Metadata buffer for processing");
149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < frame->num_bufs; i++) {
149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCameraStream *pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id);
149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((pStream != NULL) && (m_handle == pStream->getChannelHandle())) {
149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (mParameter.getofflineRAW() && !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))
149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW))
149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) {
149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW
150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                continue;
150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)
150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     && (mParameter.getManualCaptureMode()
150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     < CAM_MANUAL_CAPTURE_TYPE_3))
150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) {
150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Skip metadata for reprocess now because PP module cannot handle meta data
150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // May need furthur discussion if Imaginglib need meta data
150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                continue;
150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_stream_parm_buffer_t param;
151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.buf_index = frame->bufs[i]->buf_idx;
151566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.frame_idx = frame->bufs[i]->frame_idx;
151666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pMetaStream != NULL) {
151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // we have meta data frame bundled, sent together with reprocess frame
151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param.reprocess.meta_present = 1;
151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param.reprocess.meta_stream_handle = pMetaStream->getMyServerID();
152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                param.reprocess.meta_buf_index = meta_buf_index;
152166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGI("Online reprocessing id = %d buf Id = %d meta index = %d type = %d",
152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     param.reprocess.frame_idx, param.reprocess.buf_index,
152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.reprocess.meta_buf_index, pStream->getMyOriginalType());
152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = pStream->setParameter(param);
152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc != NO_ERROR) {
152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("stream setParameter for reprocess failed");
153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : doReprocess
153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do a reprocess on the frame
154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buf_fd     : fd to the input buffer that needs reprocess
154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buf_lenght : length of the input buffer
154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @ret_val    : result of reprocess.
154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *                 Example: Could be faceID in case of register face image.
154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocess(int buf_fd,
155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        size_t buf_length, int32_t &ret_val)
155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mStreams.size() < 1) {
155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No reprocess streams");
155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t buf_idx = 0;
156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < mStreams.size(); i++) {
156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((mStreams[i] != NULL) &&
156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                (m_handle != mStreams[i]->getChannelHandle())) {
156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            continue;
156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 buf_idx, -1,
156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 buf_fd, buf_length);
157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc == NO_ERROR) {
157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_stream_parm_buffer_t param;
157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.buf_index = buf_idx;
157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mStreams[i]->setParameter(param);
157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc == NO_ERROR) {
157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ret_val = param.reprocess.ret_val;
157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  buf_idx, -1);
158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera
1588