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 "QCamera3Channel"
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// To remove
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <cutils/properties.h>
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <fcntl.h>
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdio.h>
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h>
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "gralloc.h"
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera3Channel.h"
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera3HWI.h"
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraTrace.h"
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" {
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h"
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinusing namespace android;
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera {
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define IS_BUFFER_ERROR(x) (((x) & V4L2_BUF_FLAG_ERROR) == V4L2_BUF_FLAG_ERROR)
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3Channel
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constrcutor of QCamera3Channel
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3Channel::QCamera3Channel(uint32_t cam_handle,
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               uint32_t channel_handle,
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               mm_camera_ops_t *cam_ops,
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               channel_cb_routine cb_routine,
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               cam_padding_info_t *paddingInfo,
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               uint32_t postprocess_mask,
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                               void *userData, uint32_t numBuffers)
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camHandle = cam_handle;
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_handle = channel_handle;
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_camOps = cam_ops;
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bIsActive = false;
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_numStreams = 0;
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(mStreams, 0, sizeof(mStreams));
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mUserData = userData;
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mStreamInfoBuf = NULL;
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mChannelCB = cb_routine;
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPaddingInfo = *paddingInfo;
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPaddingInfo.offset_info.offset_x = 0;
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPaddingInfo.offset_info.offset_y = 0;
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPostProcMask = postprocess_mask;
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = IS_TYPE_NONE;
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mNumBuffers = numBuffers;
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPerFrameMapUnmapEnable = true;
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dumpFrmCnt = 0;
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCamera3Channel
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCamera3Channel
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3Channel::~QCamera3Channel()
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : destroy
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: internal destructor of QCamera3Channel called by the subclasses
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              this destructor will call pure virtual functions.  stop will eventuall call
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              QCamera3Stream::putBufs.  The putBufs function will
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              call QCamera3Channel::putStreamBufs which is pure virtual
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3Channel::destroy()
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_bIsActive)
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stop();
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL) {
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            delete mStreams[i];
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreams[i] = 0;
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_numStreams = 0;
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : addStream
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a stream into channel
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamType     : stream type
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamFormat   : stream format
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamDim      : stream dimension
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamRotation : rotation of the stream
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @minStreamBufNum : minimal buffer count for particular stream type
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @postprocessMask : post-proccess feature mask
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @isType         : type of image stabilization required on the stream
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::addStream(cam_stream_type_t streamType,
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  cam_format_t streamFormat,
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  cam_dimension_t streamDim,
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  cam_rotation_t streamRotation,
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  uint8_t minStreamBufNum,
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  uint32_t postprocessMask,
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  cam_is_type_t isType,
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  uint32_t batchSize)
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_numStreams >= 1) {
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Only one stream per channel supported in v3 Hal");
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_numStreams >= MAX_STREAM_NUM_IN_BUNDLE) {
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("stream number (%d) exceeds max limit (%d)",
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               m_numStreams, MAX_STREAM_NUM_IN_BUNDLE);
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Stream *pStream = new QCamera3Stream(m_camHandle,
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                               m_handle,
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                               m_camOps,
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                               &mPaddingInfo,
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                               this);
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (pStream == NULL) {
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No mem for Stream");
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_MEMORY;
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("batch size is %d", batchSize);
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = pStream->init(streamType, streamFormat, streamDim, streamRotation,
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            NULL, minStreamBufNum, postprocessMask, isType, batchSize,
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamCbRoutine, this);
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == 0) {
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreams[m_numStreams] = pStream;
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_numStreams++;
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete pStream;
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : start
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start channel, which will start all streams belong to this channel
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
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 QCamera3Channel::start()
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_numStreams > 1) {
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGW("bundle not supported");
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (m_numStreams == 0) {
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(m_bIsActive) {
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGW("Attempt to start active channel");
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL) {
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreams[i]->start();
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bIsActive = true;
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : stop
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop a channel, which will stop all streams belong to this channel
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::stop()
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(!m_bIsActive) {
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Attempt to stop inactive channel");
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL) {
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreams[i]->stop();
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_bIsActive = false;
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setBatchSize
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Set batch size for the channel. This is a dummy implementation
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              for the base class
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @batchSize  : Number of image buffers in a batch
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success always
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::setBatchSize(uint32_t batchSize)
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Dummy method. batchSize: %d unused ", batchSize);
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : queueBatchBuf
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: This is a dummy implementation for the base class
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success always
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::queueBatchBuf()
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Dummy method. Unused ");
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setPerFrameMapUnmap
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Sets internal enable flag
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  @enable : Bool value for the enable flag
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success always
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::setPerFrameMapUnmap(bool enable)
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPerFrameMapUnmapEnable = enable;
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : flush
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush a channel
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::flush()
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : bufDone
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return a stream buf back to kernel
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @recvd_frame  : stream buf frame to be returned
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::bufDone(mm_camera_super_buf_t *recvd_frame)
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) {
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         if (recvd_frame->bufs[i] != NULL) {
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             for (uint32_t j = 0; j < m_numStreams; j++) {
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 if (mStreams[j] != NULL &&
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     mStreams[j]->getMyHandle() == recvd_frame->bufs[i]->stream_id) {
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx);
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     break; // break loop j
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 }
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             }
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         }
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3Channel::setBundleInfo(const cam_bundle_config_t &bundleInfo)
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_parm_buffer_t param;
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.type = CAM_STREAM_PARAM_TYPE_SET_BUNDLE_INFO;
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    param.bundleInfo = bundleInfo;
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mStreams[0]->setParameter(param);
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != NO_ERROR) {
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("stream setParameter for set bundle failed");
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamTypeMask
38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Get bit mask of all stream types in this channel
38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None
38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : Bit mask of all stream types in this channel
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera3Channel::getStreamTypeMask()
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t mask = 0;
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       mask |= (1U << mStreams[i]->getMyType());
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return mask;
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamID
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Get StreamID of requested stream type
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : streamMask
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : Stream ID
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera3Channel::getStreamID(uint32_t streamMask)
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t streamID = 0;
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (streamMask == (uint32_t )(0x1 << mStreams[i]->getMyType())) {
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamID = mStreams[i]->getMyServerID();
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return streamID;
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamByHandle
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by stream handle
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamHandle : stream handle
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : stream object. NULL if not found
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3Stream *QCamera3Channel::getStreamByHandle(uint32_t streamHandle)
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mStreams[i] != NULL && mStreams[i]->getMyHandle() == streamHandle) {
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return mStreams[i];
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NULL;
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamByIndex
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by index
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamHandle : stream handle
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : stream object. NULL if not found
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3Stream *QCamera3Channel::getStreamByIndex(uint32_t index)
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (index < m_numStreams) {
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return mStreams[index];
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NULL;
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : streamCbRoutine
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback routine for stream
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @streamHandle : stream handle
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : stream object. NULL if not found
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3Channel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                QCamera3Stream *stream, void *userdata)
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Channel *channel = (QCamera3Channel *)userdata;
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (channel == NULL) {
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("invalid channel pointer");
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    channel->streamCbRoutine(super_frame, stream);
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : dumpYUV
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to dump the YUV data from ISP/pproc
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frame   : frame to be dumped
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @dim     : dimension of the stream
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @offset  : offset of the data
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @name    : 1 if it is ISP output/pproc input, 2 if it is pproc output
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN  :
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3Channel::dumpYUV(mm_camera_buf_def_t *frame, cam_dimension_t dim,
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_frame_len_offset_t offset, uint8_t dump_type)
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char buf[FILENAME_MAX];
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(buf, 0, sizeof(buf));
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    static int counter = 0;
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char prop[PROPERTY_VALUE_MAX];
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("persist.camera.dumpimg", prop, "0");
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mYUVDump = (uint8_t) atoi(prop);
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mYUVDump & dump_type) {
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        frm_num = ((mYUVDump & 0xffff0000) >> 16);
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (frm_num == 0) {
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            frm_num = 10;
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (frm_num > 256) {
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            frm_num = 256;
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        skip_mode = ((mYUVDump & 0x0000ff00) >> 8);
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (skip_mode == 0) {
51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            skip_mode = 1;
51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mDumpSkipCnt == 0) {
51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mDumpSkipCnt = 1;
51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mDumpSkipCnt % skip_mode == 0) {
51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (dumpFrmCnt <= frm_num) {
51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                /* Note that the image dimension will be the unrotated stream dimension.
52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                * If you feel that the image would have been rotated during reprocess
52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                * then swap the dimensions while opening the file
52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                * */
52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                switch (dump_type) {
52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    case QCAMERA_DUMP_FRM_PREVIEW:
52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"p_%d_%d_%dx%d.yuv",
52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            counter, frame->frame_idx, dim.width, dim.height);
52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break;
52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    case QCAMERA_DUMP_FRM_VIDEO:
52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"v_%d_%d_%dx%d.yuv",
53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            counter, frame->frame_idx, dim.width, dim.height);
53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break;
53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    case QCAMERA_DUMP_FRM_SNAPSHOT:
53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"s_%d_%d_%dx%d.yuv",
53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            counter, frame->frame_idx, dim.width, dim.height);
53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break;
53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    case QCAMERA_DUMP_FRM_INPUT_REPROCESS:
53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"ir_%d_%d_%dx%d.yuv",
53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            counter, frame->frame_idx, dim.width, dim.height);
53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break;
54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    case QCAMERA_DUMP_FRM_CALLBACK:
54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"c_%d_%d_%dx%d.yuv",
54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            counter, frame->frame_idx, dim.width, dim.height);
54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break;
54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    default :
54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        LOGE("dumping not enabled for stream type %d",dump_type);
54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    break;
54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                counter++;
54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                int file_fd = open(buf, O_RDWR | O_CREAT, 0777);
55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ssize_t written_len = 0;
55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (file_fd >= 0) {
55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    void *data = NULL;
55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    for (uint32_t i = 0; i < offset.num_planes; i++) {
55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        uint32_t index = offset.mp[i].offset;
55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        if (i > 0) {
55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            index += offset.mp[i-1].len;
55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        }
55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        for (int j = 0; j < offset.mp[i].height; j++) {
56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            data = (void *)((uint8_t *)frame->buffer + index);
56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            written_len += write(file_fd, data,
56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    (size_t)offset.mp[i].width);
56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            index += (uint32_t)offset.mp[i].stride;
56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        }
56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    }
56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGH("written number of bytes %ld\n", written_len);
56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    dumpFrmCnt++;
56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    close(file_fd);
56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("failed to open file to dump image");
57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mDumpSkipCnt++;
57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : isUBWCEnabled
58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to get UBWC hardware support.
58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None
58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : TRUE -- UBWC format supported
58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              FALSE -- UBWC is not supported.
58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera3Channel::isUBWCEnabled()
59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#ifdef UBWC_PRESENT
59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char value[PROPERTY_VALUE_MAX];
59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int prop_value = 0;
59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(value, 0, sizeof(value));
59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("debug.gralloc.gfx_ubwc_disable", value, "0");
59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    prop_value = atoi(value);
59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (prop_value) {
59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return FALSE;
59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Disable UBWC if Eztune is enabled
60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //EzTune process CPP output frame and cannot understand UBWC.
60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(value, 0, sizeof(value));
60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("persist.camera.eztune.enable", value, "0");
60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    prop_value = atoi(value);
60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (prop_value) {
60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return FALSE;
60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return TRUE;
61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#else
61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return FALSE;
61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamDefaultFormat
61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return default buffer format for the stream
61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : type : Stream type
62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ** RETURN    : format for stream type
62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjincam_format_t QCamera3Channel::getStreamDefaultFormat(cam_stream_type_t type)
62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_format_t streamFormat;
62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    switch (type) {
63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    case CAM_STREAM_TYPE_PREVIEW:
63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (isUBWCEnabled()) {
63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            char prop[PROPERTY_VALUE_MAX];
63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int pFormat;
63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(prop, 0, sizeof(prop));
63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            property_get("persist.camera.preview.ubwc", prop, "1");
63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pFormat = atoi(prop);
63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pFormat == 1) {
63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = CAM_FORMAT_YUV_420_NV12_UBWC;
63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = CAM_FORMAT_YUV_420_NV12_VENUS;
64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamFormat = CAM_FORMAT_YUV_420_NV12_VENUS;
64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    case CAM_STREAM_TYPE_VIDEO:
64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (isUBWCEnabled()) {
64866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            char prop[PROPERTY_VALUE_MAX];
64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int pFormat;
65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(prop, 0, sizeof(prop));
65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            property_get("persist.camera.video.ubwc", prop, "1");
65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pFormat = atoi(prop);
65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (pFormat == 1) {
65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = CAM_FORMAT_YUV_420_NV12_UBWC;
65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = CAM_FORMAT_YUV_420_NV12_VENUS;
65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#if VENUS_PRESENT
66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        streamFormat = CAM_FORMAT_YUV_420_NV12_VENUS;
66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#else
66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        streamFormat = CAM_FORMAT_YUV_420_NV12;
66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#endif
66466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    case CAM_STREAM_TYPE_SNAPSHOT:
66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        streamFormat = CAM_FORMAT_YUV_420_NV21;
66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    case CAM_STREAM_TYPE_CALLBACK:
67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        streamFormat = CAM_FORMAT_YUV_420_NV21;
67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    case CAM_STREAM_TYPE_RAW:
67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        streamFormat = CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG;
67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    default:
67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        streamFormat = CAM_FORMAT_YUV_420_NV21;
67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        break;
67866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return streamFormat;
68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* QCamera3ProcessingChannel methods */
68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3ProcessingChannel
68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCamera3ProcessingChannel
68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cb_routine : callback routine to frame aggregator
69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @paddingInfo: stream padding info
69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @userData   : HWI handle
69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream     : camera3_stream_t structure
69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream_type: Channel stream type
69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @postprocess_mask: the postprocess mask for streams of this channel
69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @metadataChannel: handle to the metadataChannel
70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @numBuffers : number of max dequeued buffers
70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
70366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3ProcessingChannel::QCamera3ProcessingChannel(uint32_t cam_handle,
70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t channel_handle,
70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_camera_ops_t *cam_ops,
70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        channel_cb_routine cb_routine,
70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_padding_info_t *paddingInfo,
70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *userData,
70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_t *stream,
71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_stream_type_t stream_type,
71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t postprocess_mask,
71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Channel *metadataChannel,
71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t numBuffers) :
71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera3Channel(cam_handle, channel_handle, cam_ops, cb_routine,
71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    paddingInfo, postprocess_mask, userData, numBuffers),
71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_postprocessor(this),
71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mFrameCount(0),
71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mLastFrameCount(0),
71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mLastFpsTime(0),
72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mMemory(numBuffers),
72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mCamera3Stream(stream),
72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mNumBufs(CAM_MAX_NUM_BUFS_PER_STREAM),
72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreamType(stream_type),
72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mPostProcStarted(false),
72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mInputBufferConfig(false),
72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_pMetaChannel(metadataChannel),
72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mMetaFrame(NULL),
72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mOfflineMemory(0),
72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mOfflineMetaMemory(numBuffers + (MAX_REPROCESS_PIPELINE_STAGES - 1),
73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    false)
73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char prop[PROPERTY_VALUE_MAX];
73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("persist.debug.sf.showfps", prop, "0");
73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mDebugFPS = (uint8_t) atoi(prop);
73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_postprocessor.init(&mMemory, mPostProcMask);
73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Init Postprocessor failed");
73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCamera3ProcessingChannel
74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCamera3ProcessingChannel
74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
75166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3ProcessingChannel::~QCamera3ProcessingChannel()
75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    destroy();
75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_postprocessor.deinit();
75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("De-init Postprocessor failed");
75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 < mOfflineMetaMemory.getCnt()) {
76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineMetaMemory.deallocate();
76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 < mOfflineMemory.getCnt()) {
76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineMemory.unregisterBuffers();
76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : streamCbRoutine
77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:
77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : the super frame with filled buffer
77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream      : stream on which the buffer was requested and filled
77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ProcessingChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *stream)
78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     ATRACE_CALL();
78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //FIXME Q Buf back in case of error?
78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t frameIndex;
78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buffer_handle_t *resultBuffer;
78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t resultFrameNumber;
78866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_stream_buffer_t result;
78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t dim;
79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_frame_len_offset_t offset;
79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&dim, 0, sizeof(dim));
79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&offset, 0, sizeof(cam_frame_len_offset_t));
79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (checkStreamCbErrors(super_frame, stream) != NO_ERROR) {
79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error with the stream callback");
79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(frameIndex >= mNumBufs) {
80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Error, Invalid index for buffer");
80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         stream->bufDone(frameIndex);
80366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return;
80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mDebugFPS) {
80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        showDebugFPS(stream->getMyType());
80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->getFrameDimension(dim);
81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->getFrameOffset(offset);
81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (stream->getMyType() == CAM_STREAM_TYPE_PREVIEW) {
81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dumpYUV(super_frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_PREVIEW);
81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (stream->getMyType() == CAM_STREAM_TYPE_VIDEO) {
81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dumpYUV(super_frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_VIDEO);
81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (stream->getMyType() == CAM_STREAM_TYPE_CALLBACK) {
81666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dumpYUV(super_frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_CALLBACK);
81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ////Use below data to issue framework callback
81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    resultBuffer = (buffer_handle_t *)mMemory.getBufferHandle(frameIndex);
82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    resultFrameNumber = mMemory.getFrameNumber(frameIndex);
82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.stream = mCamera3Stream;
82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.buffer = resultBuffer;
82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (IS_BUFFER_ERROR(super_frame->bufs[0]->flags)) {
82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        result.status = CAMERA3_BUFFER_STATUS_ERROR;
82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGW("CAMERA3_BUFFER_STATUS_ERROR for stream_type: %d",
82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mStreams[0]->getMyType());
82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        result.status = CAMERA3_BUFFER_STATUS_OK;
83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.acquire_fence = -1;
83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.release_fence = -1;
83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(mPerFrameMapUnmapEnable) {
83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t rc = stream->bufRelease(frameIndex);
83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error %d releasing stream buffer %d",
83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc, frameIndex);
83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mMemory.unregisterBuffer(frameIndex);
84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error %d unregistering stream buffer %d",
84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc, frameIndex);
84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 <= resultFrameNumber) {
84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mChannelCB) {
84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mChannelCB(NULL, &result, (uint32_t)resultFrameNumber, false, mUserData);
85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Bad frame number");
85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(super_frame);
85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : putStreamBufs
86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release the buffers allocated to the stream
86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : NONE
86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NONE
86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3YUVChannel::putStreamBufs()
86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3ProcessingChannel::putStreamBufs();
87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Free allocated heap buffer.
87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory.deallocate();
87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Clear free heap buffer list.
87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFreeHeapBufferList.clear();
87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Clear offlinePpInfoList
87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mOfflinePpInfoList.clear();
87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : request
88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: handle the request - either with an input buffer or a direct
88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              output request
88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buffer          : pointer to the output buffer
88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frameNumber     : frame number of the request
88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pInputBuffer    : pointer to input buffer if an input request
88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @metadata        : parameters associated with the request
89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0 on a success start of capture
89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -EINVAL on invalid input
89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -ENODEV on serious error
89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::request(buffer_handle_t *buffer,
89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frameNumber,
89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t* pInputBuffer,
89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        metadata_buffer_t* metadata)
89966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int index;
90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == buffer || NULL == metadata) {
90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid buffer/metadata in channel request");
90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (pInputBuffer) {
90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //need to send to reprocessing
91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("Got a request with input buffer, output streamType = %d", mStreamType);
91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reprocess_config_t reproc_cfg;
91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_dimension_t dim;
91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&reproc_cfg, 0, sizeof(reprocess_config_t));
91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&dim, 0, sizeof(dim));
91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        setReprocConfig(reproc_cfg, pInputBuffer, metadata, mStreamFormat, dim);
91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        startPostProc(reproc_cfg);
91766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        qcamera_fwk_input_pp_data_t *src_frame = NULL;
91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        src_frame = (qcamera_fwk_input_pp_data_t *)calloc(1,
92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                sizeof(qcamera_fwk_input_pp_data_t));
92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (src_frame == NULL) {
92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("No memory for src frame");
92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return NO_MEMORY;
92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = setFwkInputPPData(src_frame, pInputBuffer, &reproc_cfg, metadata, buffer, frameNumber);
92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error %d while setting framework input PP data", rc);
92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            free(src_frame);
92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGH("Post-process started");
93266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_postprocessor.processData(src_frame);
93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //need to fill output buffer with new data and return
93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(!m_bIsActive) {
93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = registerBuffer(buffer, mIsType);
93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc) {
93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("On-the-fly buffer registration failed %d",
93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         rc);
94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = start();
94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc)
94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGD("Request on an existing stream");
94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        index = mMemory.getMatchBufIndex((void*)buffer);
95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(index < 0) {
95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = registerBuffer(buffer, mIsType);
95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc) {
95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("On-the-fly buffer registration failed %d",
95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         rc);
95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            index = mMemory.getMatchBufIndex((void*)buffer);
96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (index < 0) {
96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Could not find object among registered buffers");
96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return DEAD_OBJECT;
96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mStreams[0]->bufDone(index);
96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(rc != NO_ERROR) {
96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Failed to Q new buffer to stream");
96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mMemory.markFrameNumber(index, frameNumber);
97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : initialize
97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:
97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : isType : type of image stabilization on the buffer
98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
9861687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajanint32_t QCamera3ProcessingChannel::initialize(__unused cam_is_type_t isType)
98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mOfflineMetaMemory.allocateAll(sizeof(metadata_buffer_t));
99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == NO_ERROR) {
99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFreeOfflineMetaBuffersList.clear();
99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (uint32_t i = 0; i < mNumBuffers + (MAX_REPROCESS_PIPELINE_STAGES - 1);
99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                i++) {
99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mFreeOfflineMetaBuffersList.push_back(i);
99666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Could not allocate offline meta buffers for input reprocess");
99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : registerBuffer
100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: register streaming buffer to the channel object
100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buffer     : buffer to be registered
101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @isType     : image stabilization type on the stream
101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::registerBuffer(buffer_handle_t *buffer,
101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_is_type_t isType)
101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = 0;
102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = isType;
102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_type_t streamType;
102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((uint32_t)mMemory.getCnt() > (mNumBufs - 1)) {
102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Trying to register more buffers than initially requested");
102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 == m_numStreams) {
103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = initialize(mIsType);
103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Couldn't initialize camera stream %d", rc);
103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamType = mStreams[0]->getMyType();
103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mMemory.registerBuffer(buffer, streamType);
103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ALREADY_EXISTS == rc) {
104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_ERROR;
104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (NO_ERROR != rc) {
104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Buffer %p couldn't be registered %d", buffer, rc);
104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setFwkInputPPData
105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: fill out the framework src frame information for reprocessing
105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @src_frame         : input pp data to be filled out
105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pInputBuffer      : input buffer for reprocessing
105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @reproc_cfg        : pointer to the reprocess config
105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @metadata          : pointer to the metadata buffer
105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @output_buffer     : output buffer for reprocessing; could be NULL if not
106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *                        framework allocated
106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frameNumber       : frame number of the request
106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::setFwkInputPPData(qcamera_fwk_input_pp_data_t *src_frame,
106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t *pInputBuffer, reprocess_config_t *reproc_cfg,
106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        metadata_buffer_t *metadata, buffer_handle_t *output_buffer,
107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frameNumber)
107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int input_index = mOfflineMemory.getMatchBufIndex((void*)pInputBuffer->buffer);
107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(input_index < 0) {
107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mOfflineMemory.registerBuffer(pInputBuffer->buffer, mStreamType);
107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("On-the-fly input buffer registration failed %d",
107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc);
107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        input_index = mOfflineMemory.getMatchBufIndex((void*)pInputBuffer->buffer);
108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (input_index < 0) {
108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Could not find object among registered buffers");
108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return DEAD_OBJECT;
108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mOfflineMemory.markFrameNumber(input_index, frameNumber);
108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    src_frame->src_frame = *pInputBuffer;
109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mOfflineMemory.getBufDef(reproc_cfg->input_stream_plane_info.plane_info,
109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            src_frame->input_buffer, input_index);
109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dumpYUV(&src_frame->input_buffer, reproc_cfg->input_stream_dim,
109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            reproc_cfg->input_stream_plane_info.plane_info, QCAMERA_DUMP_FRM_INPUT_REPROCESS);
109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t dim = {sizeof(metadata_buffer_t), 1};
109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_buf_plane_info_t meta_planes;
109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_stream_calc_offset_metadata(&dim, &mPaddingInfo, &meta_planes);
110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Metadata stream plane info calculation failed!");
110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t metaBufIdx;
110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    {
110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mFreeOfflineMetaBuffersList.empty()) {
110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("mFreeOfflineMetaBuffersList is null. Fatal");
110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return BAD_VALUE;
111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        metaBufIdx = *(mFreeOfflineMetaBuffersList.begin());
111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFreeOfflineMetaBuffersList.erase(mFreeOfflineMetaBuffersList.begin());
111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("erasing %d, mFreeOfflineMetaBuffersList.size %d", metaBufIdx,
111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mFreeOfflineMetaBuffersList.size());
111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mOfflineMetaMemory.markFrameNumber(metaBufIdx, frameNumber);
111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_buf_def_t meta_buf;
112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_frame_len_offset_t offset = meta_planes.plane_info;
112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mOfflineMetaMemory.getBufDef(offset, meta_buf, metaBufIdx);
112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR != rc) {
112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memcpy(meta_buf.buffer, metadata, sizeof(metadata_buffer_t));
112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    src_frame->metadata_buffer = meta_buf;
112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    src_frame->reproc_config = *reproc_cfg;
112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    src_frame->output_buffer = output_buffer;
113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    src_frame->frameNumber = frameNumber;
113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : checkStreamCbErrors
113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: check the stream callback for errors
113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @super_frame : the super frame with filled buffer
114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream      : stream on which the buffer was requested and filled
114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::checkStreamCbErrors(mm_camera_super_buf_t *super_frame,
114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *stream)
114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == stream) {
115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid stream");
115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(NULL == super_frame) {
115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Invalid Super buffer");
115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return BAD_VALUE;
115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(super_frame->num_bufs != 1) {
116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Multiple streams are not supported");
116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return BAD_VALUE;
116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(NULL == super_frame->bufs[0]) {
116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Error, Super buffer frame does not contain valid buffer");
116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return BAD_VALUE;
116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamSize
117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the size from the camera3_stream_t for the channel
117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @dim     : Return the size of the stream
117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::getStreamSize(cam_dimension_t &dim)
118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mCamera3Stream) {
118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dim.width = mCamera3Stream->width;
118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dim.height = mCamera3Stream->height;
118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_ERROR;
118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamBufs
119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the buffers allocated to the stream
119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @len       : buffer length
120166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
120666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3StreamMem* QCamera3ProcessingChannel::getStreamBufs(uint32_t /*len*/)
120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    KPI_ATRACE_CALL();
120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return &mMemory;
121066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : putStreamBufs
121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release the buffers allocated to the stream
121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : NONE
121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NONE
122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ProcessingChannel::putStreamBufs()
122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory.unregisterBuffers();
122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Reclaim all the offline metabuffers and push them to free list */
122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    {
122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFreeOfflineMetaBuffersList.clear();
122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (uint32_t i = 0; i < mOfflineMetaMemory.getCnt(); i++) {
123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mFreeOfflineMetaBuffersList.push_back(i);
123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : stop
123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop processing channel, which will stop all streams within,
124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              including the reprocessing channel in postprocessor.
124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::stop()
124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(!m_bIsActive) {
125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Attempt to stop inactive channel");
125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_postprocessor.stop();
125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mPostProcStarted = false;
125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc |= QCamera3Channel::stop();
125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : startPostProc
126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: figure out if the postprocessor needs to be restarted and if yes
126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              start it
126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @inputBufExists : whether there is an input buffer for post processing
127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @config         : reprocessing configuration
127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @metadata       : metadata associated with the reprocessing request
127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NONE
127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ProcessingChannel::startPostProc(const reprocess_config_t &config)
127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(!mPostProcStarted) {
127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_postprocessor.start(config);
127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mPostProcStarted = true;
128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
128366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : queueReprocMetadata
128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: queue the reprocess metadata to the postprocessor
128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : metadata : the metadata corresponding to the pp frame
128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::queueReprocMetadata(mm_camera_super_buf_t *metadata)
129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return m_postprocessor.processPPMetadata(metadata);
129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : metadataBufDone
130166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Buffer done method for a metadata buffer
130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : received metadata frame
130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::metadataBufDone(mm_camera_super_buf_t *recvd_frame)
131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;;
131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((NULL == m_pMetaChannel) || (NULL == recvd_frame)) {
131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Metadata channel or metadata buffer invalid");
131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = ((QCamera3MetadataChannel*)m_pMetaChannel)->bufDone(recvd_frame);
132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : translateStreamTypeAndFormat
132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: translates the framework stream format into HAL stream type
132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              and format
132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamType   : translated stream type
133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamFormat : translated stream format
133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream       : fwk stream
133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::translateStreamTypeAndFormat(camera3_stream_t *stream,
134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_stream_type_t &streamType, cam_format_t &streamFormat)
134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    switch (stream->format) {
134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case HAL_PIXEL_FORMAT_YCbCr_420_888:
134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if(stream->stream_type == CAMERA3_STREAM_INPUT){
134566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamType = CAM_STREAM_TYPE_SNAPSHOT;
134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_SNAPSHOT);
134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamType = CAM_STREAM_TYPE_CALLBACK;
134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_CALLBACK);
135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (stream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamType = CAM_STREAM_TYPE_VIDEO;
135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_VIDEO);
135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else if(stream->stream_type == CAMERA3_STREAM_INPUT ||
135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ||
135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    IS_USAGE_ZSL(stream->usage)){
135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamType = CAM_STREAM_TYPE_SNAPSHOT;
136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_SNAPSHOT);
136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamType = CAM_STREAM_TYPE_PREVIEW;
136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_PREVIEW);
136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case HAL_PIXEL_FORMAT_RAW_OPAQUE:
136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case HAL_PIXEL_FORMAT_RAW16:
136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case HAL_PIXEL_FORMAT_RAW10:
136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamType = CAM_STREAM_TYPE_RAW;
137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamFormat = CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG;
137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        default:
137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return -EINVAL;
137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("fwk_format = %d, streamType = %d, streamFormat = %d",
137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            stream->format, streamType, streamFormat);
137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setReprocConfig
138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: sets the reprocessing parameters for the input buffer
138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @reproc_cfg : the configuration to be set
138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pInputBuffer : pointer to the input buffer
138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @metadata : pointer to the reprocessing metadata buffer
138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamFormat : format of the input stream
139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::setReprocConfig(reprocess_config_t &reproc_cfg,
139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t *pInputBuffer,
13971687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan        __unused metadata_buffer_t *metadata,
139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_format_t streamFormat, cam_dimension_t dim)
139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reproc_cfg.padding = &mPaddingInfo;
140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //to ensure a big enough buffer size set the height and width
140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //padding to max(height padding, width padding)
140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (reproc_cfg.padding->height_padding > reproc_cfg.padding->width_padding) {
140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       reproc_cfg.padding->width_padding = reproc_cfg.padding->height_padding;
140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       reproc_cfg.padding->height_padding = reproc_cfg.padding->width_padding;
140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL != pInputBuffer) {
141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reproc_cfg.input_stream_dim.width = (int32_t)pInputBuffer->stream->width;
141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reproc_cfg.input_stream_dim.height = (int32_t)pInputBuffer->stream->height;
141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reproc_cfg.input_stream_dim.width = (int32_t)dim.width;
141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reproc_cfg.input_stream_dim.height = (int32_t)dim.height;
141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reproc_cfg.src_channel = this;
141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reproc_cfg.output_stream_dim.width = mCamera3Stream->width;
141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reproc_cfg.output_stream_dim.height = mCamera3Stream->height;
141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reproc_cfg.reprocess_type = getReprocessType();
142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
142166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //offset calculation
142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL != pInputBuffer) {
142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = translateStreamTypeAndFormat(pInputBuffer->stream,
142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                reproc_cfg.stream_type, reproc_cfg.stream_format);
142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Stream format %d is not supported",
142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    pInputBuffer->stream->format);
142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reproc_cfg.stream_type = mStreamType;
143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reproc_cfg.stream_format = streamFormat;
143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    switch (reproc_cfg.stream_type) {
143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case CAM_STREAM_TYPE_PREVIEW:
143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (getStreamByIndex(0) == NULL) {
143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Could not find stream");
143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc = -1;
144066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mm_stream_calc_offset_preview(
144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    getStreamByIndex(0)->getStreamInfo(),
144466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    &reproc_cfg.input_stream_dim,
144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    reproc_cfg.padding,
144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    &reproc_cfg.input_stream_plane_info);
144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case CAM_STREAM_TYPE_VIDEO:
144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mm_stream_calc_offset_video(reproc_cfg.stream_format,
145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    &reproc_cfg.input_stream_dim,
145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    &reproc_cfg.input_stream_plane_info);
145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case CAM_STREAM_TYPE_RAW:
145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mm_stream_calc_offset_raw(reproc_cfg.stream_format,
145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    &reproc_cfg.input_stream_dim,
145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    reproc_cfg.padding, &reproc_cfg.input_stream_plane_info);
145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case CAM_STREAM_TYPE_SNAPSHOT:
145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case CAM_STREAM_TYPE_CALLBACK:
146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        default:
146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mm_stream_calc_offset_snapshot(streamFormat, &reproc_cfg.input_stream_dim,
146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    reproc_cfg.padding, &reproc_cfg.input_stream_plane_info);
146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Stream %d plane info calculation failed!", mStreamType);
146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : reprocessCbRoutine
147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback function for the reprocessed frame. This frame now
147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              should be returned to the framework
147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultBuffer      : buffer containing the reprocessed data
148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultFrameNumber : frame number on which the buffer was requested
148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NONE
148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ProcessingChannel::reprocessCbRoutine(buffer_handle_t *resultBuffer,
148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t resultFrameNumber)
148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = releaseOfflineMemory(resultFrameNumber);
149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR != rc) {
149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error releasing offline memory %d", rc);
149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Since reprocessing is done, send the callback to release the input buffer */
149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mChannelCB) {
149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mChannelCB(NULL, NULL, resultFrameNumber, true, mUserData);
149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    issueChannelCb(resultBuffer, resultFrameNumber);
150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : issueChannelCb
150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to set the result and issue channel callback
150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultBuffer      : buffer containing the data
151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultFrameNumber : frame number on which the buffer was requested
151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NONE
151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
151566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
151666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ProcessingChannel::issueChannelCb(buffer_handle_t *resultBuffer,
151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t resultFrameNumber)
151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_stream_buffer_t result;
152166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Use below data to issue framework callback
152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.stream = mCamera3Stream;
152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.buffer = resultBuffer;
152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.status = CAMERA3_BUFFER_STATUS_OK;
152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.acquire_fence = -1;
152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    result.release_fence = -1;
152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mChannelCB) {
152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mChannelCB(NULL, &result, resultFrameNumber, false, mUserData);
153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : showDebugFPS
153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to log the fps for preview, video, callback and raw
153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              streams
153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : Stream type
154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN  : None
154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ProcessingChannel::showDebugFPS(int32_t streamType)
154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    double fps = 0;
154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFrameCount++;
154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    nsecs_t now = systemTime();
154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    nsecs_t diff = now - mLastFpsTime;
154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (diff > ms2ns(250)) {
155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        fps = (((double)(mFrameCount - mLastFrameCount)) *
155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                (double)(s2ns(1))) / (double)diff;
155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        switch(streamType) {
155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAM_STREAM_TYPE_PREVIEW:
155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGH("PROFILE_PREVIEW_FRAMES_PER_SECOND : %.4f",
155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         fps);
155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAM_STREAM_TYPE_VIDEO:
155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGH("PROFILE_VIDEO_FRAMES_PER_SECOND : %.4f",
155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         fps);
156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAM_STREAM_TYPE_CALLBACK:
156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGH("PROFILE_CALLBACK_FRAMES_PER_SECOND : %.4f",
156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         fps);
156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAM_STREAM_TYPE_RAW:
156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGH("PROFILE_RAW_FRAMES_PER_SECOND : %.4f",
156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         fps);
156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            default:
157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGH("logging not supported for the stream");
157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mLastFpsTime = now;
157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mLastFrameCount = mFrameCount;
157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : releaseOfflineMemory
158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: function to clean up the offline memory used for input reprocess
158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultFrameNumber : frame number on which the buffer was requested
158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
158866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              non-zero failure code
158966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
159066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
159166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
159266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ProcessingChannel::releaseOfflineMemory(uint32_t resultFrameNumber)
159366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
159466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
159566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t inputBufIndex =
159666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mOfflineMemory.getGrallocBufferIndex(resultFrameNumber);
159766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 <= inputBufIndex) {
159866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mOfflineMemory.unregisterBuffer(inputBufIndex);
159966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
160066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGW("Could not find offline input buffer, resultFrameNumber %d",
160166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 resultFrameNumber);
160266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
160366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != NO_ERROR) {
160466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Failed to unregister offline input buffer");
160566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
160666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
160766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t metaBufIndex =
160866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mOfflineMetaMemory.getHeapBufferIndex(resultFrameNumber);
160966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 <= metaBufIndex) {
161066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
161166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFreeOfflineMetaBuffersList.push_back((uint32_t)metaBufIndex);
161266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
161366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGW("Could not find offline meta buffer, resultFrameNumber %d",
161466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                resultFrameNumber);
161566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
161666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
161766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
161866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
161966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
162066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Regular Channel methods */
162166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
162266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3RegularChannel
162366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
162466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCamera3RegularChannel
162566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
162666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
162766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
162866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
162966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cb_routine : callback routine to frame aggregator
163066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream     : camera3_stream_t structure
163166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream_type: Channel stream type
163266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @postprocess_mask: feature mask for postprocessing
163366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @metadataChannel : metadata channel for the session
163466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @numBuffers : number of max dequeued buffers
163566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
163666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
163766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
163866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3RegularChannel::QCamera3RegularChannel(uint32_t cam_handle,
163966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t channel_handle,
164066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_camera_ops_t *cam_ops,
164166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        channel_cb_routine cb_routine,
164266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_padding_info_t *paddingInfo,
164366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *userData,
164466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_t *stream,
164566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_stream_type_t stream_type,
164666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t postprocess_mask,
164766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Channel *metadataChannel,
164866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t numBuffers) :
164966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera3ProcessingChannel(cam_handle, channel_handle, cam_ops,
165066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cb_routine, paddingInfo, userData, stream, stream_type,
165166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    postprocess_mask, metadataChannel, numBuffers),
165266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mBatchSize(0),
165366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mRotation(ROTATE_0)
165466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
165566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
165666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
165766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
165866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCamera3RegularChannel
165966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
166066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCamera3RegularChannel
166166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
166266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
166366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
166466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
166566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
166666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3RegularChannel::~QCamera3RegularChannel()
166766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
166866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    destroy();
166966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
167066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
167166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
167266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : initialize
167366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
167466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Initialize and add camera channel & stream
167566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
167666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
167766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @isType : type of image stabilization required on this stream
167866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
167966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
168066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
168166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
168266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
168366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
168466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3RegularChannel::initialize(cam_is_type_t isType)
168566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
168666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
168766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
168866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
168966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t streamDim;
169066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
169166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == mCamera3Stream) {
169266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Camera stream uninitialized");
169366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
169466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
169566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
169666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (1 <= m_numStreams) {
169766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Only one stream per channel supported in v3 Hal
169866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_ERROR;
169966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
170066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
170166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType  = isType;
170266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
170366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = translateStreamTypeAndFormat(mCamera3Stream, mStreamType,
170466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreamFormat);
170566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != NO_ERROR) {
170666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -EINVAL;
170766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
170866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
170966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
171066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((mStreamType == CAM_STREAM_TYPE_VIDEO) ||
171166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (mStreamType == CAM_STREAM_TYPE_PREVIEW)) {
171266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((mCamera3Stream->rotation != CAMERA3_STREAM_ROTATION_0) &&
171366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ((mPostProcMask & CAM_QCOM_FEATURE_ROTATION) == 0)) {
171466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("attempting rotation %d when rotation is disabled",
171566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mCamera3Stream->rotation);
171666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return -EINVAL;
171766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
171866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
171966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        switch (mCamera3Stream->rotation) {
172066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAMERA3_STREAM_ROTATION_0:
172166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mRotation = ROTATE_0;
172266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
172366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAMERA3_STREAM_ROTATION_90: {
172466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mRotation = ROTATE_90;
172566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
172666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
172766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAMERA3_STREAM_ROTATION_180:
172866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mRotation = ROTATE_180;
172966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
173066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            case CAMERA3_STREAM_ROTATION_270: {
173166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mRotation = ROTATE_270;
173266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
173366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
173466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            default:
173566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Unknown rotation: %d",
173666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         mCamera3Stream->rotation);
173766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return -EINVAL;
173866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
173966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (mCamera3Stream->rotation != CAMERA3_STREAM_ROTATION_0) {
174066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Rotation %d is not supported by stream type %d",
174166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mCamera3Stream->rotation,
174266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mStreamType);
174366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -EINVAL;
174466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
174566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
174666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.width = mCamera3Stream->width;
174766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.height = mCamera3Stream->height;
174866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
174966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("batch size is %d", mBatchSize);
175066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::addStream(mStreamType,
175166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreamFormat,
175266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamDim,
175366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mRotation,
175466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mNumBufs,
175566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mPostProcMask,
175666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mIsType,
175766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mBatchSize);
175866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
175966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
176066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
176166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
176266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
176366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setBatchSize
176466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
176566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Set batch size for the channel.
176666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
176766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
176866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @batchSize  : Number of image buffers in a batch
176966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
177066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
177166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success always
177266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
177366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
177466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3RegularChannel::setBatchSize(uint32_t batchSize)
177566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
177666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
177766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
177866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mBatchSize = batchSize;
177966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Batch size set: %d", mBatchSize);
178066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
178166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
178266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
178366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
178466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamTypeMask
178566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
178666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Get bit mask of all stream types in this channel.
178766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              If stream is not initialized, then generate mask based on
178866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              local streamType
178966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
179066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None
179166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
179266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : Bit mask of all stream types in this channel
179366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
179466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint32_t QCamera3RegularChannel::getStreamTypeMask()
179566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
179666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mStreams[0]) {
179766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return QCamera3Channel::getStreamTypeMask();
179866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
179966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return (1U << mStreamType);
180066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
180166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
180266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
180366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
180466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : queueBatchBuf
180566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
180666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: queue batch container to downstream
180766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
180866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
180966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
181066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
181166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success always
181266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
181366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
181466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3RegularChannel::queueBatchBuf()
181566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
181666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
181766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
181866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mStreams[0]) {
181966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mStreams[0]->queueBatchBuf();
182066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
182166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != NO_ERROR) {
182266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("stream->queueBatchContainer failed");
182366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
182466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
182566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
182666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
182766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
182866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : request
182966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
183066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process a request from camera service. Stream on if ncessary.
183166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
183266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
183366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buffer  : buffer to be filled for this request
183466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
183566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0 on a success start of capture
183666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -EINVAL on invalid input
183766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -ENODEV on serious error
183866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
183966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3RegularChannel::request(buffer_handle_t *buffer, uint32_t frameNumber)
184066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
184166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
184266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //FIX ME: Return buffer back in case of failures below.
184366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
184466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
184566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int index;
184666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
184766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == buffer) {
184866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid buffer in channel request");
184966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
185066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
185166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
185266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(!m_bIsActive) {
185366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = registerBuffer(buffer, mIsType);
185466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
185566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("On-the-fly buffer registration failed %d",
185666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc);
185766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
185866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
185966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
186066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = start();
186166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
186266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
186366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
186466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
186566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("Request on an existing stream");
186666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
186766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
186866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    index = mMemory.getMatchBufIndex((void*)buffer);
186966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(index < 0) {
187066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = registerBuffer(buffer, mIsType);
187166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
187266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("On-the-fly buffer registration failed %d",
187366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc);
187466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
187566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
187666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
187766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        index = mMemory.getMatchBufIndex((void*)buffer);
187866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (index < 0) {
187966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Could not find object among registered buffers");
188066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return DEAD_OBJECT;
188166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
188266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
188366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
188466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mStreams[0]->bufDone((uint32_t)index);
188566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(rc != NO_ERROR) {
188666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Failed to Q new buffer to stream");
188766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
188866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
188966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
189066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mMemory.markFrameNumber((uint32_t)index, frameNumber);
189166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
189266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
189366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
189466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
189566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getReprocessType
189666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
189766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the type of reprocess output supported by this channel
189866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
189966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : NONE
190066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
190166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : reprocess_type_t : type of reprocess
190266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
190366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinreprocess_type_t QCamera3RegularChannel::getReprocessType()
190466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
190566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return REPROCESS_TYPE_PRIVATE;
190666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
190766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
190866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
190966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3MetadataChannel::QCamera3MetadataChannel(uint32_t cam_handle,
191066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t channel_handle,
191166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mm_camera_ops_t *cam_ops,
191266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    channel_cb_routine cb_routine,
191366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_padding_info_t *paddingInfo,
191466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t postprocess_mask,
191566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    void *userData, uint32_t numBuffers) :
191666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3Channel(cam_handle, channel_handle, cam_ops,
191766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                cb_routine, paddingInfo, postprocess_mask,
191866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                userData, numBuffers),
191966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mMemory(NULL)
192066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
192166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
192266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
192366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3MetadataChannel::~QCamera3MetadataChannel()
192466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
192566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    destroy();
192666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
192766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mMemory) {
192866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory->deallocate();
192966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete mMemory;
193066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory = NULL;
193166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
193266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
193366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
193466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3MetadataChannel::initialize(cam_is_type_t isType)
193566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
193666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
193766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc;
193866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t streamDim;
193966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
194066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mMemory || m_numStreams > 0) {
194166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("metadata channel already initialized");
194266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -EINVAL;
194366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
194466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
194566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.width = (int32_t)sizeof(metadata_buffer_t),
194666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.height = 1;
194766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
194866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = isType;
194966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::addStream(CAM_STREAM_TYPE_METADATA, CAM_FORMAT_MAX,
195066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamDim, ROTATE_0, (uint8_t)mNumBuffers, mPostProcMask, mIsType);
195166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
195266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("addStream failed");
195366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
195466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
195566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
195666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
195766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3MetadataChannel::request(buffer_handle_t * /*buffer*/,
195866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                uint32_t /*frameNumber*/)
195966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
196066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!m_bIsActive) {
196166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return start();
196266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
196366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
196466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return 0;
196566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
196666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
196766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3MetadataChannel::streamCbRoutine(
196866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mm_camera_super_buf_t *super_frame,
196966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3Stream * /*stream*/)
197066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
197166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_NAME("metadata_stream_cb_routine");
197266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t requestNumber = 0;
197366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (super_frame == NULL || super_frame->num_bufs != 1) {
197466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("super_frame is not valid");
197566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
197666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
197766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mChannelCB) {
197866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mChannelCB(super_frame, NULL, requestNumber, false, mUserData);
197966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
198066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
198166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
198266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3StreamMem* QCamera3MetadataChannel::getStreamBufs(uint32_t len)
198366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
198466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc;
198566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (len < sizeof(metadata_buffer_t)) {
198666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Metadata buffer size less than structure %d vs %d",
198766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                len,
198866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                sizeof(metadata_buffer_t));
198966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
199066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
199166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory = new QCamera3StreamMem(MIN_STREAMING_BUFFER_NUM);
199266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mMemory) {
199366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("unable to create metadata memory");
199466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
199566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
199666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mMemory->allocateAll(len);
199766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
199866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("unable to allocate metadata memory");
199966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete mMemory;
200066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory = NULL;
200166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
200266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
200366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    clear_metadata_buffer((metadata_buffer_t*)mMemory->getPtr(0));
200466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return mMemory;
200566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
200666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
200766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3MetadataChannel::putStreamBufs()
200866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
200966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory->deallocate();
201066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    delete mMemory;
201166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory = NULL;
201266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
201366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*************************************************************************************/
201466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// RAW Channel related functions
201566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3RawChannel::QCamera3RawChannel(uint32_t cam_handle,
201666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t channel_handle,
201766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mm_camera_ops_t *cam_ops,
201866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    channel_cb_routine cb_routine,
201966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_padding_info_t *paddingInfo,
202066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    void *userData,
202166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    camera3_stream_t *stream,
202266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t postprocess_mask,
202366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    QCamera3Channel *metadataChannel,
202466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    bool raw_16, uint32_t numBuffers) :
202566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3RegularChannel(cam_handle, channel_handle, cam_ops,
202666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                cb_routine, paddingInfo, userData, stream,
202766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                CAM_STREAM_TYPE_RAW, postprocess_mask,
202866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                metadataChannel, numBuffers),
202966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mIsRaw16(raw_16)
203066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
203166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char prop[PROPERTY_VALUE_MAX];
203266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("persist.camera.raw.debug.dump", prop, "0");
203366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mRawDump = atoi(prop);
203466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
203566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
203666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3RawChannel::~QCamera3RawChannel()
203766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
203866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
203966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
204066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
204166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : initialize
204266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
204366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Initialize and add camera channel & stream
204466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
204566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
204666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @isType    : image stabilization type on the stream
204766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
204866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
204966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
205066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
205166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
205266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
205366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3RawChannel::initialize(cam_is_type_t isType)
205466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
205566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return QCamera3RegularChannel::initialize(isType);
205666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
205766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
205866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3RawChannel::streamCbRoutine(
205966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mm_camera_super_buf_t *super_frame,
206066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3Stream * stream)
206166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
206266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
206366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* Move this back down once verified */
206466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mRawDump)
206566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dumpRawSnapshot(super_frame->bufs[0]);
206666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
206766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mIsRaw16) {
206866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (getStreamDefaultFormat(CAM_STREAM_TYPE_RAW) ==
206966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG)
207066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            convertMipiToRaw16(super_frame->bufs[0]);
207166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        else
207266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            convertLegacyToRaw16(super_frame->bufs[0]);
207366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
207466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
207566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Make sure cache coherence because extra processing is done
207666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory.cleanInvalidateCache(super_frame->bufs[0]->buf_idx);
207766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
207866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3RegularChannel::streamCbRoutine(super_frame, stream);
207966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
208066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
208166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
208266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3RawChannel::dumpRawSnapshot(mm_camera_buf_def_t *frame)
208366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
208466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   QCamera3Stream *stream = getStreamByIndex(0);
208566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   if (stream != NULL) {
208666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       char buf[FILENAME_MAX];
208766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       memset(buf, 0, sizeof(buf));
208866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       cam_dimension_t dim;
208966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       memset(&dim, 0, sizeof(dim));
209066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       stream->getFrameDimension(dim);
209166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
209266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       cam_frame_len_offset_t offset;
209366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       memset(&offset, 0, sizeof(cam_frame_len_offset_t));
209466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       stream->getFrameOffset(offset);
209566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"r_%d_%dx%d.raw",
209666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                frame->frame_idx, offset.mp[0].stride, offset.mp[0].scanline);
209766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
209866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       int file_fd = open(buf, O_RDWR| O_CREAT, 0644);
209966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       if (file_fd >= 0) {
210066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          ssize_t written_len = write(file_fd, frame->buffer, frame->frame_len);
210166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          LOGD("written number of bytes %zd", written_len);
210266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          close(file_fd);
210366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       } else {
210466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          LOGE("failed to open file to dump image");
210566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       }
210666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   } else {
210766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       LOGE("Could not find stream");
210866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   }
210966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
211066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
211166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
211266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3RawChannel::convertLegacyToRaw16(mm_camera_buf_def_t *frame)
211366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
211466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Convert image buffer from Opaque raw format to RAW16 format
211566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // 10bit Opaque raw is stored in the format of:
211666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // 0000 - p5 - p4 - p3 - p2 - p1 - p0
211766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // where p0 to p5 are 6 pixels (each is 10bit)_and most significant
211866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // 4 bits are 0s. Each 64bit word contains 6 pixels.
211966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
212066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  QCamera3Stream *stream = getStreamByIndex(0);
212166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  if (stream != NULL) {
212266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      cam_dimension_t dim;
212366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      memset(&dim, 0, sizeof(dim));
212466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      stream->getFrameDimension(dim);
212566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
212666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      cam_frame_len_offset_t offset;
212766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      memset(&offset, 0, sizeof(cam_frame_len_offset_t));
212866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      stream->getFrameOffset(offset);
212966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
213066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      uint32_t raw16_stride = ((uint32_t)dim.width + 15U) & ~15U;
213166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      uint16_t* raw16_buffer = (uint16_t *)frame->buffer;
213266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
213366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      // In-place format conversion.
213466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      // Raw16 format always occupy more memory than opaque raw10.
213566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      // Convert to Raw16 by iterating through all pixels from bottom-right
213666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      // to top-left of the image.
213766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      // One special notes:
213866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      // 1. Cross-platform raw16's stride is 16 pixels.
213966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      // 2. Opaque raw10's stride is 6 pixels, and aligned to 16 bytes.
214066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      for (int32_t ys = dim.height - 1; ys >= 0; ys--) {
214166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          uint32_t y = (uint32_t)ys;
214266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          uint64_t* row_start = (uint64_t *)frame->buffer +
214366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                  y * (uint32_t)offset.mp[0].stride_in_bytes / 8;
214466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          for (int32_t xs = dim.width - 1; xs >= 0; xs--) {
214566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              uint32_t x = (uint32_t)xs;
214666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              uint16_t raw16_pixel = 0x3FF & (row_start[x/6] >> (10*(x%6)));
214766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              raw16_buffer[y*raw16_stride+x] = raw16_pixel;
214866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          }
214966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      }
215066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  } else {
215166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      LOGE("Could not find stream");
215266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
215366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
215466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
215566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
215666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3RawChannel::convertMipiToRaw16(mm_camera_buf_def_t *frame)
215766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
215866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Convert image buffer from mipi10 raw format to RAW16 format
215966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // mipi10 opaque raw is stored in the format of:
216066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // P3(1:0) P2(1:0) P1(1:0) P0(1:0) P3(9:2) P2(9:2) P1(9:2) P0(9:2)
216166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // 4 pixels occupy 5 bytes, no padding needed
216266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
216366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Stream *stream = getStreamByIndex(0);
216466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (stream != NULL) {
216566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_dimension_t dim;
216666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&dim, 0, sizeof(dim));
216766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream->getFrameDimension(dim);
216866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
216966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_frame_len_offset_t offset;
217066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&offset, 0, sizeof(cam_frame_len_offset_t));
217166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream->getFrameOffset(offset);
217266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
217366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t raw16_stride = ((uint32_t)dim.width + 15U) & ~15U;
217466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint16_t* raw16_buffer = (uint16_t *)frame->buffer;
217566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
217666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // In-place format conversion.
217766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Raw16 format always occupy more memory than opaque raw10.
217866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Convert to Raw16 by iterating through all pixels from bottom-right
217966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // to top-left of the image.
218066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // One special notes:
218166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // 1. Cross-platform raw16's stride is 16 pixels.
218266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // 2. mipi raw10's stride is 4 pixels, and aligned to 16 bytes.
218366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (int32_t ys = dim.height - 1; ys >= 0; ys--) {
218466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint32_t y = (uint32_t)ys;
218566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint8_t* row_start = (uint8_t *)frame->buffer +
218666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    y * (uint32_t)offset.mp[0].stride_in_bytes;
218766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            for (int32_t xs = dim.width - 1; xs >= 0; xs--) {
218866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                uint32_t x = (uint32_t)xs;
218966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                uint8_t upper_8bit = row_start[5*(x/4)+x%4];
219066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                uint8_t lower_2bit = ((row_start[5*(x/4)+4] >> (x%4)) & 0x3);
219166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                uint16_t raw16_pixel =
219266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (uint16_t)(((uint16_t)upper_8bit)<<2 |
219366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (uint16_t)lower_2bit);
219466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                raw16_buffer[y*raw16_stride+x] = raw16_pixel;
219566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
219666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
219766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
219866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Could not find stream");
219966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
220066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
220166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
220266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
220366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
220466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getReprocessType
220566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
220666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the type of reprocess output supported by this channel
220766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
220866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : NONE
220966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
221066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : reprocess_type_t : type of reprocess
221166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
221266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinreprocess_type_t QCamera3RawChannel::getReprocessType()
221366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
221466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return REPROCESS_TYPE_RAW;
221566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
221666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
221766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
221866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*************************************************************************************/
221966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// RAW Dump Channel related functions
222066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
222166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
222266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3RawDumpChannel
222366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
222466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Constructor for RawDumpChannel
222566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
222666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
222766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle    : Handle for Camera
222866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops       : Function pointer table
222966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @rawDumpSize   : Dimensions for the Raw stream
223066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @paddinginfo   : Padding information for stream
223166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @userData      : Cookie for parent
223266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pp mask       : PP feature mask for this stream
223366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @numBuffers    : number of max dequeued buffers
223466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
223566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN           : NA
223666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
223766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3RawDumpChannel::QCamera3RawDumpChannel(uint32_t cam_handle,
223866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t channel_handle,
223966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mm_camera_ops_t *cam_ops,
224066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_dimension_t rawDumpSize,
224166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_padding_info_t *paddingInfo,
224266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    void *userData,
224366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t postprocess_mask, uint32_t numBuffers) :
224466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3Channel(cam_handle, channel_handle, cam_ops, NULL,
224566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                paddingInfo, postprocess_mask,
224666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                userData, numBuffers),
224766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mDim(rawDumpSize),
224866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mMemory(NULL)
224966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
225066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char prop[PROPERTY_VALUE_MAX];
225166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("persist.camera.raw.dump", prop, "0");
225266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mRawDump = atoi(prop);
225366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
225466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
225566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
225666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3RawDumpChannel
225766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
225866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Destructor for RawDumpChannel
225966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
226066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
226166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
226266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN           : NA
226366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
226466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
226566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3RawDumpChannel::~QCamera3RawDumpChannel()
226666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
226766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    destroy();
226866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
226966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
227066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
227166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : dumpRawSnapshot
227266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
227366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Helper function to dump Raw frames
227466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
227566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
227666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  @frame      : stream buf frame to be dumped
227766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
227866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  RETURN      : NA
227966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
228066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3RawDumpChannel::dumpRawSnapshot(mm_camera_buf_def_t *frame)
228166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
228266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Stream *stream = getStreamByIndex(0);
228366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (stream != NULL) {
228466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        char buf[FILENAME_MAX];
228566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        struct timeval tv;
228666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        struct tm timeinfo_data;
228766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        struct tm *timeinfo;
228866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
228966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_dimension_t dim;
229066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&dim, 0, sizeof(dim));
229166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream->getFrameDimension(dim);
229266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
229366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_frame_len_offset_t offset;
229466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&offset, 0, sizeof(cam_frame_len_offset_t));
229566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream->getFrameOffset(offset);
229666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
229766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        gettimeofday(&tv, NULL);
229866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        timeinfo = localtime_r(&tv.tv_sec, &timeinfo_data);
229966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
230066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NULL != timeinfo) {
230166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(buf, 0, sizeof(buf));
230266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            snprintf(buf, sizeof(buf),
230366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    QCAMERA_DUMP_FRM_LOCATION
230466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    "%04d-%02d-%02d-%02d-%02d-%02d-%06ld_%d_%dx%d.raw",
230566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
230666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    timeinfo->tm_mday, timeinfo->tm_hour,
230766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    timeinfo->tm_min, timeinfo->tm_sec,tv.tv_usec,
230866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    frame->frame_idx, dim.width, dim.height);
230966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
231066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int file_fd = open(buf, O_RDWR| O_CREAT, 0777);
231166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (file_fd >= 0) {
231266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ssize_t written_len =
231366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        write(file_fd, frame->buffer, offset.frame_len);
231466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGD("written number of bytes %zd", written_len);
231566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                close(file_fd);
231666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
231766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("failed to open file to dump image");
231866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
231966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
232066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("localtime_r() error");
232166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
232266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
232366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Could not find stream");
232466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
232566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
232666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
232766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
232866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
232966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : streamCbRoutine
233066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
233166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Callback routine invoked for each frame generated for
233266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              Rawdump channel
233366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
233466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
233566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @super_frame  : stream buf frame generated
233666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream       : Underlying Stream object cookie
233766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
233866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN          : NA
233966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
234066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3RawDumpChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
23411687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan                                                __unused QCamera3Stream *stream)
234266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
234366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("E");
234466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (super_frame == NULL || super_frame->num_bufs != 1) {
234566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("super_frame is not valid");
234666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
234766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
234866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
234966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mRawDump)
235066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dumpRawSnapshot(super_frame->bufs[0]);
235166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
235266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bufDone(super_frame);
235366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(super_frame);
235466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
235566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
235666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
235766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamBufs
235866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
235966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Callback function provided to interface to get buffers.
236066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
236166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
236266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @len       : Length of each buffer to be allocated
236366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
236466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NULL on buffer allocation failure
236566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              QCamera3StreamMem object on sucess
236666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
236766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3StreamMem* QCamera3RawDumpChannel::getStreamBufs(uint32_t len)
236866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
236966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc;
237066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory = new QCamera3StreamMem(mNumBuffers);
237166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
237266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mMemory) {
237366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("unable to create heap memory");
237466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
237566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
237666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mMemory->allocateAll((size_t)len);
237766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
237866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("unable to allocate heap memory");
237966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete mMemory;
238066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory = NULL;
238166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
238266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
238366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return mMemory;
238466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
238566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
238666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
238766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : putStreamBufs
238866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
238966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Callback function provided to interface to return buffers.
239066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              Although no handles are actually returned, implicitl assumption
239166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              that interface will no longer use buffers and channel can
239266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              deallocated if necessary.
239366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
239466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : NA
239566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
239666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NA
239766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
239866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3RawDumpChannel::putStreamBufs()
239966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
240066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory->deallocate();
240166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    delete mMemory;
240266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory = NULL;
240366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
240466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
240566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
240666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : request
240766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
240866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Request function used as trigger
240966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
241066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
241166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : buffer- this will be NULL since this is internal channel
241266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frameNumber : Undefined again since this is internal stream
241366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
241466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
241566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
241666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
241766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
241866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3RawDumpChannel::request(buffer_handle_t * /*buffer*/,
241966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                uint32_t /*frameNumber*/)
242066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
242166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!m_bIsActive) {
242266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return QCamera3Channel::start();
242366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
242466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
242566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return 0;
242666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
242766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
242866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
242966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : intialize
243066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
243166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Initializes channel params and creates underlying stream
243266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
243366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
243466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *    @isType : type of image stabilization required on this stream
243566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
243666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
243766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
243866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
243966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
244066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3RawDumpChannel::initialize(cam_is_type_t isType)
244166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
244266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc;
244366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
244466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = isType;
244566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::addStream(CAM_STREAM_TYPE_RAW,
244666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG, mDim, ROTATE_0, (uint8_t)mNumBuffers,
244766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mPostProcMask, mIsType);
244866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
244966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("addStream failed");
245066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
245166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
245266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
245366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*************************************************************************************/
245466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
245566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* QCamera3YUVChannel methods */
245666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
245766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
245866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3YUVChannel
245966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
246066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCamera3YUVChannel
246166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
246266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
246366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
246466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
246566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cb_routine : callback routine to frame aggregator
246666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @paddingInfo : padding information for the stream
246766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream     : camera3_stream_t structure
246866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @stream_type: Channel stream type
246966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @postprocess_mask: the postprocess mask for streams of this channel
247066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @metadataChannel: handle to the metadataChannel
247166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
247266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
247366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3YUVChannel::QCamera3YUVChannel(uint32_t cam_handle,
247466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t channel_handle,
247566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_camera_ops_t *cam_ops,
247666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        channel_cb_routine cb_routine,
247766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_padding_info_t *paddingInfo,
247866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *userData,
247966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_t *stream,
248066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_stream_type_t stream_type,
248166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t postprocess_mask,
248266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Channel *metadataChannel) :
248366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera3ProcessingChannel(cam_handle, channel_handle, cam_ops,
248466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cb_routine, paddingInfo, userData, stream, stream_type,
248566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    postprocess_mask, metadataChannel)
248666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
248766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
248866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mBypass = (postprocess_mask == CAM_QCOM_FEATURE_NONE);
248966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFrameLen = 0;
249066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mEdgeMode.edge_mode = CAM_EDGE_MODE_OFF;
249166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mEdgeMode.sharpness = 0;
249266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mNoiseRedMode = CAM_NOISE_REDUCTION_MODE_OFF;
249366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&mCropRegion, 0, sizeof(mCropRegion));
249466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
249566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
249666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
249766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCamera3YUVChannel
249866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
249966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCamera3YUVChannel
250066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
250166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
250266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
250366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
250466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
250566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
250666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3YUVChannel::~QCamera3YUVChannel()
250766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
250866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   // Deallocation of heap buffers allocated in mMemory is freed
250966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   // automatically by its destructor
251066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
251166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
251266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
251366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : initialize
251466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
251566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Initialize and add camera channel & stream
251666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
251766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
251866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @isType    : the image stabilization type
251966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
252066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
252166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
252266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
252366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
252466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3YUVChannel::initialize(cam_is_type_t isType)
252566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
252666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
252766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
252866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t streamDim;
252966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
253066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == mCamera3Stream) {
253166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Camera stream uninitialized");
253266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
253366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
253466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
253566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (1 <= m_numStreams) {
253666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Only one stream per channel supported in v3 Hal
253766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_ERROR;
253866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
253966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
254066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType  = isType;
254166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mStreamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_CALLBACK);
254266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.width = mCamera3Stream->width;
254366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.height = mCamera3Stream->height;
254466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
254566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::addStream(mStreamType,
254666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreamFormat,
254766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamDim,
254866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ROTATE_0,
254966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mNumBufs,
255066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mPostProcMask,
255166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mIsType);
255266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
255366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("addStream failed");
255466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
255566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
255666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
255766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_buf_plane_info_t buf_planes;
255866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_padding_info_t paddingInfo = mPaddingInfo;
255966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
256066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&buf_planes, 0, sizeof(buf_planes));
256166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //to ensure a big enough buffer size set the height and width
256266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //padding to max(height padding, width padding)
256366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    paddingInfo.width_padding = MAX(paddingInfo.width_padding, paddingInfo.height_padding);
256466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    paddingInfo.height_padding = paddingInfo.width_padding;
256566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
256666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mm_stream_calc_offset_snapshot(mStreamFormat, &streamDim, &paddingInfo,
256766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            &buf_planes);
256866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
256966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("mm_stream_calc_offset_preview failed");
257066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
257166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
257266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
257366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFrameLen = buf_planes.plane_info.frame_len;
257466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
257566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR != rc) {
257666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Initialize failed, rc = %d", rc);
257766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
257866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
257966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
258066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* initialize offline meta memory for input reprocess */
258166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3ProcessingChannel::initialize(isType);
258266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR != rc) {
258366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Processing Channel initialize failed, rc = %d",
258466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 rc);
258566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
258666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
258766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
258866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
258966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
259066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
259166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : request
259266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
259366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: entry function for a request on a YUV stream. This function
259466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              has the logic to service a request based on its type
259566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
259666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
259766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buffer          : pointer to the output buffer
259866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frameNumber     : frame number of the request
259966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pInputBuffer    : pointer to input buffer if an input request
260066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @metadata        : parameters associated with the request
260166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
260266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0 on a success start of capture
260366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -EINVAL on invalid input
260466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -ENODEV on serious error
260566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
260666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3YUVChannel::request(buffer_handle_t *buffer,
260766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frameNumber,
260866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t* pInputBuffer,
260966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        metadata_buffer_t* metadata, bool &needMetadata)
261066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
261166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
261266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Mutex::Autolock lock(mOfflinePpLock);
261366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
261466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("pInputBuffer is %p frame number %d", pInputBuffer, frameNumber);
261566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == buffer || NULL == metadata) {
261666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid buffer/metadata in channel request");
261766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
261866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
261966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
262066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    PpInfo ppInfo;
262166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&ppInfo, 0, sizeof(ppInfo));
262266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ppInfo.frameNumber = frameNumber;
262366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ppInfo.offlinePpFlag = false;
262466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mBypass && !pInputBuffer ) {
262566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ppInfo.offlinePpFlag = needsFramePostprocessing(metadata);
262666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ppInfo.output = buffer;
262766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflinePpInfoList.push_back(ppInfo);
262866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
262966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
263066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("offlinePpFlag is %d", ppInfo.offlinePpFlag);
263166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    needMetadata = ppInfo.offlinePpFlag;
263266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!ppInfo.offlinePpFlag) {
263366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // regular request
263466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return QCamera3ProcessingChannel::request(buffer, frameNumber,
263566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                pInputBuffer, metadata);
263666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
263766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(!m_bIsActive) {
263866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = start();
263966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc)
264066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
264166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
264266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGD("Request on an existing stream");
264366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
264466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
264566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //we need to send this frame through the CPP
264666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //Allocate heap memory, then buf done on the buffer
264766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t bufIdx;
264866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mFreeHeapBufferList.empty()) {
264966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mMemory.allocateOne(mFrameLen);
265066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc < 0) {
265166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Failed allocating heap buffer. Fatal");
265266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return BAD_VALUE;
265366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
265466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                bufIdx = (uint32_t)rc;
265566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
265666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
265766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            bufIdx = *(mFreeHeapBufferList.begin());
265866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mFreeHeapBufferList.erase(mFreeHeapBufferList.begin());
265966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
266066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
266166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* Configure and start postproc if necessary */
266266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        reprocess_config_t reproc_cfg;
266366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_dimension_t dim;
266466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&reproc_cfg, 0, sizeof(reprocess_config_t));
266566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&dim, 0, sizeof(dim));
266666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreams[0]->getFrameDimension(dim);
266766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        setReprocConfig(reproc_cfg, NULL, metadata, mStreamFormat, dim);
266866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
266966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Start postprocessor without input buffer
267066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        startPostProc(reproc_cfg);
267166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
267266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("erasing %d", bufIdx);
267366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
267466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory.markFrameNumber(bufIdx, frameNumber);
267566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreams[0]->bufDone(bufIdx);
267666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
267766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
267866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
267966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
268066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
268166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
268266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : streamCbRoutine
268366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
268466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:
268566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
268666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
268766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : the super frame with filled buffer
268866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream      : stream on which the buffer was requested and filled
268966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
269066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
269166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
269266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3YUVChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
269366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *stream)
269466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
269566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
269666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t frameIndex;
269766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t resultFrameNumber;
269866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
269966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (checkStreamCbErrors(super_frame, stream) != NO_ERROR) {
270066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error with the stream callback");
270166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
270266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
270366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
270466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
270566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(frameIndex >= mNumBufs) {
270666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Error, Invalid index for buffer");
270766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         stream->bufDone(frameIndex);
270866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return;
270966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
271066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
271166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mBypass) {
271266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        List<PpInfo>::iterator ppInfo;
271366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
271466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mOfflinePpLock);
271566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        resultFrameNumber = mMemory.getFrameNumber(frameIndex);
271666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (ppInfo = mOfflinePpInfoList.begin();
271766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ppInfo != mOfflinePpInfoList.end(); ppInfo++) {
271866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (ppInfo->frameNumber == (uint32_t)resultFrameNumber) {
271966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                break;
272066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
272166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
272266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("frame index %d, frame number %d", frameIndex, resultFrameNumber);
272366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //check the reprocessing required flag against the frame number
272466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (ppInfo == mOfflinePpInfoList.end()) {
272566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error, request for frame number is a reprocess.");
272666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            stream->bufDone(frameIndex);
272766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return;
272866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
272966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
273066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (ppInfo->offlinePpFlag) {
273166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mm_camera_super_buf_t *frame =
273266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t));
273366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (frame == NULL) {
273466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Error allocating memory to save received_frame structure.");
273566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if(stream) {
273666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    stream->bufDone(frameIndex);
273766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
273866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return;
273966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
274066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
274166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            *frame = *super_frame;
274266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_postprocessor.processData(frame, ppInfo->output, resultFrameNumber);
274366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            free(super_frame);
274466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return;
274566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
274666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (ppInfo != mOfflinePpInfoList.begin()) {
274766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // There is pending reprocess buffer, cache current buffer
274866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (ppInfo->callback_buffer != NULL) {
274966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("Fatal: cached callback_buffer is already present");
275066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
275166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ppInfo->callback_buffer = super_frame;
275266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return;
275366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
275466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mOfflinePpInfoList.erase(ppInfo);
275566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
275666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
275766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
275866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
275966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3ProcessingChannel::streamCbRoutine(super_frame, stream);
276066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
276166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
276266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
276366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
276466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : reprocessCbRoutine
276566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
276666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback function for the reprocessed frame. This frame now
276766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              should be returned to the framework. This same callback is
276866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              used during input reprocessing or offline postprocessing
276966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
277066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
277166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultBuffer      : buffer containing the reprocessed data
277266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultFrameNumber : frame number on which the buffer was requested
277366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
277466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NONE
277566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
277666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
277766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3YUVChannel::reprocessCbRoutine(buffer_handle_t *resultBuffer,
277866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t resultFrameNumber)
277966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
278066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("E: frame number %d", resultFrameNumber);
278166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Vector<mm_camera_super_buf_t *> pendingCbs;
278266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
278366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* release the input buffer and input metadata buffer if used */
278466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 > mMemory.getHeapBufferIndex(resultFrameNumber)) {
278566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* mOfflineMemory and mOfflineMetaMemory used only for input reprocessing */
278666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t rc = releaseOfflineMemory(resultFrameNumber);
278766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
278866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error releasing offline memory rc = %d", rc);
278966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
279066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* Since reprocessing is done, send the callback to release the input buffer */
279166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mChannelCB) {
279266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mChannelCB(NULL, NULL, resultFrameNumber, true, mUserData);
279366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
279466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
279566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
279666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mBypass) {
279766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t rc = handleOfflinePpCallback(resultFrameNumber, pendingCbs);
279866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
279966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return;
280066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
280166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
280266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
280366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    issueChannelCb(resultBuffer, resultFrameNumber);
280466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
280566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Call all pending callbacks to return buffers
280666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (size_t i = 0; i < pendingCbs.size(); i++) {
280766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3ProcessingChannel::streamCbRoutine(
280866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                pendingCbs[i], mStreams[0]);
280966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
281066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
281166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
281266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
281366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
281466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : needsFramePostprocessing
281566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
281666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:
281766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
281866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
281966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
282066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     :
282166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  TRUE if frame needs to be postprocessed
282266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *  FALSE is frame does not need to be postprocessed
282366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
282466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
282566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera3YUVChannel::needsFramePostprocessing(metadata_buffer_t *meta)
282666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
282766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool ppNeeded = false;
282866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
282966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //sharpness
283066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(cam_edge_application_t, edgeMode,
283166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAM_INTF_META_EDGE_MODE, meta) {
283266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mEdgeMode = *edgeMode;
283366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
283466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
283566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //wnr
283666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(uint32_t, noiseRedMode,
283766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAM_INTF_META_NOISE_REDUCTION_MODE, meta) {
283866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mNoiseRedMode = *noiseRedMode;
283966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
284066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
284166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //crop region
284266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(cam_crop_region_t, scalerCropRegion,
284366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAM_INTF_META_SCALER_CROP_REGION, meta) {
284466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mCropRegion = *scalerCropRegion;
284566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
284666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
284766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((CAM_EDGE_MODE_OFF != mEdgeMode.edge_mode) &&
284866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (CAM_EDGE_MODE_ZERO_SHUTTER_LAG != mEdgeMode.edge_mode)) {
284966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ppNeeded = true;
285066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
285166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((CAM_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG != mNoiseRedMode) &&
285266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (CAM_NOISE_REDUCTION_MODE_OFF != mNoiseRedMode) &&
285366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (CAM_NOISE_REDUCTION_MODE_MINIMAL != mNoiseRedMode)) {
285466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ppNeeded = true;
285566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
285666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((mCropRegion.width < (int32_t)mCamera3Stream->width) ||
285766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (mCropRegion.height < (int32_t)mCamera3Stream->height)) {
285866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ppNeeded = true;
285966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
286066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
286166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return ppNeeded;
286266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
286366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
286466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
286566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : handleOfflinePpCallback
286666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
286766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: callback function for the reprocessed frame from offline
286866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              postprocessing.
286966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
287066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
287166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @resultFrameNumber : frame number on which the buffer was requested
287266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pendingCbs        : pending buffers to be returned first
287366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
287466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
287566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
287666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
287766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
287866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3YUVChannel::handleOfflinePpCallback(uint32_t resultFrameNumber,
287966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            Vector<mm_camera_super_buf_t *>& pendingCbs)
288066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
288166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Mutex::Autolock lock(mOfflinePpLock);
288266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    List<PpInfo>::iterator ppInfo;
288366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
288466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (ppInfo = mOfflinePpInfoList.begin();
288566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ppInfo != mOfflinePpInfoList.end(); ppInfo++) {
288666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (ppInfo->frameNumber == resultFrameNumber) {
288766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
288866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
288966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
289066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
289166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ppInfo == mOfflinePpInfoList.end()) {
289266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGI("Request of frame number %d is reprocessing",
289366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 resultFrameNumber);
289466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_ERROR;
289566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (ppInfo != mOfflinePpInfoList.begin()) {
289666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("callback for frame number %d should be head of list",
289766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 resultFrameNumber);
289866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
289966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
290066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
290166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ppInfo->offlinePpFlag) {
290266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Need to get the input buffer frame index from the
290366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // mMemory object and add that to the free heap buffers list.
290466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t bufferIndex =
290566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mMemory.getHeapBufferIndex(resultFrameNumber);
290666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (bufferIndex < 0) {
290766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Fatal %d: no buffer index for frame number %d",
290866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     bufferIndex, resultFrameNumber);
290966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return BAD_VALUE;
291066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
291166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFreeHeapBufferList.push_back(bufferIndex);
291266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        ppInfo = mOfflinePpInfoList.erase(ppInfo);
291366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
291466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Return pending buffer callbacks
291566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        while (ppInfo != mOfflinePpInfoList.end() &&
291666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                !ppInfo->offlinePpFlag && ppInfo->callback_buffer) {
291766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
291866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Call stream callbacks for cached buffers
291966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pendingCbs.push_back(ppInfo->callback_buffer);
292066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
292166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ppInfo = mOfflinePpInfoList.erase(ppInfo);
292266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
292366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
292466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
292566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Fatal: request of frame number %d doesn't need"
292666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                " offline postprocessing. However there is"
292766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                " reprocessing callback.",
292866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                resultFrameNumber);
292966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
293066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
293166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
293266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
293366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
293466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
293566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
293666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getReprocessType
293766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
293866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the type of reprocess output supported by this channel
293966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
294066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : NONE
294166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
294266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : reprocess_type_t : type of reprocess
294366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
294466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinreprocess_type_t QCamera3YUVChannel::getReprocessType()
294566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
294666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return REPROCESS_TYPE_YUV;
294766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
294866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
294966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* QCamera3PicChannel methods */
295066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
295166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
295266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : jpegEvtHandle
295366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
295466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function registerd to mm-jpeg-interface to handle jpeg events.
295566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                Construct result payload and call mChannelCb to deliver buffer
295666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                to framework.
295766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
295866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
295966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @status    : status of jpeg job
296066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @client_hdl: jpeg client handle
296166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @jobId     : jpeg job Id
296266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @p_ouput   : ptr to jpeg output result struct
296366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @userdata  : user data ptr
296466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
296566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
296666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
296766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3PicChannel::jpegEvtHandle(jpeg_job_status_t status,
296866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              uint32_t /*client_hdl*/,
296966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              uint32_t jobId,
297066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              mm_jpeg_output_t *p_output,
297166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                              void *userdata)
297266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
297366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
297466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buffer_handle_t *resultBuffer = NULL;
297566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buffer_handle_t *jpegBufferHandle = NULL;
297666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int resultStatus = CAMERA3_BUFFER_STATUS_OK;
297766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_stream_buffer_t result;
297866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera3_jpeg_blob_t jpegHeader;
297966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
298066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    KPI_ATRACE_INT("SNAPSHOT", 0);
298166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3PicChannel *obj = (QCamera3PicChannel *)userdata;
298266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (obj) {
298366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        //Construct payload for process_capture_result. Call mChannelCb
298466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
298566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        qcamera_hal3_jpeg_data_t *job = obj->m_postprocessor.findJpegJobByJobId(jobId);
298666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
298766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ((job == NULL) || (status == JPEG_JOB_STATUS_ERROR)) {
298866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error in jobId: (%d) with status: %d", jobId, status);
298966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            resultStatus = CAMERA3_BUFFER_STATUS_ERROR;
299066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
299166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
299266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NULL != job) {
299366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint32_t bufIdx = (uint32_t)job->jpeg_settings->out_buf_index;
299466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGD("jpeg out_buf_index: %d", bufIdx);
299566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
299666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            //Construct jpeg transient header of type camera3_jpeg_blob_t
299766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            //Append at the end of jpeg image of buf_filled_len size
299866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
299966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            jpegHeader.jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
300066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (JPEG_JOB_STATUS_DONE == status) {
300166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                jpegHeader.jpeg_size = (uint32_t)p_output->buf_filled_len;
300266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                char* jpeg_buf = (char *)p_output->buf_vaddr;
300366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
300466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ssize_t maxJpegSize = -1;
300566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
300666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Gralloc buffer may have additional padding for 4K page size
300766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Follow size guidelines based on spec since framework relies
300866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // on that to reach end of buffer and with it the header
300966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
301066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //Handle same as resultBuffer, but for readablity
301166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                jpegBufferHandle =
301266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (buffer_handle_t *)obj->mMemory.getBufferHandle(bufIdx);
301366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
301466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (NULL != jpegBufferHandle) {
301566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    maxJpegSize = ((private_handle_t*)(*jpegBufferHandle))->width;
301666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    if (maxJpegSize > obj->mMemory.getSize(bufIdx)) {
301766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        maxJpegSize = obj->mMemory.getSize(bufIdx);
301866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    }
301966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
302066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    size_t jpeg_eof_offset =
302166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            (size_t)(maxJpegSize - (ssize_t)sizeof(jpegHeader));
302266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    char *jpeg_eof = &jpeg_buf[jpeg_eof_offset];
302366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    memcpy(jpeg_eof, &jpegHeader, sizeof(jpegHeader));
302466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    obj->mMemory.cleanInvalidateCache(bufIdx);
302566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
302666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("JPEG buffer not found and index: %d",
302766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            bufIdx);
302866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    resultStatus = CAMERA3_BUFFER_STATUS_ERROR;
302966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
303066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
303166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
303266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ////Use below data to issue framework callback
303366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            resultBuffer =
303466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    (buffer_handle_t *)obj->mMemory.getBufferHandle(bufIdx);
303566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int32_t resultFrameNumber = obj->mMemory.getFrameNumber(bufIdx);
303666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int32_t rc = obj->mMemory.unregisterBuffer(bufIdx);
303766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc) {
303866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Error %d unregistering stream buffer %d",
303966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc, bufIdx);
304066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
304166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
304266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            result.stream = obj->mCamera3Stream;
304366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            result.buffer = resultBuffer;
304466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            result.status = resultStatus;
304566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            result.acquire_fence = -1;
304666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            result.release_fence = -1;
304766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
304866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Release any snapshot buffers before calling
304966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // the user callback. The callback can potentially
305066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // unblock pending requests to snapshot stream.
305166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int32_t snapshotIdx = -1;
305266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mm_camera_super_buf_t* src_frame = NULL;
305366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
305466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (job->src_reproc_frame)
305566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                src_frame = job->src_reproc_frame;
305666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            else
305766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                src_frame = job->src_frame;
305866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
305966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (src_frame) {
306066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (obj->mStreams[0]->getMyHandle() ==
306166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        src_frame->bufs[0]->stream_id) {
306266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    snapshotIdx = (int32_t)src_frame->bufs[0]->buf_idx;
3063b1b9db4745e595a1de4b398529163912bba6cdceShuzhen Wang                    if (0 <= snapshotIdx) {
3064b1b9db4745e595a1de4b398529163912bba6cdceShuzhen Wang                        Mutex::Autolock lock(obj->mFreeBuffersLock);
3065b1b9db4745e595a1de4b398529163912bba6cdceShuzhen Wang                        obj->mFreeBufferList.push_back((uint32_t)snapshotIdx);
3066b1b9db4745e595a1de4b398529163912bba6cdceShuzhen Wang                    }
306766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
306866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
306966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
307066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGI("Issue Jpeg Callback frameNumber = %d status = %d",
307166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    resultFrameNumber, resultStatus);
307266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (obj->mChannelCB) {
307366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                obj->mChannelCB(NULL,
307466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        &result,
307566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        (uint32_t)resultFrameNumber,
307666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        false,
307766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        obj->mUserData);
307866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
307966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
308066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // release internal data for jpeg job
308166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((NULL != job->fwk_frame) || (NULL != job->fwk_src_buffer)) {
308266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                /* unregister offline input buffer */
308366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                int32_t inputBufIndex =
308466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        obj->mOfflineMemory.getGrallocBufferIndex((uint32_t)resultFrameNumber);
308566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (0 <= inputBufIndex) {
308666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    rc = obj->mOfflineMemory.unregisterBuffer(inputBufIndex);
308766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
308866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("could not find the input buf index, frame number %d",
308966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                             resultFrameNumber);
309066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
309166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (NO_ERROR != rc) {
309266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("Error %d unregistering input buffer %d",
309366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                             rc, bufIdx);
309466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
309566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
309666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                /* unregister offline meta buffer */
309766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                int32_t metaBufIndex =
309866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        obj->mOfflineMetaMemory.getHeapBufferIndex((uint32_t)resultFrameNumber);
309966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (0 <= metaBufIndex) {
310066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    Mutex::Autolock lock(obj->mFreeOfflineMetaBuffersLock);
310166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    obj->mFreeOfflineMetaBuffersList.push_back((uint32_t)metaBufIndex);
310266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
310366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("could not find the input meta buf index, frame number %d",
310466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                             resultFrameNumber);
310566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
310666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
310766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            obj->m_postprocessor.releaseOfflineBuffers(false);
310866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            obj->m_postprocessor.releaseJpegJobData(job);
310966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            free(job);
311066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
311166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
311266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
311366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // }
311466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
311566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Null userdata in jpeg callback");
311666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
311766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
311866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
311966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3PicChannel::QCamera3PicChannel(uint32_t cam_handle,
312066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t channel_handle,
312166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mm_camera_ops_t *cam_ops,
312266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    channel_cb_routine cb_routine,
312366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_padding_info_t *paddingInfo,
312466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    void *userData,
312566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    camera3_stream_t *stream,
312666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t postprocess_mask,
312766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    bool is4KVideo,
312866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    bool isInputStreamConfigured,
312966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    QCamera3Channel *metadataChannel,
313066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t numBuffers) :
313166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3ProcessingChannel(cam_handle, channel_handle,
313266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                cam_ops, cb_routine, paddingInfo, userData,
313366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                stream, CAM_STREAM_TYPE_SNAPSHOT,
313466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                postprocess_mask, metadataChannel, numBuffers),
313566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mNumSnapshotBufs(0),
313666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mInputBufferHint(isInputStreamConfigured),
313766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mYuvMemory(NULL),
313866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mFrameLen(0)
313966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
314066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)mUserData;
314166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_max_pic_dim = hal_obj->calcMaxJpegDim();
314266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mYuvWidth = stream->width;
314366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mYuvHeight = stream->height;
314466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mStreamType = CAM_STREAM_TYPE_SNAPSHOT;
314566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Use same pixelformat for 4K video case
314666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mStreamFormat = is4KVideo ?
314766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            getStreamDefaultFormat(CAM_STREAM_TYPE_VIDEO)
314866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            :getStreamDefaultFormat(CAM_STREAM_TYPE_SNAPSHOT);
314966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = m_postprocessor.initJpeg(jpegEvtHandle, &m_max_pic_dim, this);
315066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
315166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Init Postprocessor failed");
315266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
315366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
315466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
315566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
315666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : flush
315766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
315866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush pic channel, which will stop all processing within, including
315966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              the reprocessing channel in postprocessor and YUV stream.
316066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
316166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
316266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
316366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
316466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
316566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
316666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
316766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3PicChannel::flush()
316866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
316966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
317066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(!m_bIsActive) {
317166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Attempt to flush inactive channel");
317266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
317366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
317466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
317566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = m_postprocessor.flush();
317666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == 0) {
317766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Postprocessor flush failed, rc = %d", rc);
317866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
317966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
318066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
318166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 < mOfflineMetaMemory.getCnt()) {
318266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineMetaMemory.deallocate();
318366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
318466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 < mOfflineMemory.getCnt()) {
318566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineMemory.unregisterBuffers();
318666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
318766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    Mutex::Autolock lock(mFreeBuffersLock);
318866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFreeBufferList.clear();
318966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < mCamera3Stream->max_buffers; i++) {
319066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFreeBufferList.push_back(i);
319166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
319266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
319366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
319466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
319566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
319666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3PicChannel::~QCamera3PicChannel()
319766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
319866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
319966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
320066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3PicChannel::initialize(cam_is_type_t isType)
320166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
320266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
320366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t streamDim;
320466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_type_t streamType;
320566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_format_t streamFormat;
320666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
320766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == mCamera3Stream) {
320866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Camera stream uninitialized");
320966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
321066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
321166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
321266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (1 <= m_numStreams) {
321366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        // Only one stream per channel supported in v3 Hal
321466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_ERROR;
321566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
321666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
321766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = isType;
321866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamType = mStreamType;
321966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamFormat = mStreamFormat;
322066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.width = (int32_t)mYuvWidth;
322166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamDim.height = (int32_t)mYuvHeight;
322266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
322366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mNumSnapshotBufs = mCamera3Stream->max_buffers;
322466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::addStream(streamType, streamFormat, streamDim,
322566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ROTATE_0, (uint8_t)mCamera3Stream->max_buffers, mPostProcMask,
322666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mIsType);
322766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
322866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR != rc) {
322966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Initialize failed, rc = %d", rc);
323066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
323166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
323266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
323366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* initialize offline meta memory for input reprocess */
323466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3ProcessingChannel::initialize(isType);
323566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR != rc) {
323666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Processing Channel initialize failed, rc = %d",
323766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 rc);
323866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
323966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
324066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
324166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
324266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
324366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
324466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : request
324566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
324666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: handle the request - either with an input buffer or a direct
324766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              output request
324866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
324966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
325066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buffer       : pointer to the output buffer
325166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frameNumber  : frame number of the request
325266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pInputBuffer : pointer to input buffer if an input request
325366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @metadata     : parameters associated with the request
325466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
325566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0 on a success start of capture
325666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -EINVAL on invalid input
325766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              -ENODEV on serious error
325866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
325966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3PicChannel::request(buffer_handle_t *buffer,
326066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t frameNumber,
326166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera3_stream_buffer_t *pInputBuffer,
326266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        metadata_buffer_t *metadata)
326366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
326466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
326566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //FIX ME: Return buffer back in case of failures below.
326666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
326766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
326866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
326966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config_t reproc_cfg;
327066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t dim;
327166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&reproc_cfg, 0, sizeof(reprocess_config_t));
327266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //make sure to set the correct input stream dim in case of YUV size override
327366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //and recalculate the plane info
327466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dim.width = (int32_t)mYuvWidth;
327566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dim.height = (int32_t)mYuvHeight;
327666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    setReprocConfig(reproc_cfg, pInputBuffer, metadata, mStreamFormat, dim);
327766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
327866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Picture stream has already been started before any request comes in
327966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!m_bIsActive) {
328066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Channel not started!!");
328166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
328266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
328366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
328466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int index = mMemory.getMatchBufIndex((void*)buffer);
328566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
328666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(index < 0) {
328766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = registerBuffer(buffer, mIsType);
328866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
328966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("On-the-fly buffer registration failed %d",
329066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc);
329166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
329266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
329366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
329466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        index = mMemory.getMatchBufIndex((void*)buffer);
329566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (index < 0) {
329666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Could not find object among registered buffers");
329766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return DEAD_OBJECT;
329866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
329966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
330066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("buffer index %d, frameNumber: %u", index, frameNumber);
330166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
330266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mMemory.markFrameNumber((uint32_t)index, frameNumber);
330366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
330466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Start postprocessor
330566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    startPostProc(reproc_cfg);
330666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
330766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Queue jpeg settings
330866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = queueJpegSetting((uint32_t)index, metadata);
330966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
331066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (pInputBuffer == NULL) {
331166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mFreeBuffersLock);
331266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t bufIdx;
331366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mFreeBufferList.empty()) {
331466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mYuvMemory->allocateOne(mFrameLen);
331566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc < 0) {
331666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Failed to allocate heap buffer. Fatal");
331766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
331866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
331966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                bufIdx = (uint32_t)rc;
332066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
332166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
332266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            List<uint32_t>::iterator it = mFreeBufferList.begin();
332366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            bufIdx = *it;
332466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mFreeBufferList.erase(it);
332566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
332666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mYuvMemory->markFrameNumber(bufIdx, frameNumber);
332766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreams[0]->bufDone(bufIdx);
332866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
332966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        qcamera_fwk_input_pp_data_t *src_frame = NULL;
333066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        src_frame = (qcamera_fwk_input_pp_data_t *)calloc(1,
333166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                sizeof(qcamera_fwk_input_pp_data_t));
333266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (src_frame == NULL) {
333366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("No memory for src frame");
333466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return NO_MEMORY;
333566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
333666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = setFwkInputPPData(src_frame, pInputBuffer, &reproc_cfg, metadata,
333766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                NULL /*fwk output buffer*/, frameNumber);
333866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
333966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error %d while setting framework input PP data", rc);
334066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            free(src_frame);
334166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
334266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
334366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGH("Post-process started");
334466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_postprocessor.processData(src_frame);
334566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
334666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
334766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
334866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
334966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
335066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
335166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
335266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : dataNotifyCB
335366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
335466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Channel Level callback used for super buffer data notify.
335566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              This function is registered with mm-camera-interface to handle
335666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              data notify
335766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
335866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
335966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @recvd_frame   : stream frame received
336066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   userdata       : user data ptr
336166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
336266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
336366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
336466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3PicChannel::dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
336566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 void *userdata)
336666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
336766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
336866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("E\n");
336966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3PicChannel *channel = (QCamera3PicChannel *)userdata;
337066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
337166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (channel == NULL) {
337266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("invalid channel pointer");
337366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
337466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
337566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
337666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(channel->m_numStreams != 1) {
337766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error: Bug: This callback assumes one stream per channel");
337866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
337966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
338066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
338166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
338266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(channel->mStreams[0] == NULL) {
338366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error: Invalid Stream object");
338466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
338566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
338666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
338766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    channel->QCamera3PicChannel::streamCbRoutine(recvd_frame, channel->mStreams[0]);
338866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
338966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("X\n");
339066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
339166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
339266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
339366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
339466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : streamCbRoutine
339566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
339666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION:
339766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
339866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
339966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @super_frame : the super frame with filled buffer
340066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream      : stream on which the buffer was requested and filled
340166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
340266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
340366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
340466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3PicChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
340566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            QCamera3Stream *stream)
340666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
340766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
340866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //TODO
340966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Used only for getting YUV. Jpeg callback will be sent back from channel
341066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //directly to HWI. Refer to func jpegEvtHandle
341166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
341266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Got the yuv callback. Calling yuv callback handler in PostProc
341366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t frameIndex;
341466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_super_buf_t* frame = NULL;
341566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t dim;
341666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_frame_len_offset_t offset;
341766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
341866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&dim, 0, sizeof(dim));
341966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&offset, 0, sizeof(cam_frame_len_offset_t));
342066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
342166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (checkStreamCbErrors(super_frame, stream) != NO_ERROR) {
342266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error with the stream callback");
342366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
342466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
342566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
342666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
342766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("recvd buf_idx: %u for further processing",
342866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         (uint32_t)frameIndex);
342966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(frameIndex >= mNumSnapshotBufs) {
343066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Error, Invalid index for buffer");
343166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         if(stream) {
343266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             Mutex::Autolock lock(mFreeBuffersLock);
343366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             mFreeBufferList.push_back(frameIndex);
343466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             stream->bufDone(frameIndex);
343566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         }
343666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return;
343766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
343866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
343966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t));
344066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (frame == NULL) {
344166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       LOGE("Error allocating memory to save received_frame structure.");
344266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       if(stream) {
344366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           Mutex::Autolock lock(mFreeBuffersLock);
344466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           mFreeBufferList.push_back(frameIndex);
344566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           stream->bufDone(frameIndex);
344666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       }
344766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       return;
344866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
344966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    *frame = *super_frame;
345066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->getFrameDimension(dim);
345166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    stream->getFrameOffset(offset);
345266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dumpYUV(frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_INPUT_REPROCESS);
345366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
345466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_postprocessor.processData(frame);
345566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(super_frame);
345666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
345766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
345866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
345966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3StreamMem* QCamera3PicChannel::getStreamBufs(uint32_t len)
346066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
346166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mYuvMemory = new QCamera3StreamMem(mCamera3Stream->max_buffers, false);
346266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mYuvMemory) {
346366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("unable to create metadata memory");
346466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
346566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
346666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFrameLen = len;
346766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
346866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return mYuvMemory;
346966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
347066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
347166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3PicChannel::putStreamBufs()
347266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
347366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3ProcessingChannel::putStreamBufs();
347466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
347566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mYuvMemory->deallocate();
347666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    delete mYuvMemory;
347766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mYuvMemory = NULL;
347866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFreeBufferList.clear();
347966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
348066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
348166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3PicChannel::queueJpegSetting(uint32_t index, metadata_buffer_t *metadata)
348266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
348366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)mUserData;
348466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    jpeg_settings_t *settings =
348566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (jpeg_settings_t *)malloc(sizeof(jpeg_settings_t));
348666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
348766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!settings) {
348866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("out of memory allocating jpeg_settings");
348966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -ENOMEM;
349066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
349166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
349266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(settings, 0, sizeof(jpeg_settings_t));
349366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
349466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    settings->out_buf_index = index;
349566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
349666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    settings->jpeg_orientation = 0;
349766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(int32_t, orientation, CAM_INTF_META_JPEG_ORIENTATION, metadata) {
349866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->jpeg_orientation = *orientation;
349966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
350066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
350166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    settings->jpeg_quality = 85;
350266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(uint32_t, quality1, CAM_INTF_META_JPEG_QUALITY, metadata) {
350366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->jpeg_quality = (uint8_t) *quality1;
350466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
350566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
350666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(uint32_t, quality2, CAM_INTF_META_JPEG_THUMB_QUALITY, metadata) {
350766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->jpeg_thumb_quality = (uint8_t) *quality2;
350866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
350966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
351066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(cam_dimension_t, dimension, CAM_INTF_META_JPEG_THUMB_SIZE, metadata) {
351166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->thumbnail_size = *dimension;
351266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
351366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
351466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    settings->gps_timestamp_valid = 0;
351566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(int64_t, timestamp, CAM_INTF_META_JPEG_GPS_TIMESTAMP, metadata) {
351666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->gps_timestamp = *timestamp;
351766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->gps_timestamp_valid = 1;
351866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
351966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
352066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    settings->gps_coordinates_valid = 0;
352166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(double, coordinates, CAM_INTF_META_JPEG_GPS_COORDINATES, metadata) {
352266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memcpy(settings->gps_coordinates, coordinates, 3*sizeof(double));
352366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->gps_coordinates_valid = 1;
352466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
352566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
352666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(uint8_t, proc_methods, CAM_INTF_META_JPEG_GPS_PROC_METHODS, metadata) {
352766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(settings->gps_processing_method, 0,
352866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                sizeof(settings->gps_processing_method));
352966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        strlcpy(settings->gps_processing_method, (const char *)proc_methods,
353066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                sizeof(settings->gps_processing_method));
353166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
353266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
353366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Image description
353466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const char *eepromVersion = hal_obj->getEepromVersionInfo();
353566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const uint32_t *ldafCalib = hal_obj->getLdafCalib();
353666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((eepromVersion && strlen(eepromVersion)) ||
353766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            ldafCalib) {
353866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int len = 0;
353966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        settings->image_desc_valid = true;
354066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (eepromVersion && strlen(eepromVersion)) {
354166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            len = snprintf(settings->image_desc, sizeof(settings->image_desc),
354266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    "M:%s ", eepromVersion);
354366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
354466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (ldafCalib) {
354566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            snprintf(settings->image_desc + len,
354666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    sizeof(settings->image_desc) - len, "L:%u-%u",
354766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    ldafCalib[0], ldafCalib[1]);
354866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
354966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
355066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
355166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return m_postprocessor.processJpegSettingData(settings);
355266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
355366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
355466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
355566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3PicChannel::overrideYuvSize(uint32_t width, uint32_t height)
355666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
355766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   mYuvWidth = width;
355866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   mYuvHeight = height;
355966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
356066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
356166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
356266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getReprocessType
356366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
356466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: get the type of reprocess output supported by this channel
356566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
356666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : NONE
356766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
356866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : reprocess_type_t : type of reprocess
356966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
357066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinreprocess_type_t QCamera3PicChannel::getReprocessType()
357166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
357266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* a picture channel could either use the postprocessor for reprocess+jpeg
357366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       or only for reprocess */
357466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_type_t expectedReprocess;
357566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mPostProcMask == CAM_QCOM_FEATURE_NONE || mInputBufferHint) {
357666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        expectedReprocess = REPROCESS_TYPE_JPEG;
357766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
357866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        expectedReprocess = REPROCESS_TYPE_NONE;
357966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
358066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("expectedReprocess from Pic Channel is %d", expectedReprocess);
358166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return expectedReprocess;
358266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
358366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
358466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
358566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
358666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3ReprocessChannel
358766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
358866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCamera3ReprocessChannel
358966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
359066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
359166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
359266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
359366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pp_mask    : post-proccess feature mask
359466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
359566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
359666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
359766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3ReprocessChannel::QCamera3ReprocessChannel(uint32_t cam_handle,
359866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                 uint32_t channel_handle,
359966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                 mm_camera_ops_t *cam_ops,
360066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                 channel_cb_routine cb_routine,
360166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                 cam_padding_info_t *paddingInfo,
360266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                 uint32_t postprocess_mask,
360366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                 void *userData, void *ch_hdl) :
360466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* In case of framework reprocessing, pproc and jpeg operations could be
360566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     * parallelized by allowing 1 extra buffer for reprocessing output:
360666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin     * ch_hdl->getNumBuffers() + 1 */
360766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Channel(cam_handle, channel_handle, cam_ops, cb_routine, paddingInfo,
360866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    postprocess_mask, userData,
360966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    ((QCamera3ProcessingChannel *)ch_hdl)->getNumBuffers()
361066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                              + (MAX_REPROCESS_PIPELINE_STAGES - 1)),
361166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    inputChHandle(ch_hdl),
361266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mOfflineBuffersIndex(-1),
361366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mFrameLen(0),
361466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mReprocessType(REPROCESS_TYPE_NONE),
361566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_pSrcChannel(NULL),
361666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_pMetaChannel(NULL),
361766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory(NULL),
36181687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    mGrallocMemory(0),
36191687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    mReprocessPerfMode(false)
362066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
362166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
362266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mOfflineBuffersIndex = mNumBuffers -1;
362366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mOfflineMetaIndex = (int32_t) (2*mNumBuffers -1);
362466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
362566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
362666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
362766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
362866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3ReprocessChannel
362966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
363066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCamera3ReprocessChannel
363166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
363266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
363366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
363466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
363566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pp_mask    : post-proccess feature mask
363666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
363766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
363866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
363966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::initialize(cam_is_type_t isType)
364066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
364166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
364266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_channel_attr_t attr;
364366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
364466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
364566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
364666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    attr.max_unmatched_frames = 1;
364766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
364866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    m_handle = m_camOps->add_channel(m_camHandle,
364966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      &attr,
365066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      NULL,
365166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                      this);
365266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_handle == 0) {
365366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Add channel failed");
365466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return UNKNOWN_ERROR;
365566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
365666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
365766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = isType;
365866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
365966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
366066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
366166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
366266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : registerBuffer
366366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
366466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: register streaming buffer to the channel object
366566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
366666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
366766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buffer     : buffer to be registered
366866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @isType     : the image stabilization type for the buffer
366966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
367066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
367166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
367266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
367366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
367466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::registerBuffer(buffer_handle_t *buffer,
367566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_is_type_t isType)
367666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
367766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
367866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = 0;
367966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = isType;
368066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_type_t streamType;
368166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
368266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (buffer == NULL) {
368366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error: Cannot register a NULL buffer");
368466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
368566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
368666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
368766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((uint32_t)mGrallocMemory.getCnt() > (mNumBuffers - 1)) {
368866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Trying to register more buffers than initially requested");
368966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
369066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
369166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
369266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (0 == m_numStreams) {
369366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = initialize(mIsType);
369466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
369566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Couldn't initialize camera stream %d",
369666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc);
369766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
369866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
369966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
370066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
370166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamType = mStreams[0]->getMyType();
370266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mGrallocMemory.registerBuffer(buffer, streamType);
370366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (ALREADY_EXISTS == rc) {
370466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_ERROR;
370566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (NO_ERROR != rc) {
370666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Buffer %p couldn't be registered %d", buffer, rc);
370766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return rc;
370866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
370966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
371066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
371166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
371266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
371366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
371466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera3ReprocessChannel
371566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
371666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCamera3ReprocessChannel
371766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
371866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
371966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_handle : camera handle
372066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @cam_ops    : ptr to camera ops table
372166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pp_mask    : post-proccess feature mask
372266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
372366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
372466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
372566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ReprocessChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
372666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  QCamera3Stream *stream)
372766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
372866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Got the pproc data callback. Now send to jpeg encoding
372966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t frameIndex;
373066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t resultFrameNumber;
373166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_super_buf_t* frame = NULL;
373266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3ProcessingChannel *obj = (QCamera3ProcessingChannel *)inputChHandle;
373366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t dim;
373466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_frame_len_offset_t offset;
373566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
373666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&dim, 0, sizeof(dim));
373766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&offset, 0, sizeof(cam_frame_len_offset_t));
373866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(!super_frame) {
373966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Invalid Super buffer");
374066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return;
374166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
374266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
374366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(super_frame->num_bufs != 1) {
374466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Multiple streams are not supported");
374566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return;
374666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
374766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(super_frame->bufs[0] == NULL ) {
374866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         LOGE("Error, Super buffer frame does not contain valid buffer");
374966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin         return;
375066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
375166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
375266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
375366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
375466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mReprocessType == REPROCESS_TYPE_JPEG) {
375566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        resultFrameNumber =  mMemory->getFrameNumber(frameIndex);
375666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t));
375766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (frame == NULL) {
375866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           LOGE("Error allocating memory to save received_frame structure.");
375966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           if(stream) {
376066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               stream->bufDone(frameIndex);
376166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           }
376266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           return;
376366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
376466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGI("bufIndex: %u recvd from post proc",
376566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 (uint32_t)frameIndex);
376666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        *frame = *super_frame;
376766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
376866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream->getFrameDimension(dim);
376966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        stream->getFrameOffset(offset);
377066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        dumpYUV(frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_SNAPSHOT);
377166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* Since reprocessing is done, send the callback to release the input buffer */
377266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mChannelCB) {
377366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mChannelCB(NULL, NULL, resultFrameNumber, true, mUserData);
377466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
377566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        obj->m_postprocessor.processPPData(frame);
377666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
377766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        buffer_handle_t *resultBuffer;
377866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
377966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        resultBuffer = (buffer_handle_t *)mGrallocMemory.getBufferHandle(frameIndex);
378066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        resultFrameNumber = mGrallocMemory.getFrameNumber(frameIndex);
378166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t rc = stream->bufRelease(frameIndex);
378266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
378366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error %d releasing stream buffer %d",
378466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc, frameIndex);
378566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
378666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mGrallocMemory.unregisterBuffer(frameIndex);
378766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (NO_ERROR != rc) {
378866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Error %d unregistering stream buffer %d",
378966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     rc, frameIndex);
379066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
379166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        obj->reprocessCbRoutine(resultBuffer, resultFrameNumber);
379266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
379366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        obj->m_postprocessor.releaseOfflineBuffers(false);
379466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        qcamera_hal3_pp_data_t *pp_job = obj->m_postprocessor.dequeuePPJob(resultFrameNumber);
379566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (pp_job != NULL) {
379666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            obj->m_postprocessor.releasePPJobData(pp_job);
379766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
379866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        free(pp_job);
379966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        resetToCamPerfNormal(resultFrameNumber);
380066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
380166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(super_frame);
380266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return;
380366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
380466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
380566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
380666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : resetToCamPerfNormal
380766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
380866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Set the perf mode to normal if all the priority frames
380966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              have been reprocessed
381066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
381166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
381266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *      @frameNumber: Frame number of the reprocess completed frame
381366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
381466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : QCamera3StreamMem *
381566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
381666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::resetToCamPerfNormal(uint32_t frameNumber)
381766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
381866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
381966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool resetToPerfNormal = false;
382066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    {
382166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mPriorityFramesLock);
382266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* remove the priority frame number from the list */
382366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (size_t i = 0; i < mPriorityFrames.size(); i++) {
382466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (mPriorityFrames[i] == frameNumber) {
382566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mPriorityFrames.removeAt(i);
382666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
382766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
382866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        /* reset the perf mode if pending priority frame list is empty */
382966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mReprocessPerfMode && mPriorityFrames.empty()) {
383066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            resetToPerfNormal = true;
383166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
383266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
383366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (resetToPerfNormal) {
383466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *pStream = mStreams[0];
383566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_stream_parm_buffer_t param;
383666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
383766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
383866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.type = CAM_STREAM_PARAM_TYPE_REQUEST_OPS_MODE;
383966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.perf_mode = CAM_PERF_NORMAL;
384066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = pStream->setParameter(param);
384166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        {
384266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            Mutex::Autolock lock(mPriorityFramesLock);
384366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mReprocessPerfMode = false;
384466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
384566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
384666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
384766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
384866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
384966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
385066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamBufs
385166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
385266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: register the buffers of the reprocess channel
385366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
385466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
385566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
385666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : QCamera3StreamMem *
385766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
385866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3StreamMem* QCamera3ReprocessChannel::getStreamBufs(uint32_t len)
385966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
386066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mReprocessType == REPROCESS_TYPE_JPEG) {
386166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory = new QCamera3StreamMem(mNumBuffers, false);
386266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!mMemory) {
386366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("unable to create reproc memory");
386466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return NULL;
386566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
386666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFrameLen = len;
386766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return mMemory;
386866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
386966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return &mGrallocMemory;
387066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
387166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
387266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
387366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : putStreamBufs
387466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
387566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: release the reprocess channel buffers
387666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
387766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
387866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
387966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     :
388066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
388166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3ReprocessChannel::putStreamBufs()
388266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
388366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   if (mReprocessType == REPROCESS_TYPE_JPEG) {
388466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       mMemory->deallocate();
388566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       delete mMemory;
388666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       mMemory = NULL;
388766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       mFreeBufferList.clear();
388866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   } else {
388966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       mGrallocMemory.unregisterBuffers();
389066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   }
389166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
389266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
389366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
389466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCamera3ReprocessChannel
389566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
389666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCamera3ReprocessChannel
389766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
389866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
389966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
390066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : none
390166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
390266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3ReprocessChannel::~QCamera3ReprocessChannel()
390366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
390466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    destroy();
390566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
390666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_handle) {
390766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_camOps->delete_channel(m_camHandle, m_handle);
390866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("deleting channel %d", m_handle);
390966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_handle = 0;
391066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
391166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
391266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
391366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
391466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : start
391566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
391666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start reprocess channel.
391766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
391866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
391966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
392066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
392166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
392266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
392366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
392466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::start()
392566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
392666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
392766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
392866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
392966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::start();
393066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
393166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == NO_ERROR) {
393266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       rc = m_camOps->start_channel(m_camHandle, m_handle);
393366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
393466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       // Check failure
393566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       if (rc != NO_ERROR) {
393666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           LOGE("start_channel failed %d", rc);
393766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           QCamera3Channel::stop();
393866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       }
393966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
394066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
394166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
394266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
394366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
394466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : stop
394566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
394666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop reprocess channel.
394766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
394866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
394966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
395066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
395166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
395266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
395366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
395466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::stop()
395566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
395666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ATRACE_CALL();
395766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
395866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
395966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::stop();
396066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    unmapOfflineBuffers(true);
396166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
396266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc |= m_camOps->stop_channel(m_camHandle, m_handle);
396366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
396466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
396566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
396666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
396766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
396866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getStreamBySrcHandle
396966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
397066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: find reprocess stream by its source stream handle
397166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
397266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
397366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @srcHandle : source stream handle
397466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
397566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : ptr to reprocess stream if found. NULL if not found
397666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
397766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3Stream * QCamera3ReprocessChannel::getStreamBySrcHandle(uint32_t srcHandle)
397866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
397966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Stream *pStream = NULL;
398066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
398166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
398266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mSrcStreamHandles[i] == srcHandle) {
398366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pStream = mStreams[i];
398466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
398566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
398666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
398766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return pStream;
398866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
398966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
399066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
399166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getSrcStreamBySrcHandle
399266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
399366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: find source stream by source stream handle
399466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
399566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
399666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @srcHandle : source stream handle
399766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
399866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : ptr to reprocess stream if found. NULL if not found
399966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
400066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3Stream * QCamera3ReprocessChannel::getSrcStreamBySrcHandle(uint32_t srcHandle)
400166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
400266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Stream *pStream = NULL;
400366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
400466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == m_pSrcChannel) {
400566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
400666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
400766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
400866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
400966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mSrcStreamHandles[i] == srcHandle) {
401066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            pStream = m_pSrcChannel->getStreamByIndex(i);
401166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
401266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
401366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
401466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return pStream;
401566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
401666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
401766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
401866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : unmapOfflineBuffers
401966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
402066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Unmaps offline buffers
402166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
402266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
402366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
402466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
402566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
402666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
402766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
402866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::unmapOfflineBuffers(bool all)
402966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
403066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
403166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mOfflineBuffers.empty()) {
403266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *stream = NULL;
403366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        List<OfflineBuffer>::iterator it = mOfflineBuffers.begin();
403466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (; it != mOfflineBuffers.end(); it++) {
403566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           stream = (*it).stream;
403666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           if (NULL != stream) {
403766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               rc = stream->unmapBuf((*it).type,
403866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     (*it).index,
403966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        -1);
404066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               if (NO_ERROR != rc) {
404166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                   LOGE("Error during offline buffer unmap %d",
404266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          rc);
404366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               }
404466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               LOGD("Unmapped buffer with index %d", (*it).index);
404566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           }
404666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           if (!all) {
404766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               mOfflineBuffers.erase(it);
404866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               break;
404966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           }
405066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
405166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (all) {
405266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           mOfflineBuffers.clear();
405366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
405466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
405566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
405666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mOfflineMetaBuffers.empty()) {
405766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *stream = NULL;
405866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        List<OfflineBuffer>::iterator it = mOfflineMetaBuffers.begin();
405966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        for (; it != mOfflineMetaBuffers.end(); it++) {
406066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           stream = (*it).stream;
406166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           if (NULL != stream) {
406266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               rc = stream->unmapBuf((*it).type,
406366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     (*it).index,
406466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                        -1);
406566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               if (NO_ERROR != rc) {
406666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                   LOGE("Error during offline buffer unmap %d",
406766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                          rc);
406866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               }
406966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               LOGD("Unmapped meta buffer with index %d", (*it).index);
407066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           }
407166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           if (!all) {
407266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               mOfflineMetaBuffers.erase(it);
407366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin               break;
407466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           }
407566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
407666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (all) {
407766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           mOfflineMetaBuffers.clear();
407866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
407966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
408066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
408166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
408266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
408366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
408466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : bufDone
408566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
408666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Return reprocess stream buffer to free buffer list.
408766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              Note that this function doesn't queue buffer back to kernel.
408866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              It's up to doReprocessOffline to do that instead.
408966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
409066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @recvd_frame  : stream buf frame to be returned
409166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
409266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
409366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
409466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
409566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
409666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::bufDone(mm_camera_super_buf_t *recvd_frame)
409766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
409866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
409966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (recvd_frame && recvd_frame->num_bufs == 1) {
410066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mFreeBuffersLock);
410166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t buf_idx = recvd_frame->bufs[0]->buf_idx;
410266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mFreeBufferList.push_back(buf_idx);
410366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
410466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
410566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Fatal. Not supposed to be here");
410666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = BAD_VALUE;
410766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
410866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
410966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
411066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
411166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
411266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
411366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : overrideMetadata
411466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
411566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Override metadata entry such as rotation, crop, and CDS info.
411666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
411766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
411866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frame     : input frame from source stream
411966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   meta_buffer: metadata buffer
412066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @metadata  : corresponding metadata
412166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @fwk_frame :
412266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
412366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
412466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
412566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
412666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
412766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::overrideMetadata(qcamera_hal3_pp_buffer_t *pp_buffer,
412866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mm_camera_buf_def_t *meta_buffer, jpeg_settings_t *jpeg_settings,
412966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        qcamera_fwk_input_pp_data_t &fwk_frame)
413066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
413166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = NO_ERROR;
413266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)mUserData;
413366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((NULL == meta_buffer) || (NULL == pp_buffer) || (NULL == pp_buffer->input) ||
413466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (NULL == hal_obj)) {
413566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
413666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
413766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
413866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    metadata_buffer_t *meta = (metadata_buffer_t *)meta_buffer->buffer;
413966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_super_buf_t *frame = pp_buffer->input;
414066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == meta) {
414166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
414266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
414366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
414466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < frame->num_bufs; i++) {
414566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *pStream = getStreamBySrcHandle(frame->bufs[i]->stream_id);
414666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *pSrcStream = getSrcStreamBySrcHandle(frame->bufs[i]->stream_id);
414766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
414866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (pStream != NULL && pSrcStream != NULL) {
414966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (jpeg_settings) {
415066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Find rotation info for reprocess stream
415166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                cam_rotation_info_t rotation_info;
415266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                memset(&rotation_info, 0, sizeof(rotation_info));
415366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (jpeg_settings->jpeg_orientation == 0) {
415466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                   rotation_info.rotation = ROTATE_0;
415566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else if (jpeg_settings->jpeg_orientation == 90) {
415666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                   rotation_info.rotation = ROTATE_90;
415766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else if (jpeg_settings->jpeg_orientation == 180) {
415866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                   rotation_info.rotation = ROTATE_180;
415966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else if (jpeg_settings->jpeg_orientation == 270) {
416066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                   rotation_info.rotation = ROTATE_270;
416166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
416266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rotation_info.streamId = mStreams[0]->getMyServerID();
416366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ADD_SET_PARAM_ENTRY_TO_BATCH(meta, CAM_INTF_PARM_ROTATION, rotation_info);
416466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
416566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
416666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Find and insert crop info for reprocess stream
416766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, meta) {
416866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (MAX_NUM_STREAMS > crop_data->num_of_streams) {
416966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    for (int j = 0; j < crop_data->num_of_streams; j++) {
417066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        if (crop_data->crop_info[j].stream_id ==
417166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                pSrcStream->getMyServerID()) {
417266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
417366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            // Store crop/roi information for offline reprocess
417466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            // in the reprocess stream slot
417566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            crop_data->crop_info[crop_data->num_of_streams].crop =
417666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].crop;
417766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            crop_data->crop_info[crop_data->num_of_streams].roi_map =
417866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].roi_map;
417966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            crop_data->crop_info[crop_data->num_of_streams].stream_id =
418066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    mStreams[0]->getMyServerID();
418166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            crop_data->num_of_streams++;
418266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
418366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            LOGD("Reprocess stream server id: %d",
418466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                     mStreams[0]->getMyServerID());
418566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            LOGD("Found offline reprocess crop %dx%d %dx%d",
418666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].crop.left,
418766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].crop.top,
418866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].crop.width,
418966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].crop.height);
419066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            LOGD("Found offline reprocess roimap %dx%d %dx%d",
419166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].roi_map.left,
419266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].roi_map.top,
419366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].roi_map.width,
419466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    crop_data->crop_info[j].roi_map.height);
419566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
419666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            break;
419766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        }
419866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    }
419966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
420066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("No space to add reprocess stream crop/roi information");
420166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
420266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
420366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
420466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            IF_META_AVAILABLE(cam_cds_data_t, cdsInfo, CAM_INTF_META_CDS_DATA, meta) {
420566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                uint8_t cnt = cdsInfo->num_of_streams;
420666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (cnt <= MAX_NUM_STREAMS) {
420766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_stream_cds_info_t repro_cds_info;
420866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    memset(&repro_cds_info, 0, sizeof(repro_cds_info));
420966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    repro_cds_info.stream_id = mStreams[0]->getMyServerID();
421066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    for (size_t i = 0; i < cnt; i++) {
421166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        if (cdsInfo->cds_info[i].stream_id ==
421266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                pSrcStream->getMyServerID()) {
421366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            repro_cds_info.cds_enable =
421466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                    cdsInfo->cds_info[i].cds_enable;
421566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            break;
421666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        }
421766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    }
421866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cdsInfo->num_of_streams = 1;
421966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cdsInfo->cds_info[0] = repro_cds_info;
422066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
422166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    LOGE("No space to add reprocess stream cds information");
422266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
422366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
422466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
422566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            fwk_frame.input_buffer = *frame->bufs[i];
422666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            fwk_frame.metadata_buffer = *meta_buffer;
422766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            fwk_frame.output_buffer = pp_buffer->output;
422866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
422966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
423066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Source/Re-process streams are invalid");
423166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc |= BAD_VALUE;
423266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
423366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
423466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
423566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
423666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
423766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
423866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
423966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* FUNCTION : overrideFwkMetadata
424066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
424166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* DESCRIPTION: Override frameworks metadata such as crop, and CDS data.
424266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
424366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* PARAMETERS :
424466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* @frame : input frame for reprocessing
424566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*
424666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* RETURN : int32_t type of status
424766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* NO_ERROR -- success
424866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* none-zero failure code
424966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*==========================================================================*/
425066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::overrideFwkMetadata(
425166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        qcamera_fwk_input_pp_data_t *frame)
425266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
425366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == frame) {
425466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Incorrect input frame");
425566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
425666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
425766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
425866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == frame->metadata_buffer.buffer) {
425966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No metadata available");
426066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
426166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
426266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
426366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Find and insert crop info for reprocess stream
426466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    metadata_buffer_t *meta = (metadata_buffer_t *) frame->metadata_buffer.buffer;
426566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, meta) {
426666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (1 == crop_data->num_of_streams) {
426766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Store crop/roi information for offline reprocess
426866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // in the reprocess stream slot
426966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            crop_data->crop_info[crop_data->num_of_streams].crop =
427066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].crop;
427166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            crop_data->crop_info[crop_data->num_of_streams].roi_map =
427266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].roi_map;
427366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            crop_data->crop_info[crop_data->num_of_streams].stream_id =
427466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mStreams[0]->getMyServerID();
427566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            crop_data->num_of_streams++;
427666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
427766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGD("Reprocess stream server id: %d",
427866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     mStreams[0]->getMyServerID());
427966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGD("Found offline reprocess crop %dx%d %dx%d",
428066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].crop.left,
428166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].crop.top,
428266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].crop.width,
428366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].crop.height);
428466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGD("Found offline reprocess roi map %dx%d %dx%d",
428566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].roi_map.left,
428666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].roi_map.top,
428766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].roi_map.width,
428866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->crop_info[0].roi_map.height);
428966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
429066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Incorrect number of offline crop data entries %d",
429166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    crop_data->num_of_streams);
429266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return BAD_VALUE;
429366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
429466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
429566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGW("Crop data not present");
429666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
429766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
429866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    IF_META_AVAILABLE(cam_cds_data_t, cdsInfo, CAM_INTF_META_CDS_DATA, meta) {
429966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (1 == cdsInfo->num_of_streams) {
430066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cdsInfo->cds_info[0].stream_id = mStreams[0]->getMyServerID();
430166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
430266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Incorrect number of offline cds info entries %d",
430366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                     cdsInfo->num_of_streams);
430466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return BAD_VALUE;
430566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
430666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
430766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
430866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
430966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
431066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
431166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
431266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : doReprocessOffline
431366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
431466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do a reprocess on the frame
431566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
431666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
431766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @frame     : input frame for reprocessing
431866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @isPriorityFrame: Hint that this frame is of priority, equivalent to
431966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              real time, even though it is processed in offline mechanism
432066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
432166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
432266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
432366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
432466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
432566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t  QCamera3ReprocessChannel::doReprocessOffline(
432666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        qcamera_fwk_input_pp_data_t *frame, bool isPriorityFrame)
432766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
432866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
432966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int index;
433066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    OfflineBuffer mappedBuffer;
433166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
433266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_numStreams < 1) {
433366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No reprocess stream is created");
433466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
433566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
433666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
433766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == frame) {
433866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Incorrect input frame");
433966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
434066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
434166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
434266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == frame->metadata_buffer.buffer) {
434366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No metadata available");
434466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
434566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
434666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
434766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL == frame->input_buffer.buffer) {
434866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No input buffer available");
434966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
435066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
435166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
435266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((0 == m_numStreams) || (NULL == mStreams[0])) {
435366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Reprocess stream not initialized!");
435466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
435566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
435666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
435766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Stream *pStream = mStreams[0];
435866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
435966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //qbuf the output buffer if it was allocated by the framework
436066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mReprocessType != REPROCESS_TYPE_JPEG && frame->output_buffer != NULL) {
436166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(!m_bIsActive) {
436266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = registerBuffer(frame->output_buffer, mIsType);
436366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc) {
436466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("On-the-fly buffer registration failed %d",
436566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         rc);
436666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
436766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
436866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
436966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = start();
437066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc) {
437166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
437266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
437366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
437466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        index = mGrallocMemory.getMatchBufIndex((void*)frame->output_buffer);
437566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(index < 0) {
437666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = registerBuffer(frame->output_buffer, mIsType);
437766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (NO_ERROR != rc) {
437866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("On-the-fly buffer registration failed %d",
437966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                         rc);
438066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
438166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
438266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
438366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            index = mGrallocMemory.getMatchBufIndex((void*)frame->output_buffer);
438466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (index < 0) {
438566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Could not find object among registered buffers");
438666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return DEAD_OBJECT;
438766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
438866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
438966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = pStream->bufDone(index);
439066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(rc != NO_ERROR) {
439166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Failed to Q new buffer to stream");
439266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
439366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
439466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mGrallocMemory.markFrameNumber(index, frame->frameNumber);
439566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
439666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (mReprocessType == REPROCESS_TYPE_JPEG) {
439766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        Mutex::Autolock lock(mFreeBuffersLock);
439866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t bufIdx;
439966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (mFreeBufferList.empty()) {
440066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mMemory->allocateOne(mFrameLen);
440166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc < 0) {
440266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Failed allocating heap buffer. Fatal");
440366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return BAD_VALUE;
440466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
440566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                bufIdx = (uint32_t)rc;
440666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
440766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
440866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            bufIdx = *(mFreeBufferList.begin());
440966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mFreeBufferList.erase(mFreeBufferList.begin());
441066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
441166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
441266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory->markFrameNumber(bufIdx, frame->frameNumber);
441366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = pStream->bufDone(bufIdx);
441466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
441566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Failed to queue new buffer to stream");
441666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return rc;
441766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
441866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
441966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
442066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t max_idx = (int32_t) (mNumBuffers - 1);
442166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //loop back the indices if max burst count reached
442266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mOfflineBuffersIndex == max_idx) {
442366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       mOfflineBuffersIndex = -1;
442466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
442566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t buf_idx = (uint32_t)(mOfflineBuffersIndex + 1);
442666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = pStream->mapBuf(
442766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
442866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            buf_idx, -1,
442966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            frame->input_buffer.fd, frame->input_buffer.frame_len);
443066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR == rc) {
443166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.index = buf_idx;
443266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.stream = pStream;
443366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF;
443466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineBuffers.push_back(mappedBuffer);
443566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineBuffersIndex = (int32_t)buf_idx;
443666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("Mapped buffer with index %d", mOfflineBuffersIndex);
443766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
443866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
443966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    max_idx = (int32_t) ((mNumBuffers * 2) - 1);
444066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //loop back the indices if max burst count reached
444166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mOfflineMetaIndex == max_idx) {
444266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin       mOfflineMetaIndex = (int32_t) (mNumBuffers - 1);
444366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
444466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint32_t meta_buf_idx = (uint32_t)(mOfflineMetaIndex + 1);
444566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc |= pStream->mapBuf(
444666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF,
444766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            meta_buf_idx, -1,
444866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            frame->metadata_buffer.fd, frame->metadata_buffer.frame_len);
444966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NO_ERROR == rc) {
445066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.index = meta_buf_idx;
445166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.stream = pStream;
445266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF;
445366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineMetaBuffers.push_back(mappedBuffer);
445466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mOfflineMetaIndex = (int32_t)meta_buf_idx;
445566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("Mapped meta buffer with index %d", mOfflineMetaIndex);
445666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
445766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
445866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == NO_ERROR) {
445966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cam_stream_parm_buffer_t param;
446066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        uint32_t numPendingPriorityFrames = 0;
446166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
446266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(isPriorityFrame && (mReprocessType != REPROCESS_TYPE_JPEG)) {
446366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            Mutex::Autolock lock(mPriorityFramesLock);
446466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            /* read the length before pushing the frame number to check if
446566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin             * vector is empty */
446666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            numPendingPriorityFrames = mPriorityFrames.size();
446766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mPriorityFrames.push(frame->frameNumber);
446866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
446966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
447066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(isPriorityFrame && !numPendingPriorityFrames &&
447166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (mReprocessType != REPROCESS_TYPE_JPEG)) {
447266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
447366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.type = CAM_STREAM_PARAM_TYPE_REQUEST_OPS_MODE;
447466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.perf_mode = CAM_PERF_HIGH_PERFORMANCE;
447566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = pStream->setParameter(param);
447666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc != NO_ERROR) {
447766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ALOGE("%s: setParameter for CAM_PERF_HIGH_PERFORMANCE failed",
447866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    __func__);
447966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
448066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            {
448166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                Mutex::Autolock lock(mPriorityFramesLock);
448266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mReprocessPerfMode = true;
448366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
448466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
448566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
448666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
448766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
448866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.buf_index = buf_idx;
448966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.frame_idx = frame->input_buffer.frame_idx;
449066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.meta_present = 1;
449166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        param.reprocess.meta_buf_index = meta_buf_idx;
449266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
449366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGI("Offline reprocessing id = %d buf Id = %d meta index = %d",
449466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.reprocess.frame_idx, param.reprocess.buf_index,
449566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.reprocess.meta_buf_index);
449666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = pStream->setParameter(param);
449766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
449866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("stream setParameter for reprocess failed");
449966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            resetToCamPerfNormal(frame->frameNumber);
450066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
450166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
450266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Input buffer memory map failed: %d", rc);
450366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
450466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
450566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
450666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
450766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
450866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
450966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : doReprocess
451066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
451166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do a reprocess on the frame
451266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
451366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
451466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buf_fd     : fd to the input buffer that needs reprocess
451566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @buf_lenght : length of the input buffer
451666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @ret_val    : result of reprocess.
451766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *                 Example: Could be faceID in case of register face image.
451866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @meta_frame : metadata frame.
451966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
452066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
452166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
452266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
452366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
452466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::doReprocess(int buf_fd, size_t buf_length,
452566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t &ret_val, mm_camera_super_buf_t *meta_frame)
452666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
452766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
452866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (m_numStreams < 1) {
452966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No reprocess stream is created");
453066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
453166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
453266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (meta_frame == NULL) {
453366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Did not get corresponding metadata in time");
453466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -1;
453566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
453666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
453766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    uint8_t buf_idx = 0;
453866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (uint32_t i = 0; i < m_numStreams; i++) {
453966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
454066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 buf_idx, -1,
454166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                 buf_fd, buf_length);
454266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
454366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc == NO_ERROR) {
454466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            cam_stream_parm_buffer_t param;
454566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
454666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
454766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.buf_index = buf_idx;
454866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.meta_present = 1;
454966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.meta_stream_handle = m_pMetaChannel->mStreams[0]->getMyServerID();
455066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            param.reprocess.meta_buf_index = meta_frame->bufs[0]->buf_idx;
455166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
455266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGI("Online reprocessing id = %d buf Id = %d meta index = %d",
455366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.reprocess.frame_idx, param.reprocess.buf_index,
455466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    param.reprocess.meta_buf_index);
455566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = mStreams[i]->setParameter(param);
455666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc == NO_ERROR) {
455766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ret_val = param.reprocess.ret_val;
455866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
455966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
456066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                  buf_idx, -1);
456166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
456266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
456366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
456466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
456566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
456666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
456766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : addReprocStreamsFromSource
456866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
456966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add reprocess streams from input source channel
457066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
457166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
457266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @config         : pp feature configuration
457366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @src_config     : source reprocess configuration
457466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @isType         : type of image stabilization required on this stream
457566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @pMetaChannel   : ptr to metadata channel to get corresp. metadata
457666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
457766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
457866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
457966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
458066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
458166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
458266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3ReprocessChannel::addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config,
458366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        const reprocess_config_t &src_config , cam_is_type_t is_type,
458466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Channel *pMetaChannel)
458566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
458666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc = 0;
458766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_reproc_config_t reprocess_config;
458866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_stream_type_t streamType;
458966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
459066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_dimension_t streamDim = src_config.output_stream_dim;
459166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
459266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (NULL != src_config.src_channel) {
459366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3Stream *pSrcStream = src_config.src_channel->getStreamByIndex(0);
459466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (pSrcStream == NULL) {
459566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           LOGE("source channel doesn't have a stream");
459666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin           return BAD_VALUE;
459766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
459866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mSrcStreamHandles[m_numStreams] = pSrcStream->getMyHandle();
459966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
460066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
460166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    streamType = CAM_STREAM_TYPE_OFFLINE_PROC;
460266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config.pp_type = CAM_OFFLINE_REPROCESS_TYPE;
460366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
460466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config.offline.input_fmt = src_config.stream_format;
460566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config.offline.input_dim = src_config.input_stream_dim;
460666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config.offline.input_buf_planes.plane_info =
460766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            src_config.input_stream_plane_info.plane_info;
460866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config.offline.num_of_bufs = (uint8_t)mNumBuffers;
460966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config.offline.input_type = src_config.stream_type;
461066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
461166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reprocess_config.pp_feature_config = pp_config;
461266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera3Stream *pStream = new QCamera3Stream(m_camHandle,
461366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_handle,
461466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            m_camOps,
461566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            &mPaddingInfo,
461666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (QCamera3Channel*)this);
461766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (pStream == NULL) {
461866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("No mem for Stream");
461966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_MEMORY;
462066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
462166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
462266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = pStream->init(streamType, src_config.stream_format,
462366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            streamDim, ROTATE_0, &reprocess_config,
462466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (uint8_t)mNumBuffers,
462566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            reprocess_config.pp_feature_config.feature_mask,
462666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            is_type,
462766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            0,/* batchSize */
462866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera3Channel::streamCbRoutine, this);
462966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
463066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == 0) {
463166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreams[m_numStreams] = pStream;
463266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_numStreams++;
463366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
463466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("failed to create reprocess stream");
463566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete pStream;
463666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
463766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
463866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc == NO_ERROR) {
463966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_pSrcChannel = src_config.src_channel;
464066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        m_pMetaChannel = pMetaChannel;
464166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mReprocessType = src_config.reprocess_type;
464266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGD("mReprocessType is %d", mReprocessType);
464366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
464466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mm_camera_req_buf_t buf;
464566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memset(&buf, 0x0, sizeof(buf));
464666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buf.type = MM_CAMERA_REQ_SUPER_BUF;
464766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    buf.num_buf_requested = 1;
464866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(m_camOps->request_super_buf(m_camHandle,m_handle, &buf) < 0) {
464966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Request for super buffer failed");
465066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
465166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
465266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
465366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
465466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* QCamera3SupportChannel methods */
465566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
465666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjincam_dimension_t QCamera3SupportChannel::kDim = {640, 480};
465766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
465866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3SupportChannel::QCamera3SupportChannel(uint32_t cam_handle,
465966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t channel_handle,
466066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mm_camera_ops_t *cam_ops,
466166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_padding_info_t *paddingInfo,
466266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint32_t postprocess_mask,
466366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_stream_type_t streamType,
466466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_dimension_t *dim,
466566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    cam_format_t streamFormat,
466666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    uint8_t hw_analysis_supported,
466766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    void *userData, uint32_t numBuffers) :
466866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3Channel(cam_handle, channel_handle, cam_ops,
466966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                NULL, paddingInfo, postprocess_mask,
467066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                userData, numBuffers),
467166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mMemory(NULL)
467266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
467366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    memcpy(&mDim, dim, sizeof(cam_dimension_t));
467466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mStreamType = streamType;
467566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mStreamFormat = streamFormat;
467666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   // Make Analysis same as Preview format
467766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   if (!hw_analysis_supported && mStreamType == CAM_STREAM_TYPE_ANALYSIS) {
467866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mStreamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_PREVIEW);
467966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin   }
468066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
468166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
468266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3SupportChannel::~QCamera3SupportChannel()
468366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
468466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    destroy();
468566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
468666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mMemory) {
468766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory->deallocate();
468866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete mMemory;
468966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory = NULL;
469066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
469166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
469266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
469366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3SupportChannel::initialize(cam_is_type_t isType)
469466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
469566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int32_t rc;
469666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
469766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (mMemory || m_numStreams > 0) {
469866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("metadata channel already initialized");
469966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -EINVAL;
470066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
470166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
470266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mIsType = isType;
470366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCamera3Channel::addStream(mStreamType,
470466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mStreamFormat, mDim, ROTATE_0, MIN_STREAMING_BUFFER_NUM,
470566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            mPostProcMask, mIsType);
470666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
470766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("addStream failed");
470866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
470966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
471066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
471166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
471266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCamera3SupportChannel::request(buffer_handle_t * /*buffer*/,
471366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                                                uint32_t /*frameNumber*/)
471466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
471566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NO_ERROR;
471666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
471766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
471866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3SupportChannel::streamCbRoutine(
471966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        mm_camera_super_buf_t *super_frame,
472066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        QCamera3Stream * /*stream*/)
472166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
472266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (super_frame == NULL || super_frame->num_bufs != 1) {
472366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("super_frame is not valid");
472466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return;
472566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
472666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bufDone(super_frame);
472766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    free(super_frame);
472866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
472966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
473066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera3StreamMem* QCamera3SupportChannel::getStreamBufs(uint32_t len)
473166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
473266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc;
473366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory = new QCamera3StreamMem(mNumBuffers);
473466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mMemory) {
473566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("unable to create heap memory");
473666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
473766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
473866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = mMemory->allocateAll(len);
473966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc < 0) {
474066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("unable to allocate heap memory");
474166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete mMemory;
474266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mMemory = NULL;
474366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NULL;
474466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
474566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return mMemory;
474666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
474766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
474866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCamera3SupportChannel::putStreamBufs()
474966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
475066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory->deallocate();
475166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    delete mMemory;
475266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mMemory = NULL;
475366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
475466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
475566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera
4756