13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*/
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QCamera3Channel"
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// To remove
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <cutils/properties.h>
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <fcntl.h>
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdio.h>
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdlib.h>
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "hardware/gralloc.h"
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Timers.h>
42fd5889fd30b649b3b881f6948e970c38fc1a2e1aVineeta Srivastava#include <sys/stat.h>
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3Channel.h"
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3HWI.h"
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraTrace.h"
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraFormat.h"
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" {
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h"
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace android;
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera {
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define IS_BUFFER_ERROR(x) (((x) & V4L2_BUF_FLAG_ERROR) == V4L2_BUF_FLAG_ERROR)
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3Channel
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constrcutor of QCamera3Channel
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
693d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3Channel::QCamera3Channel(uint32_t cam_handle,
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               uint32_t channel_handle,
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               mm_camera_ops_t *cam_ops,
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               channel_cb_routine cb_routine,
73c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                               channel_cb_buffer_err cb_buffer_err,
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               cam_padding_info_t *paddingInfo,
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               cam_feature_mask_t postprocess_mask,
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                               void *userData, uint32_t numBuffers)
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camHandle = cam_handle;
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_handle = channel_handle;
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_camOps = cam_ops;
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bIsActive = false;
822896d129511c499aef15b8162df05fa299860f59Thierry Strudel    m_bUBWCenable = true;
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_numStreams = 0;
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(mStreams, 0, sizeof(mStreams));
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mUserData = userData;
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mStreamInfoBuf = NULL;
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mChannelCB = cb_routine;
90c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    mChannelCbBufErr = cb_buffer_err;
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPaddingInfo = *paddingInfo;
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPaddingInfo.offset_info.offset_x = 0;
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPaddingInfo.offset_info.offset_y = 0;
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPostProcMask = postprocess_mask;
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = IS_TYPE_NONE;
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mNumBuffers = numBuffers;
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPerFrameMapUnmapEnable = true;
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mDumpFrmCnt = 0;
10149c4c6b9370de83553cb9f8bc59de058c540b4cbEmilian Peev    mNRMode = 0;
102b57ec91d8ef780748a0071b466632a8b64cf4e59Shuzhen Wang
103b57ec91d8ef780748a0071b466632a8b64cf4e59Shuzhen Wang    mYUVDump = property_get_int32("persist.camera.dumpimg", 0);
104063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang    mMapStreamBuffers = mYUVDump;
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCamera3Channel
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCamera3Channel
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3Channel::~QCamera3Channel()
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : destroy
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: internal destructor of QCamera3Channel called by the subclasses
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              this destructor will call pure virtual functions.  stop will eventuall call
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCamera3Stream::putBufs.  The putBufs function will
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              call QCamera3Channel::putStreamBufs which is pure virtual
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3Channel::destroy()
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_bIsActive)
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stop();
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mStreams[i] != NULL) {
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            delete mStreams[i];
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreams[i] = 0;
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_numStreams = 0;
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : addStream
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: add a stream into channel
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamType     : stream type
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamFormat   : stream format
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamDim      : stream dimension
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamRotation : rotation of the stream
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @minStreamBufNum : minimal buffer count for particular stream type
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @postprocessMask : post-proccess feature mask
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @isType         : type of image stabilization required on the stream
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::addStream(cam_stream_type_t streamType,
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  cam_format_t streamFormat,
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  cam_dimension_t streamDim,
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  cam_rotation_t streamRotation,
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  uint8_t minStreamBufNum,
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  cam_feature_mask_t postprocessMask,
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  cam_is_type_t isType,
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  uint32_t batchSize)
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_numStreams >= 1) {
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Only one stream per channel supported in v3 Hal");
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_numStreams >= MAX_STREAM_NUM_IN_BUNDLE) {
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("stream number (%d) exceeds max limit (%d)",
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               m_numStreams, MAX_STREAM_NUM_IN_BUNDLE);
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Stream *pStream = new QCamera3Stream(m_camHandle,
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               m_handle,
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               m_camOps,
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                               &mPaddingInfo,
189063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang                                               this,
190063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang                                               mMapStreamBuffers);
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (pStream == NULL) {
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No mem for Stream");
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_MEMORY;
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("batch size is %d", batchSize);
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = pStream->init(streamType, streamFormat, streamDim, streamRotation,
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            NULL, minStreamBufNum, postprocessMask, isType, batchSize,
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamCbRoutine, this);
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == 0) {
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mStreams[m_numStreams] = pStream;
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_numStreams++;
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete pStream;
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : start
2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: start channel, which will start all streams belong to this channel
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::start()
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
222e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_CH_START);
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_numStreams > 1) {
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("bundle not supported");
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (m_numStreams == 0) {
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(m_bIsActive) {
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Attempt to start active channel");
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mStreams[i] != NULL) {
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreams[i]->start();
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bIsActive = true;
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stop
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop a channel, which will stop all streams belong to this channel
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::stop()
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
260e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_CH_STOP);
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!m_bIsActive) {
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Attempt to stop inactive channel");
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mStreams[i] != NULL) {
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreams[i]->stop();
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bIsActive = false;
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setBatchSize
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Set batch size for the channel. This is a dummy implementation
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              for the base class
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @batchSize  : Number of image buffers in a batch
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success always
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::setBatchSize(uint32_t batchSize)
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("Dummy method. batchSize: %d unused ", batchSize);
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : queueBatchBuf
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: This is a dummy implementation for the base class
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success always
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::queueBatchBuf()
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("Dummy method. Unused ");
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setPerFrameMapUnmap
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Sets internal enable flag
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @enable : Bool value for the enable flag
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success always
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::setPerFrameMapUnmap(bool enable)
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPerFrameMapUnmapEnable = enable;
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : flush
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush a channel
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::flush()
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
344e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_CH_FLUSH);
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : bufDone
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return a stream buf back to kernel
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @recvd_frame  : stream buf frame to be returned
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::bufDone(mm_camera_super_buf_t *recvd_frame)
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) {
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         if (recvd_frame->bufs[i] != NULL) {
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             for (uint32_t j = 0; j < m_numStreams; j++) {
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 if (mStreams[j] != NULL &&
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     mStreams[j]->getMyHandle() == recvd_frame->bufs[i]->stream_id) {
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx);
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     break; // break loop j
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 }
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             }
3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         }
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3Channel::setBundleInfo(const cam_bundle_config_t &bundleInfo)
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_parm_buffer_t param;
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    param.type = CAM_STREAM_PARAM_TYPE_SET_BUNDLE_INFO;
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    param.bundleInfo = bundleInfo;
385295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel    if (m_numStreams > 0 && mStreams[0]) {
386295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel        rc = mStreams[0]->setParameter(param);
387295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel        if (rc != NO_ERROR) {
388295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            LOGE("stream setParameter for set bundle failed");
389295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel        }
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamTypeMask
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Get bit mask of all stream types in this channel
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : Bit mask of all stream types in this channel
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint32_t QCamera3Channel::getStreamTypeMask()
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t mask = 0;
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       mask |= (1U << mStreams[i]->getMyType());
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return mask;
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamID
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Get StreamID of requested stream type
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : streamMask
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : Stream ID
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint32_t QCamera3Channel::getStreamID(uint32_t streamMask)
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t streamID = 0;
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (streamMask == (uint32_t )(0x1 << mStreams[i]->getMyType())) {
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamID = mStreams[i]->getMyServerID();
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return streamID;
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamByHandle
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by stream handle
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamHandle : stream handle
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : stream object. NULL if not found
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3Stream *QCamera3Channel::getStreamByHandle(uint32_t streamHandle)
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mStreams[i] != NULL && mStreams[i]->getMyHandle() == streamHandle) {
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return mStreams[i];
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamByIndex
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by index
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamHandle : stream handle
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : stream object. NULL if not found
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4633d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3Stream *QCamera3Channel::getStreamByIndex(uint32_t index)
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (index < m_numStreams) {
4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return mStreams[index];
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : streamCbRoutine
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback routine for stream
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @streamHandle : stream handle
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : stream object. NULL if not found
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3Channel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                QCamera3Stream *stream, void *userdata)
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Channel *channel = (QCamera3Channel *)userdata;
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (channel == NULL) {
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("invalid channel pointer");
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    channel->streamCbRoutine(super_frame, stream);
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : dumpYUV
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: function to dump the YUV data from ISP/pproc
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame   : frame to be dumped
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @dim     : dimension of the stream
5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @offset  : offset of the data
5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @name    : 1 if it is ISP output/pproc input, 2 if it is pproc output
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN  :
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3Channel::dumpYUV(mm_camera_buf_def_t *frame, cam_dimension_t dim,
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_frame_len_offset_t offset, uint8_t dump_type)
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char buf[FILENAME_MAX];
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(buf, 0, sizeof(buf));
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    static int counter = 0;
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mYUVDump & dump_type) {
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFrmNum = ((mYUVDump & 0xffff0000) >> 16);
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mFrmNum == 0) {
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFrmNum = 10;
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mFrmNum > 256) {
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFrmNum = 256;
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mSkipMode = ((mYUVDump & 0x0000ff00) >> 8);
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mSkipMode == 0) {
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mSkipMode = 1;
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mDumpSkipCnt == 0) {
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mDumpSkipCnt = 1;
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mDumpSkipCnt % mSkipMode == 0) {
527cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            if (mDumpFrmCnt < mFrmNum) {
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                /* Note that the image dimension will be the unrotated stream dimension.
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                * If you feel that the image would have been rotated during reprocess
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                * then swap the dimensions while opening the file
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                * */
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                switch (dump_type) {
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    case QCAMERA_DUMP_FRM_PREVIEW:
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"p_%d_%d_%dx%d.yuv",
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            counter, frame->frame_idx, dim.width, dim.height);
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break;
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    case QCAMERA_DUMP_FRM_VIDEO:
5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"v_%d_%d_%dx%d.yuv",
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            counter, frame->frame_idx, dim.width, dim.height);
5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break;
541cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    case QCAMERA_DUMP_FRM_INPUT_JPEG:
5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"s_%d_%d_%dx%d.yuv",
5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            counter, frame->frame_idx, dim.width, dim.height);
5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break;
5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    case QCAMERA_DUMP_FRM_INPUT_REPROCESS:
5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"ir_%d_%d_%dx%d.yuv",
5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            counter, frame->frame_idx, dim.width, dim.height);
5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break;
5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    case QCAMERA_DUMP_FRM_CALLBACK:
5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"c_%d_%d_%dx%d.yuv",
5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            counter, frame->frame_idx, dim.width, dim.height);
5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break;
553cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    case QCAMERA_DUMP_FRM_OUTPUT_JPEG:
554cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"j_%d_%d_%dx%d.jpg",
555cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                            counter, frame->frame_idx, dim.width, dim.height);
556cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    break;
5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    default :
5583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        LOGE("dumping not enabled for stream type %d",dump_type);
5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    break;
5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                counter++;
5623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                int file_fd = open(buf, O_RDWR | O_CREAT, 0777);
5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ssize_t written_len = 0;
5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (file_fd >= 0) {
5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    void *data = NULL;
5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    fchmod(file_fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
567cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    if( dump_type == QCAMERA_DUMP_FRM_OUTPUT_JPEG ) {
568cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        written_len = write(file_fd, frame->buffer, frame->frame_len);
569cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    }
570cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    else {
571cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                        for (uint32_t i = 0; i < offset.num_planes; i++) {
572cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                            uint32_t index = offset.mp[i].offset;
573cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                            if (i > 0) {
574cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                                index += offset.mp[i-1].len;
575cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                            }
576cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                            for (int j = 0; j < offset.mp[i].height; j++) {
577cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                                data = (void *)((uint8_t *)frame->buffer + index);
578cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                                written_len += write(file_fd, data,
579cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                                        (size_t)offset.mp[i].width);
580cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                                index += (uint32_t)offset.mp[i].stride;
581cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                            }
5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGH("written number of bytes %ld\n", written_len);
5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mDumpFrmCnt++;
586295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                    frame->cache_flags |= CPU_HAS_READ;
5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    close(file_fd);
5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("failed to open file to dump image");
5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mDumpSkipCnt++;
5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : isUBWCEnabled
6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Function to get UBWC hardware support.
6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : TRUE -- UBWC format supported
6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              FALSE -- UBWC is not supported.
6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCamera3Channel::isUBWCEnabled()
6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifdef UBWC_PRESENT
6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char value[PROPERTY_VALUE_MAX];
6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int prop_value = 0;
6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(value, 0, sizeof(value));
6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("debug.gralloc.gfx_ubwc_disable", value, "0");
6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    prop_value = atoi(value);
6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (prop_value) {
6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return FALSE;
6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Disable UBWC if Eztune is enabled
6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //EzTune process CPP output frame and cannot understand UBWC.
6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(value, 0, sizeof(value));
6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.eztune.enable", value, "0");
6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    prop_value = atoi(value);
6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (prop_value) {
6263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return FALSE;
6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return TRUE;
6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#else
6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return FALSE;
6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
6352896d129511c499aef15b8162df05fa299860f59Thierry Strudel * FUNCTION   : setUBWCEnabled
6362896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
6372896d129511c499aef15b8162df05fa299860f59Thierry Strudel * DESCRIPTION: set UBWC enable
6382896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
6392896d129511c499aef15b8162df05fa299860f59Thierry Strudel * PARAMETERS : UBWC enable value
6402896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
6412896d129511c499aef15b8162df05fa299860f59Thierry Strudel * RETURN     : none
6422896d129511c499aef15b8162df05fa299860f59Thierry Strudel *
6432896d129511c499aef15b8162df05fa299860f59Thierry Strudel *==========================================================================*/
6442896d129511c499aef15b8162df05fa299860f59Thierry Strudelvoid QCamera3Channel::setUBWCEnabled(bool val)
6452896d129511c499aef15b8162df05fa299860f59Thierry Strudel{
6462896d129511c499aef15b8162df05fa299860f59Thierry Strudel    m_bUBWCenable = val;
6472896d129511c499aef15b8162df05fa299860f59Thierry Strudel}
6482896d129511c499aef15b8162df05fa299860f59Thierry Strudel
6492896d129511c499aef15b8162df05fa299860f59Thierry Strudel/*===========================================================================
6503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamDefaultFormat
6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return default buffer format for the stream
6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : type : Stream type
6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ** RETURN    : format for stream type
6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
659cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudelcam_format_t QCamera3Channel::getStreamDefaultFormat(cam_stream_type_t type,
660c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee        uint32_t width, uint32_t height, bool forcePreviewUBWC, cam_is_type_t isType)
6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_format_t streamFormat;
6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (type) {
6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case CAM_STREAM_TYPE_PREVIEW:
6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (isUBWCEnabled()) {
667e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin
6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            char prop[PROPERTY_VALUE_MAX];
6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int pFormat;
6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(prop, 0, sizeof(prop));
6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            property_get("persist.camera.preview.ubwc", prop, "1");
6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pFormat = atoi(prop);
673e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin
674e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            // When goog_zoom is linked to the preview stream, disable ubwc to preview
675e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            property_get("persist.camera.gzoom.at", prop, "0");
676c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee            bool is_goog_zoom_preview_enabled = ((atoi(prop) & 2) > 0) && isType == IS_TYPE_EIS_3_0;
677e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin
678e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            if (pFormat == 1 && forcePreviewUBWC && !is_goog_zoom_preview_enabled) {
6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamFormat = CAM_FORMAT_YUV_420_NV12_UBWC;
6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                /* Changed to macro to ensure format sent to gralloc for preview
6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                is also changed if the preview format is changed at camera HAL */
6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamFormat = PREVIEW_STREAM_FORMAT;
6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            /* Changed to macro to ensure format sent to gralloc for preview
6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            is also changed if the preview format is changed at camera HAL */
6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamFormat = PREVIEW_STREAM_FORMAT;
6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
6913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case CAM_STREAM_TYPE_VIDEO:
692cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    {
693cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        /* Disable UBWC for smaller video resolutions due to CPP downscale
694cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            limits. Refer cpp_hw_params.h::CPP_DOWNSCALE_LIMIT_UBWC */
695cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if (isUBWCEnabled() && (width >= 640) && (height >= 480)) {
696e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            // When goog_zoom is linked to the video stream, disable ubwc to video
697e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            char prop[PROPERTY_VALUE_MAX];
698e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            property_get("persist.camera.gzoom.at", prop, "0");
699c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee            bool is_goog_zoom_video_enabled = ((atoi(prop) & 1) > 0) && isType == IS_TYPE_EIS_3_0;
700e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin
701e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            property_get("persist.camera.gzoom.4k", prop, "0");
702e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            bool is_goog_zoom_4k_enabled = (atoi(prop) > 0);
703e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            bool is_4k_video = (width >= 3840 && height >= 2160);
704e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin
705e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin            if ((QCameraCommon::isVideoUBWCEnabled()) && (!is_goog_zoom_video_enabled
706e406f0651aa47921c568dfcb28d2227c6648b782Binhao Lin                    || (is_4k_video && !is_goog_zoom_4k_enabled))) {
7073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamFormat = CAM_FORMAT_YUV_420_NV12_UBWC;
7083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
7093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamFormat = CAM_FORMAT_YUV_420_NV12_VENUS;
7103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
7113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
7123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#if VENUS_PRESENT
7133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        streamFormat = CAM_FORMAT_YUV_420_NV12_VENUS;
7143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#else
7153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        streamFormat = CAM_FORMAT_YUV_420_NV12;
7163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
7173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
719cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    }
7203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case CAM_STREAM_TYPE_SNAPSHOT:
7213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        streamFormat = CAM_FORMAT_YUV_420_NV21;
7223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
7233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case CAM_STREAM_TYPE_CALLBACK:
7243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        /* Changed to macro to ensure format sent to gralloc for callback
7253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        is also changed if the preview format is changed at camera HAL */
7263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        streamFormat = CALLBACK_STREAM_FORMAT;
7273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
7283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    case CAM_STREAM_TYPE_RAW:
7293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        streamFormat = CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG;
7303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
7313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    default:
7323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        streamFormat = CAM_FORMAT_YUV_420_NV21;
7333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
7343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
7353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return streamFormat;
7363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
7373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3ProcessingChannel methods */
7403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
7423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3ProcessingChannel
7433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCamera3ProcessingChannel
7453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
7473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
7483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
7493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cb_routine : callback routine to frame aggregator
7503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @paddingInfo: stream padding info
7513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @userData   : HWI handle
7523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream     : camera3_stream_t structure
7533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream_type: Channel stream type
7543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @postprocess_mask: the postprocess mask for streams of this channel
7553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @metadataChannel: handle to the metadataChannel
7563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @numBuffers : number of max dequeued buffers
7573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
7583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
7593d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3ProcessingChannel::QCamera3ProcessingChannel(uint32_t cam_handle,
7603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t channel_handle,
7613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_ops_t *cam_ops,
7623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        channel_cb_routine cb_routine,
763c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        channel_cb_buffer_err cb_buffer_err,
7643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_padding_info_t *paddingInfo,
7653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *userData,
7663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_t *stream,
7673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_stream_type_t stream_type,
7683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_feature_mask_t postprocess_mask,
7693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Channel *metadataChannel,
7703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t numBuffers) :
7713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera3Channel(cam_handle, channel_handle, cam_ops, cb_routine,
772c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    cb_buffer_err, paddingInfo, postprocess_mask, userData, numBuffers),
7733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_postprocessor(this),
7743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFrameCount(0),
7753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mLastFrameCount(0),
7763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mLastFpsTime(0),
7773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mMemory(numBuffers),
7783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mCamera3Stream(stream),
7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mNumBufs(CAM_MAX_NUM_BUFS_PER_STREAM),
7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreamType(stream_type),
7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mPostProcStarted(false),
782f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen            mReprocessType(REPROCESS_TYPE_NONE),
7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mInputBufferConfig(false),
7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pMetaChannel(metadataChannel),
7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mMetaFrame(NULL),
7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mOfflineMemory(0),
7873c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            mOfflineMetaMemory(numBuffers + (MAX_REPROCESS_PIPELINE_STAGES - 1))
7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
7893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char prop[PROPERTY_VALUE_MAX];
7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.debug.sf.showfps", prop, "0");
7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mDebugFPS = (uint8_t) atoi(prop);
7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = m_postprocessor.init(&mMemory);
7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != 0) {
7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Init Postprocessor failed");
7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCamera3ProcessingChannel
8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCamera3ProcessingChannel
8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
8053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8083d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3ProcessingChannel::~QCamera3ProcessingChannel()
8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    destroy();
8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = m_postprocessor.deinit();
8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != 0) {
8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("De-init Postprocessor failed");
8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 < mOfflineMetaMemory.getCnt()) {
8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineMetaMemory.deallocate();
8193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 < mOfflineMemory.getCnt()) {
8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineMemory.unregisterBuffers();
8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : streamCbRoutine
8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION:
8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : the super frame with filled buffer
8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream      : stream on which the buffer was requested and filled
8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ProcessingChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
8383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *stream)
8393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8409ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel    if (mStreamType == CAM_STREAM_TYPE_PREVIEW) {
8419ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel        KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_PREVIEW_STRM_CB);
8429ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel    } else {
8439ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel        ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_PROC_CH_STRM_CB);
8449ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel    }
8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //FIXME Q Buf back in case of error?
8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t frameIndex;
8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    buffer_handle_t *resultBuffer;
8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t resultFrameNumber;
8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera3_stream_buffer_t result;
8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t dim;
8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_frame_len_offset_t offset;
8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&dim, 0, sizeof(dim));
8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&offset, 0, sizeof(cam_frame_len_offset_t));
8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (checkStreamCbErrors(super_frame, stream) != NO_ERROR) {
8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error with the stream callback");
8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
8583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
8613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(frameIndex >= mNumBufs) {
8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Error, Invalid index for buffer");
8633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         stream->bufDone(frameIndex);
8643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return;
8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mDebugFPS) {
8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        showDebugFPS(stream->getMyType());
8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    stream->getFrameDimension(dim);
8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    stream->getFrameOffset(offset);
8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (stream->getMyType() == CAM_STREAM_TYPE_PREVIEW) {
8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        dumpYUV(super_frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_PREVIEW);
8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (stream->getMyType() == CAM_STREAM_TYPE_VIDEO) {
8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        dumpYUV(super_frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_VIDEO);
8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (stream->getMyType() == CAM_STREAM_TYPE_CALLBACK) {
8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        dumpYUV(super_frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_CALLBACK);
8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
880c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    do {
881c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
882c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       //Use below data to issue framework callback
883c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       resultBuffer = (buffer_handle_t *)mMemory.getBufferHandle(frameIndex);
884c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       resultFrameNumber = mMemory.getFrameNumber(frameIndex);
885c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       uint32_t oldestBufIndex;
886c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       int32_t lowestFrameNumber = mMemory.getOldestFrameNumber(oldestBufIndex);
887c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)mUserData;
888c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       if ((lowestFrameNumber != -1 ) && (lowestFrameNumber < resultFrameNumber) &&
889c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            hal_obj->mOpMode != CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE) {
890c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           LOGE("Error buffer dropped for framenumber:%d with bufidx:%d",
891c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                   lowestFrameNumber, oldestBufIndex);
892c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           if (mOutOfSequenceBuffers.empty()) {
893c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel              stream->cancelBuffer(oldestBufIndex);
894c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           }
895932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen
896932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen           //push in order!
897932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen           auto itr = mOutOfSequenceBuffers.begin();
898932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen           for (; itr != mOutOfSequenceBuffers.end(); itr++) {
899932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               mm_camera_super_buf_t *super_buf = *itr;
900932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               uint32_t buf_idx = super_buf->bufs[0]->buf_idx;
901932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               int32_t frame_num = mMemory.getFrameNumber(buf_idx);
902932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               if (resultFrameNumber < frame_num) {
903932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen                   LOGE("Out of order frame!! set buffer status error flag!");
904932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen                   mOutOfSequenceBuffers.insert(itr, super_frame);
905932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen                   super_buf->bufs[0]->flags |= V4L2_BUF_FLAG_ERROR;
906932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen                   break;
907932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               }
908932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen           }
909932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen
910932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen           if (itr == mOutOfSequenceBuffers.end()) {
911932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               LOGE("Add the frame to the end of mOutOfSequenceBuffers");
912932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               // add the buffer
913932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen               mOutOfSequenceBuffers.push_back(super_frame);
914932756c18084a3ec2480578040d125ecea8337f3Gaoxiang Chen           }
915c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           return;
916c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       }
9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
91854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel       if(hal_obj->mStreamConfig == true) {
91954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel          switch (stream->getMyType()) {
92054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel              case CAM_STREAM_TYPE_PREVIEW:
92154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel                  LOGH("[KPI Perf] : PROFILE_FIRST_PREVIEW_FRAME");
92254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel                  break;
92354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel              case CAM_STREAM_TYPE_VIDEO:
92454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel                  LOGH("[KPI Perf] : PROFILE_FIRST_VIDEO_FRAME");
92554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel                  break;
92654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel              default:
92754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel                  break;
92854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel          }
92954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel          hal_obj->mStreamConfig = false;
93054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel       }
93154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel
932c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       result.stream = mCamera3Stream;
933c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       result.buffer = resultBuffer;
934c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       if (IS_BUFFER_ERROR(super_frame->bufs[0]->flags)) {
935c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           result.status = CAMERA3_BUFFER_STATUS_ERROR;
936c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           LOGW("CAMERA3_BUFFER_STATUS_ERROR for stream_type: %d",
937c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                   mStreams[0]->getMyType());
938c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           mChannelCbBufErr(this, resultFrameNumber, CAMERA3_BUFFER_STATUS_ERROR, mUserData);
939c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       } else {
940c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           result.status = CAMERA3_BUFFER_STATUS_OK;
941c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       }
942c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       result.acquire_fence = -1;
943c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       result.release_fence = -1;
944c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       if(mPerFrameMapUnmapEnable) {
945c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           int32_t rc = stream->bufRelease(frameIndex);
946c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           if (NO_ERROR != rc) {
947c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel               LOGE("Error %d releasing stream buffer %d",
948c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                        rc, frameIndex);
949c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           }
9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
951c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           rc = mMemory.unregisterBuffer(frameIndex);
952c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           if (NO_ERROR != rc) {
953c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel               LOGE("Error %d unregistering stream buffer %d",
954c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                        rc, frameIndex);
955c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           }
956c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       }
957c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
958c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       if (0 <= resultFrameNumber) {
959c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           if (mChannelCB) {
960c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel               mChannelCB(NULL, &result, (uint32_t)resultFrameNumber, false, mUserData);
961c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           }
962c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       } else {
963c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel           LOGE("Bad frame number");
964c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       }
965c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       free(super_frame);
966c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       super_frame = NULL;
967c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       if (mOutOfSequenceBuffers.empty()) {
968c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel          break;
969c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel       } else {
970c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            auto itr = mOutOfSequenceBuffers.begin();
971c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            super_frame = *itr;
972c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            frameIndex = super_frame->bufs[0]->buf_idx;
973c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            resultFrameNumber = mMemory.getFrameNumber(frameIndex);
974c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            lowestFrameNumber = mMemory.getOldestFrameNumber(oldestBufIndex);
975c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            LOGE("Attempting to recover next frame: result Frame#: %d, resultIdx: %d, "
976c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    "Lowest Frame#: %d, oldestBufIndex: %d",
977c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    resultFrameNumber, frameIndex, lowestFrameNumber, oldestBufIndex);
978c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            if ((lowestFrameNumber != -1) && (lowestFrameNumber < resultFrameNumber)) {
979c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                LOGE("Multiple frame dropped requesting cancel for frame %d, idx:%d",
980c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                        lowestFrameNumber, oldestBufIndex);
981c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                stream->cancelBuffer(oldestBufIndex);
982c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                return;
983c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel             } else if (lowestFrameNumber == resultFrameNumber) {
984c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                LOGE("Time to flush out head of list continue loop with this new super frame");
985c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                itr = mOutOfSequenceBuffers.erase(itr);
986c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel             } else {
987c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                LOGE("Unexpected condition head of list is not the lowest frame number");
988c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                itr = mOutOfSequenceBuffers.erase(itr);
989c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel             }
990c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel          }
991c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    } while (1);
9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : putStreamBufs
9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: release the buffers allocated to the stream
9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : NONE
10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NONE
10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3YUVChannel::putStreamBufs()
10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3ProcessingChannel::putStreamBufs();
10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Free allocated heap buffer.
10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory.deallocate();
10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Clear free heap buffer list.
10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mFreeHeapBufferList.clear();
10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Clear offlinePpInfoList
10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mOfflinePpInfoList.clear();
10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1017c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * FUNCTION   : timeoutFrame
1018c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
1019c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * DESCRIPTION: Method to indicate to channel that a given frame has take too
1020c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *              long to be generated
1021c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
1022c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * PARAMETERS : framenumber indicating the framenumber of the buffer timingout
1023c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
1024c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * RETURN     : int32_t type of status
1025c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *              NO_ERROR  -- success
1026c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *              none-zero failure code
1027c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *==========================================================================*/
1028c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudelint32_t QCamera3ProcessingChannel::timeoutFrame(uint32_t frameNumber)
1029c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel{
1030c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    int32_t bufIdx;
1031c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
1032c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    bufIdx = mMemory.getBufferIndex(frameNumber);
1033c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
1034c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    if (bufIdx < 0) {
1035c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        LOGE("%s: Buffer not found for frame:%d", __func__, frameNumber);
1036c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        return -1;
1037c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    }
1038c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
1039c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    mStreams[0]->timeoutFrame(bufIdx);
1040c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    return NO_ERROR;
1041c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel}
1042c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
1043c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel/*===========================================================================
104440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * FUNCTION   : postprocFail
104540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *
104640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * DESCRIPTION: notify clients about failing post-process requests.
104740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *
104840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * PARAMETERS :
104940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * @ppBuffer  : pointer to the pp buffer.
105040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *
105140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * RETURN     : 0 on success
105240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *              -EINVAL on invalid input
105340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *==========================================================================*/
105440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peevint32_t QCamera3ProcessingChannel::postprocFail(qcamera_hal3_pp_buffer_t *ppBuffer) {
105540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    if (ppBuffer == nullptr) {
105640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        return BAD_VALUE;
105740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    }
105840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
105940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    if (ppBuffer->output == nullptr) {
106040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        return BAD_VALUE;
106140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    }
106240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
106340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    camera3_stream_buffer_t result = {};
106440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    result.buffer = ppBuffer->output;
106540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
106640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    LOGE("Input frame number: %d dropped!", ppBuffer->frameNumber);
106740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    result.stream = mCamera3Stream;
106840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    result.status = CAMERA3_BUFFER_STATUS_ERROR;
106940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    result.acquire_fence = -1;
107040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    result.release_fence = -1;
107140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    if (mChannelCB) {
107240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        mChannelCB(NULL, &result, ppBuffer->frameNumber, false, mUserData);
107340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    }
107440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
107540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    return OK;
107640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev}
107740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
107840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev/*===========================================================================
10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : request
10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: handle the request - either with an input buffer or a direct
10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              output request
10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buffer          : pointer to the output buffer
10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frameNumber     : frame number of the request
10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pInputBuffer    : pointer to input buffer if an input request
10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata        : parameters associated with the request
1089e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel * @internalreq      : boolean to indicate if this is purely internal request
1090e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel *                    needing internal buffer allocation
1091e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel * @meteringonly    : boolean indicating metering only frame subset of internal
1092e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel *                    not consumed by postprocessor
10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : 0 on a success start of capture
10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -EINVAL on invalid input
10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -ENODEV on serious error
10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::request(buffer_handle_t *buffer,
10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t frameNumber,
11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_buffer_t* pInputBuffer,
1101c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        metadata_buffer_t* metadata,
1102e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        int &indexUsed,
1103e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        __unused bool internalRequest = false,
1104e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        __unused bool meteringOnly = false)
11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int index;
11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == buffer || NULL == metadata) {
11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid buffer/metadata in channel request");
11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (pInputBuffer) {
11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        //need to send to reprocessing
11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("Got a request with input buffer, output streamType = %d", mStreamType);
11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reprocess_config_t reproc_cfg;
11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_dimension_t dim;
11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&reproc_cfg, 0, sizeof(reprocess_config_t));
11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&dim, 0, sizeof(dim));
11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        setReprocConfig(reproc_cfg, pInputBuffer, metadata, mStreamFormat, dim);
11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        startPostProc(reproc_cfg);
11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_fwk_input_pp_data_t *src_frame = NULL;
11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        src_frame = (qcamera_fwk_input_pp_data_t *)calloc(1,
11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                sizeof(qcamera_fwk_input_pp_data_t));
11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (src_frame == NULL) {
11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("No memory for src frame");
11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return NO_MEMORY;
11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = setFwkInputPPData(src_frame, pInputBuffer, &reproc_cfg, metadata, buffer, frameNumber);
11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc) {
11333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error %d while setting framework input PP data", rc);
11343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            free(src_frame);
11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGH("Post-process started");
11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_postprocessor.processData(src_frame);
11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        index = mMemory.getMatchBufIndex((void*)buffer);
11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if(index < 0) {
11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = registerBuffer(buffer, mIsType);
11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("On-the-fly buffer registration failed %d",
11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         rc);
11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
11473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            index = mMemory.getMatchBufIndex((void*)buffer);
11503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (index < 0) {
11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Could not find object among registered buffers");
11523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return DEAD_OBJECT;
11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1155c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        rc = mMemory.markFrameNumber(index, frameNumber);
1156c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        if(rc != NO_ERROR) {
1157c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            LOGE("Error marking frame number:%d for index %d", frameNumber,
1158c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                index);
1159c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            return rc;
1160c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        }
11613c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        if (m_bIsActive) {
11623c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            rc = mStreams[0]->bufDone(index);
11633c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            if(rc != NO_ERROR) {
11643c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang                LOGE("Failed to Q new buffer to stream");
11653c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang                mMemory.markFrameNumber(index, -1);
11663c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang                return rc;
11673c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            }
11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1169c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        indexUsed = index;
11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : initialize
11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION:
11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
11793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : isType : type of image stabilization on the buffer
11803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
11813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
11823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
11833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
11843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
11853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::initialize(__unused cam_is_type_t isType)
11863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
11873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
11883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mOfflineMetaMemory.allocateAll(sizeof(metadata_buffer_t));
11893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == NO_ERROR) {
11903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
11913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFreeOfflineMetaBuffersList.clear();
11923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < mNumBuffers + (MAX_REPROCESS_PIPELINE_STAGES - 1);
11933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                i++) {
11943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFreeOfflineMetaBuffersList.push_back(i);
11953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
11973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Could not allocate offline meta buffers for input reprocess");
11983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1199c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    mOutOfSequenceBuffers.clear();
12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
12013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
12023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : registerBuffer
12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: register streaming buffer to the channel object
12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
12093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buffer     : buffer to be registered
12103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @isType     : image stabilization type on the stream
12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
12153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
12163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::registerBuffer(buffer_handle_t *buffer,
12173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_is_type_t isType)
12183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1219e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_PROC_CH_REG_BUF);
12203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = 0;
12213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = isType;
12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_type_t streamType;
12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((uint32_t)mMemory.getCnt() > (mNumBufs - 1)) {
12253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Trying to register more buffers than initially requested");
12263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
12273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
12283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 == m_numStreams) {
12303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = initialize(mIsType);
12313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
12323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Couldn't initialize camera stream %d", rc);
12333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
12343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
12363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamType = mStreams[0]->getMyType();
12383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mMemory.registerBuffer(buffer, streamType);
12393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (ALREADY_EXISTS == rc) {
12403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
12413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (NO_ERROR != rc) {
12423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Buffer %p couldn't be registered %d", buffer, rc);
12433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
12443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
12453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
12473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
12483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
124914d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chenint32_t QCamera3ProcessingChannel::registerBufferAndGetBufDef(buffer_handle_t *buffer,
125014d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        mm_camera_buf_def_t *frame)
125114d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen{
125214d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    if (buffer == nullptr || frame == nullptr) {
125314d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        ALOGE("%s: buffer and frame cannot be nullptr.", __FUNCTION__);
125414d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        return BAD_VALUE;
125514d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    }
125614d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
125714d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    status_t rc;
125814d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
125914d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    // Get the buffer index.
126014d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    int index = mMemory.getMatchBufIndex((void*)buffer);
126114d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    if(index < 0) {
126214d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        // Register the buffer if it was not registered.
126314d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        rc = registerBuffer(buffer, mIsType);
126414d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        if (rc != OK) {
126514d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen            ALOGE("%s: Regitering buffer failed: %s (%d)", __FUNCTION__, strerror(-rc), rc);
126614d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen            return rc;
126714d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        }
126814d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
126914d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        index = mMemory.getMatchBufIndex((void*)buffer);
127014d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        if (index < 0) {
127114d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen            ALOGE("%s: Could not find object among registered buffers", __FUNCTION__);
127214d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen            return DEAD_OBJECT;
127314d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        }
127414d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    }
127514d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
127614d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    cam_frame_len_offset_t offset = {};
127714d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    mStreams[0]->getFrameOffset(offset);
127814d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
127914d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    // Get the buffer def.
128014d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    rc = mMemory.getBufDef(offset, *frame, index, mMapStreamBuffers);
128114d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    if (rc != 0) {
128214d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        ALOGE("%s: Getting a frame failed: %s (%d).", __FUNCTION__, strerror(-rc), rc);
128314d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        return rc;
128414d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    }
128514d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
128614d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    // Set the frame's stream ID because it's not set in getBufDef.
128714d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    frame->stream_id = mStreams[0]->getMyHandle();
128814d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    return 0;
128914d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen}
129014d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
129114d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chenvoid QCamera3ProcessingChannel::unregisterBuffer(mm_camera_buf_def_t *frame)
129214d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen{
129314d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    if (frame == nullptr) {
129414d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        ALOGE("%s: frame is nullptr", __FUNCTION__);
129514d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen        return;
129614d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    }
129714d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
129814d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen    mMemory.unregisterBuffer(frame->buf_idx);
129914d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen}
130014d3e393875339cd9ee2bbde11b434e333abd8c3Chien-Yu Chen
13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setFwkInputPPData
13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: fill out the framework src frame information for reprocessing
13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @src_frame         : input pp data to be filled out
13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pInputBuffer      : input buffer for reprocessing
13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @reproc_cfg        : pointer to the reprocess config
13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @metadata          : pointer to the metadata buffer
13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @output_buffer     : output buffer for reprocessing; could be NULL if not
13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                        framework allocated
13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frameNumber       : frame number of the request
13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::setFwkInputPPData(qcamera_fwk_input_pp_data_t *src_frame,
13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_buffer_t *pInputBuffer, reprocess_config_t *reproc_cfg,
13213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        metadata_buffer_t *metadata, buffer_handle_t *output_buffer,
13223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t frameNumber)
13233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
13243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int input_index = mOfflineMemory.getMatchBufIndex((void*)pInputBuffer->buffer);
13263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(input_index < 0) {
13273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = mOfflineMemory.registerBuffer(pInputBuffer->buffer, mStreamType);
13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc) {
13293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("On-the-fly input buffer registration failed %d",
13303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc);
13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        input_index = mOfflineMemory.getMatchBufIndex((void*)pInputBuffer->buffer);
13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (input_index < 0) {
13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Could not find object among registered buffers");
13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return DEAD_OBJECT;
13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mOfflineMemory.markFrameNumber(input_index, frameNumber);
13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_frame->src_frame = *pInputBuffer;
13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mOfflineMemory.getBufDef(reproc_cfg->input_stream_plane_info.plane_info,
1343063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang            src_frame->input_buffer, input_index, mMapStreamBuffers);
13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != 0) {
13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dumpYUV(&src_frame->input_buffer, reproc_cfg->input_stream_dim,
13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            reproc_cfg->input_stream_plane_info.plane_info, QCAMERA_DUMP_FRM_INPUT_REPROCESS);
13493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t dim = {sizeof(metadata_buffer_t), 1};
13503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_buf_plane_info_t meta_planes;
13513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mm_stream_calc_offset_metadata(&dim, &mPaddingInfo, &meta_planes);
13523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != 0) {
13533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Metadata stream plane info calculation failed!");
13543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
13553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t metaBufIdx;
13573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {
13583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
13593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mFreeOfflineMetaBuffersList.empty()) {
13603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("mFreeOfflineMetaBuffersList is null. Fatal");
13613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return BAD_VALUE;
13623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        metaBufIdx = *(mFreeOfflineMetaBuffersList.begin());
13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFreeOfflineMetaBuffersList.erase(mFreeOfflineMetaBuffersList.begin());
13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("erasing %d, mFreeOfflineMetaBuffersList.size %d", metaBufIdx,
13673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mFreeOfflineMetaBuffersList.size());
13683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mOfflineMetaMemory.markFrameNumber(metaBufIdx, frameNumber);
13713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_buf_def_t meta_buf;
13733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_frame_len_offset_t offset = meta_planes.plane_info;
1374063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang    rc = mOfflineMetaMemory.getBufDef(offset, meta_buf, metaBufIdx, true /*virtualAddr*/);
13753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR != rc) {
13763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
13773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memcpy(meta_buf.buffer, metadata, sizeof(metadata_buffer_t));
13793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_frame->metadata_buffer = meta_buf;
13803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_frame->reproc_config = *reproc_cfg;
13813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_frame->output_buffer = output_buffer;
13823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    src_frame->frameNumber = frameNumber;
13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
13853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
13873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : checkStreamCbErrors
13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: check the stream callback for errors
13903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @super_frame : the super frame with filled buffer
13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream      : stream on which the buffer was requested and filled
13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::checkStreamCbErrors(mm_camera_super_buf_t *super_frame,
14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *stream)
14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == stream) {
14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid stream");
14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(NULL == super_frame) {
14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Invalid Super buffer");
14093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return BAD_VALUE;
14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(super_frame->num_bufs != 1) {
14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Multiple streams are not supported");
14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return BAD_VALUE;
14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(NULL == super_frame->bufs[0]) {
14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Error, Super buffer frame does not contain valid buffer");
14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return BAD_VALUE;
14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
14213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamSize
14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: get the size from the camera3_stream_t for the channel
14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @dim     : Return the size of the stream
14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
14323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
14333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::getStreamSize(cam_dimension_t &dim)
14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mCamera3Stream) {
14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        dim.width = mCamera3Stream->width;
14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        dim.height = mCamera3Stream->height;
14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamBufs
14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: get the buffers allocated to the stream
14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @len       : buffer length
14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14583d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3StreamMem* QCamera3ProcessingChannel::getStreamBufs(uint32_t /*len*/)
14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1460e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_GETSTREAMBUFS);
14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return &mMemory;
14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : putStreamBufs
14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: release the buffers allocated to the stream
14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : NONE
14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NONE
14723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ProcessingChannel::putStreamBufs()
14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory.unregisterBuffers();
14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Reclaim all the offline metabuffers and push them to free list */
14783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {
14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFreeOfflineMetaBuffersList.clear();
14813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < mOfflineMetaMemory.getCnt(); i++) {
14823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFreeOfflineMetaBuffersList.push_back(i);
14833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stop
14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop processing channel, which will stop all streams within,
14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              including the reprocessing channel in postprocessor.
14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::stop()
15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
15029ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel    if (mStreamType == CAM_STREAM_TYPE_PREVIEW) {
15039ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel        KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_STOP_PREVIEW);
15049ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel    }
15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!m_bIsActive) {
15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Attempt to stop inactive channel");
15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_postprocessor.stop();
15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mPostProcStarted = false;
15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc |= QCamera3Channel::stop();
15143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
15153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : startPostProc
15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: figure out if the postprocessor needs to be restarted and if yes
15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              start it
15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @inputBufExists : whether there is an input buffer for post processing
15253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @config         : reprocessing configuration
15263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata       : metadata associated with the reprocessing request
15273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NONE
15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ProcessingChannel::startPostProc(const reprocess_config_t &config)
15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1532f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen    if (mPostProcStarted) {
1533f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen        if (config.reprocess_type != mReprocessType) {
1534f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen            // If the reprocess type doesn't match, stop and start with the new type
1535f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen            m_postprocessor.stop();
1536f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen            mPostProcStarted = false;
1537f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen        } else {
1538f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen            // Return if reprocess type is the same.
1539f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen            return;
1540f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen        }
15413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1542f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen
1543f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen    m_postprocessor.start(config);
1544f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen    mPostProcStarted = true;
1545f26dd3b7e57cfc50e1a1d29ef91f3d6982c4054aChien-Yu Chen    mReprocessType = config.reprocess_type;
15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : queueReprocMetadata
15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: queue the reprocess metadata to the postprocessor
15523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : metadata : the metadata corresponding to the pp frame
15543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
15563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
15573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
15583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
15593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::queueReprocMetadata(mm_camera_super_buf_t *metadata)
15603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
15613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return m_postprocessor.processPPMetadata(metadata);
15623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
15633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : metadataBufDone
15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Buffer done method for a metadata buffer
15683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
15703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @recvd_frame : received metadata frame
15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::metadataBufDone(mm_camera_super_buf_t *recvd_frame)
15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;;
15793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((NULL == m_pMetaChannel) || (NULL == recvd_frame)) {
15803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Metadata channel or metadata buffer invalid");
15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = ((QCamera3MetadataChannel*)m_pMetaChannel)->bufDone(recvd_frame);
15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : translateStreamTypeAndFormat
15913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: translates the framework stream format into HAL stream type
15933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              and format
15943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
15963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @streamType   : translated stream type
15973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @streamFormat : translated stream format
15983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream       : fwk stream
15993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
16013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
16023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
16033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
16043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::translateStreamTypeAndFormat(camera3_stream_t *stream,
16053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_stream_type_t &streamType, cam_format_t &streamFormat)
16063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (stream->format) {
16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case HAL_PIXEL_FORMAT_YCbCr_420_888:
16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if(stream->stream_type == CAMERA3_STREAM_INPUT){
16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamType = CAM_STREAM_TYPE_SNAPSHOT;
1611cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_SNAPSHOT,
1612c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        stream->width, stream->height, m_bUBWCenable, mIsType);
16133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
16143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamType = CAM_STREAM_TYPE_CALLBACK;
1615cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_CALLBACK,
1616c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        stream->width, stream->height, m_bUBWCenable, mIsType);
16173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
16203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (stream->usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) {
16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamType = CAM_STREAM_TYPE_VIDEO;
1622cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_VIDEO,
1623c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        stream->width, stream->height, m_bUBWCenable, mIsType);
16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else if(stream->stream_type == CAMERA3_STREAM_INPUT ||
16253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ||
16263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    IS_USAGE_ZSL(stream->usage)){
16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamType = CAM_STREAM_TYPE_SNAPSHOT;
1628cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_SNAPSHOT,
1629c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        stream->width, stream->height, m_bUBWCenable, mIsType);
16303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
16313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                streamType = CAM_STREAM_TYPE_PREVIEW;
1632cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_PREVIEW,
1633c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        stream->width, stream->height, m_bUBWCenable, mIsType);
16343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
16353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
16363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case HAL_PIXEL_FORMAT_RAW_OPAQUE:
16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case HAL_PIXEL_FORMAT_RAW16:
16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case HAL_PIXEL_FORMAT_RAW10:
16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamType = CAM_STREAM_TYPE_RAW;
16400f3c316a1f0dd150adeba93a1c9d91ae9d12a1aaEmilian Peev            if ((HAL_DATASPACE_DEPTH == stream->data_space) &&
16410f3c316a1f0dd150adeba93a1c9d91ae9d12a1aaEmilian Peev                    (HAL_PIXEL_FORMAT_RAW16 == stream->format)) {
16420f3c316a1f0dd150adeba93a1c9d91ae9d12a1aaEmilian Peev                streamFormat = CAM_FORMAT_META_RAW_10BIT;
16430f3c316a1f0dd150adeba93a1c9d91ae9d12a1aaEmilian Peev            } else {
16440f3c316a1f0dd150adeba93a1c9d91ae9d12a1aaEmilian Peev                streamFormat = CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG;
16450f3c316a1f0dd150adeba93a1c9d91ae9d12a1aaEmilian Peev            }
16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        default:
16483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return -EINVAL;
16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("fwk_format = %d, streamType = %d, streamFormat = %d",
16513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            stream->format, streamType, streamFormat);
16523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
16533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
16543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
16563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setReprocConfig
16573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: sets the reprocessing parameters for the input buffer
16593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @reproc_cfg : the configuration to be set
16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pInputBuffer : pointer to the input buffer
16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata : pointer to the reprocessing metadata buffer
16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @streamFormat : format of the input stream
16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
16693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::setReprocConfig(reprocess_config_t &reproc_cfg,
16713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_buffer_t *pInputBuffer,
16723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        __unused metadata_buffer_t *metadata,
16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_format_t streamFormat, cam_dimension_t dim)
16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
16753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
16763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reproc_cfg.padding = &mPaddingInfo;
16773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //to ensure a big enough buffer size set the height and width
16783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //padding to max(height padding, width padding)
16793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (reproc_cfg.padding->height_padding > reproc_cfg.padding->width_padding) {
16803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       reproc_cfg.padding->width_padding = reproc_cfg.padding->height_padding;
16813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
16823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       reproc_cfg.padding->height_padding = reproc_cfg.padding->width_padding;
16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL != pInputBuffer) {
16853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reproc_cfg.input_stream_dim.width = (int32_t)pInputBuffer->stream->width;
16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reproc_cfg.input_stream_dim.height = (int32_t)pInputBuffer->stream->height;
16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reproc_cfg.input_stream_dim.width = (int32_t)dim.width;
16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reproc_cfg.input_stream_dim.height = (int32_t)dim.height;
16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reproc_cfg.src_channel = this;
16923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reproc_cfg.output_stream_dim.width = mCamera3Stream->width;
16933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reproc_cfg.output_stream_dim.height = mCamera3Stream->height;
16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reproc_cfg.reprocess_type = getReprocessType();
16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //offset calculation
16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL != pInputBuffer) {
16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = translateStreamTypeAndFormat(pInputBuffer->stream,
16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                reproc_cfg.stream_type, reproc_cfg.stream_format);
17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Stream format %d is not supported",
17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    pInputBuffer->stream->format);
17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reproc_cfg.stream_type = mStreamType;
17073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reproc_cfg.stream_format = streamFormat;
17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    switch (reproc_cfg.stream_type) {
17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAM_STREAM_TYPE_PREVIEW:
17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (getStreamByIndex(0) == NULL) {
17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Could not find stream");
17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = -1;
17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mm_stream_calc_offset_preview(
17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    getStreamByIndex(0)->getStreamInfo(),
17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    &reproc_cfg.input_stream_dim,
17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    reproc_cfg.padding,
17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    &reproc_cfg.input_stream_plane_info);
17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAM_STREAM_TYPE_VIDEO:
17243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mm_stream_calc_offset_video(reproc_cfg.stream_format,
17253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    &reproc_cfg.input_stream_dim,
17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    &reproc_cfg.input_stream_plane_info);
17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAM_STREAM_TYPE_RAW:
17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mm_stream_calc_offset_raw(reproc_cfg.stream_format,
17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    &reproc_cfg.input_stream_dim,
17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    reproc_cfg.padding, &reproc_cfg.input_stream_plane_info);
17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
17333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAM_STREAM_TYPE_SNAPSHOT:
17343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAM_STREAM_TYPE_CALLBACK:
17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        default:
17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mm_stream_calc_offset_snapshot(streamFormat, &reproc_cfg.input_stream_dim,
17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    reproc_cfg.padding, &reproc_cfg.input_stream_plane_info);
17383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
17393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != 0) {
17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Stream %d plane info calculation failed!", mStreamType);
17423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
17433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1744e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
1745e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    IF_META_AVAILABLE(cam_hdr_param_t, hdr_info, CAM_INTF_PARM_HAL_BRACKETING_HDR, metadata) {
1746e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        reproc_cfg.hdr_param = *hdr_info;
1747e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
1748e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : reprocessCbRoutine
17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback function for the reprocessed frame. This frame now
17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              should be returned to the framework
17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultBuffer      : buffer containing the reprocessed data
17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultFrameNumber : frame number on which the buffer was requested
17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NONE
17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ProcessingChannel::reprocessCbRoutine(buffer_handle_t *resultBuffer,
17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t resultFrameNumber)
17673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1768e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_PROC_CH_REPROC_CB);
17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
17703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = releaseOfflineMemory(resultFrameNumber);
17723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR != rc) {
17733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error releasing offline memory %d", rc);
17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Since reprocessing is done, send the callback to release the input buffer */
17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mChannelCB) {
17773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mChannelCB(NULL, NULL, resultFrameNumber, true, mUserData);
17783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    issueChannelCb(resultBuffer, resultFrameNumber);
17803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : issueChannelCb
17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: function to set the result and issue channel callback
17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultBuffer      : buffer containing the data
17913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultFrameNumber : frame number on which the buffer was requested
17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NONE
17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ProcessingChannel::issueChannelCb(buffer_handle_t *resultBuffer,
17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t resultFrameNumber)
17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera3_stream_buffer_t result;
18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Use below data to issue framework callback
18023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    result.stream = mCamera3Stream;
18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    result.buffer = resultBuffer;
18043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    result.status = CAMERA3_BUFFER_STATUS_OK;
18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    result.acquire_fence = -1;
18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    result.release_fence = -1;
18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mChannelCB) {
18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mChannelCB(NULL, &result, resultFrameNumber, false, mUserData);
18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
18123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : showDebugFPS
18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Function to log the fps for preview, video, callback and raw
18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              streams
18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : Stream type
18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN  : None
18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ProcessingChannel::showDebugFPS(int32_t streamType)
18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
18253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    double fps = 0;
18263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mFrameCount++;
18273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    nsecs_t now = systemTime();
18283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    nsecs_t diff = now - mLastFpsTime;
18293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (diff > ms2ns(250)) {
18303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        fps = (((double)(mFrameCount - mLastFrameCount)) *
18313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (double)(s2ns(1))) / (double)diff;
18323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        switch(streamType) {
18333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_STREAM_TYPE_PREVIEW:
18343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("PROFILE_PREVIEW_FRAMES_PER_SECOND : %.4f: mFrameCount=%d",
18353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         fps, mFrameCount);
18363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_STREAM_TYPE_VIDEO:
18383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("PROFILE_VIDEO_FRAMES_PER_SECOND : %.4f",
18393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         fps);
18403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_STREAM_TYPE_CALLBACK:
18423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("PROFILE_CALLBACK_FRAMES_PER_SECOND : %.4f",
18433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         fps);
18443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAM_STREAM_TYPE_RAW:
18463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("PROFILE_RAW_FRAMES_PER_SECOND : %.4f",
18473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         fps);
18483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
18503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("logging not supported for the stream");
18513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
18523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mLastFpsTime = now;
18543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mLastFrameCount = mFrameCount;
18553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
18573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
18593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : releaseOfflineMemory
18603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: function to clean up the offline memory used for input reprocess
18623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
18643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultFrameNumber : frame number on which the buffer was requested
18653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
18673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
18683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              non-zero failure code
18693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
18723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ProcessingChannel::releaseOfflineMemory(uint32_t resultFrameNumber)
18733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
18743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
18753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t inputBufIndex =
18763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mOfflineMemory.getGrallocBufferIndex(resultFrameNumber);
18773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 <= inputBufIndex) {
18783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = mOfflineMemory.unregisterBuffer(inputBufIndex);
18793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
18803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Could not find offline input buffer, resultFrameNumber %d",
18813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 resultFrameNumber);
18823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != NO_ERROR) {
18843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Failed to unregister offline input buffer");
18853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t metaBufIndex =
18883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mOfflineMetaMemory.getHeapBufferIndex(resultFrameNumber);
18893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 <= metaBufIndex) {
18903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mFreeOfflineMetaBuffersLock);
18913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFreeOfflineMetaBuffersList.push_back((uint32_t)metaBufIndex);
18923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
18933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Could not find offline meta buffer, resultFrameNumber %d",
18943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                resultFrameNumber);
18953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
18983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
18993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Regular Channel methods */
19013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
19023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3RegularChannel
19033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCamera3RegularChannel
19053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
19073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
19083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
19093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cb_routine : callback routine to frame aggregator
19103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream     : camera3_stream_t structure
19113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream_type: Channel stream type
19123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @postprocess_mask: feature mask for postprocessing
19133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @metadataChannel : metadata channel for the session
19143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @numBuffers : number of max dequeued buffers
19153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
19173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19183d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3RegularChannel::QCamera3RegularChannel(uint32_t cam_handle,
19193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t channel_handle,
19203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_ops_t *cam_ops,
19213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        channel_cb_routine cb_routine,
1922c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        channel_cb_buffer_err cb_buffer_err,
19233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_padding_info_t *paddingInfo,
19243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *userData,
19253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_t *stream,
19263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_stream_type_t stream_type,
19273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_feature_mask_t postprocess_mask,
19283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Channel *metadataChannel,
19293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t numBuffers) :
19303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera3ProcessingChannel(cam_handle, channel_handle, cam_ops,
1931c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    cb_routine, cb_buffer_err, paddingInfo, userData, stream, stream_type,
19323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    postprocess_mask, metadataChannel, numBuffers),
19333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mBatchSize(0),
19343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mRotation(ROTATE_0)
19353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
19363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
19373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
19393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCamera3RegularChannel
19403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCamera3RegularChannel
19423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
19443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
19463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19473d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3RegularChannel::~QCamera3RegularChannel()
19483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
19493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    destroy();
19503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
19513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
19533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : initialize
19543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initialize and add camera channel & stream
19563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
19583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @isType : type of image stabilization required on this stream
19593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
19613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
19623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
19633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3RegularChannel::initialize(cam_is_type_t isType)
19663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1967e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_REG_CH_INIT);
19683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
19693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t streamDim;
19713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == mCamera3Stream) {
19733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Camera stream uninitialized");
19743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
19753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (1 <= m_numStreams) {
19783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Only one stream per channel supported in v3 Hal
19793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
19803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType  = isType;
19833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = translateStreamTypeAndFormat(mCamera3Stream, mStreamType,
19853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreamFormat);
19863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != NO_ERROR) {
19873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -EINVAL;
19883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((mStreamType == CAM_STREAM_TYPE_VIDEO) ||
19923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (mStreamType == CAM_STREAM_TYPE_PREVIEW)) {
19933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((mCamera3Stream->rotation != CAMERA3_STREAM_ROTATION_0) &&
19943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ((mPostProcMask & CAM_QCOM_FEATURE_ROTATION) == 0)) {
19953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("attempting rotation %d when rotation is disabled",
19963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mCamera3Stream->rotation);
19973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return -EINVAL;
19983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
19993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        switch (mCamera3Stream->rotation) {
20013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAMERA3_STREAM_ROTATION_0:
20023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mRotation = ROTATE_0;
20033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
20043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAMERA3_STREAM_ROTATION_90: {
20053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mRotation = ROTATE_90;
20063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
20073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
20083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAMERA3_STREAM_ROTATION_180:
20093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mRotation = ROTATE_180;
20103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
20113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            case CAMERA3_STREAM_ROTATION_270: {
20123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mRotation = ROTATE_270;
20133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                break;
20143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
20153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            default:
20163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Unknown rotation: %d",
20173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         mCamera3Stream->rotation);
20183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return -EINVAL;
20193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
2020cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
2021cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        // Camera3/HAL3 spec expecting counter clockwise rotation but CPP HW is
2022cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        // doing Clockwise rotation and so swap it.
2023cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if (mRotation == ROTATE_90) {
2024cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            mRotation = ROTATE_270;
2025cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        } else if (mRotation == ROTATE_270) {
2026cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel            mRotation = ROTATE_90;
2027cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        }
2028cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel
20293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (mCamera3Stream->rotation != CAMERA3_STREAM_ROTATION_0) {
20303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Rotation %d is not supported by stream type %d",
20313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mCamera3Stream->rotation,
20323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mStreamType);
20333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -EINVAL;
20343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
20353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.width = mCamera3Stream->width;
20373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.height = mCamera3Stream->height;
20383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("batch size is %d", mBatchSize);
20403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::addStream(mStreamType,
20413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreamFormat,
20423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamDim,
20433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mRotation,
20443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mNumBufs,
20453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mPostProcMask,
20463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mIsType,
20473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mBatchSize);
20483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
20503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setBatchSize
20543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Set batch size for the channel.
20563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
20583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @batchSize  : Number of image buffers in a batch
20593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
20613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success always
20623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
20633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
20643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3RegularChannel::setBatchSize(uint32_t batchSize)
20653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
20663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
20673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mBatchSize = batchSize;
20693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("Batch size set: %d", mBatchSize);
20703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
20713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamTypeMask
20753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Get bit mask of all stream types in this channel.
20773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              If stream is not initialized, then generate mask based on
20783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              local streamType
20793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None
20813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : Bit mask of all stream types in this channel
20833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
20843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeluint32_t QCamera3RegularChannel::getStreamTypeMask()
20853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
20863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mStreams[0]) {
20873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return QCamera3Channel::getStreamTypeMask();
20883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
20893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return (1U << mStreamType);
20903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
20913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : queueBatchBuf
20953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: queue batch container to downstream
20973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
20993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
21013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success always
21023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
21033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
21043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3RegularChannel::queueBatchBuf()
21053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
21063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
21073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mStreams[0]) {
21093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = mStreams[0]->queueBatchBuf();
21103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != NO_ERROR) {
21123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("stream->queueBatchContainer failed");
21133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
21153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
21163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
21183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : request
21193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: process a request from camera service. Stream on if ncessary.
21213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
21233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buffer  : buffer to be filled for this request
21243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : 0 on a success start of capture
21263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -EINVAL on invalid input
21273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -ENODEV on serious error
21283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2129c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudelint32_t QCamera3RegularChannel::request(buffer_handle_t *buffer, uint32_t frameNumber, int &indexUsed)
21303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2131e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_REG_CH_REQ);
21323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //FIX ME: Return buffer back in case of failures below.
21333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
21353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int index;
21363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == buffer) {
21383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid buffer in channel request");
21393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
21403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    index = mMemory.getMatchBufIndex((void*)buffer);
21433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(index < 0) {
21443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = registerBuffer(buffer, mIsType);
21453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc) {
21463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("On-the-fly buffer registration failed %d",
21473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc);
21483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
21493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        index = mMemory.getMatchBufIndex((void*)buffer);
21523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (index < 0) {
21533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Could not find object among registered buffers");
21543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return DEAD_OBJECT;
21553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2158c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    rc = mMemory.markFrameNumber((uint32_t)index, frameNumber);
2159c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    if(rc != NO_ERROR) {
2160c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        LOGE("Failed to mark FrameNumber:%d,idx:%d",frameNumber,index);
2161c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        return rc;
2162c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    }
21633c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    if (m_bIsActive) {
21643c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        rc = mStreams[0]->bufDone((uint32_t)index);
21653c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        if(rc != NO_ERROR) {
21663c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            LOGE("Failed to Q new buffer to stream");
21673c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            mMemory.markFrameNumber(index, -1);
21683c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            return rc;
21693c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        }
21703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2172c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    indexUsed = index;
21733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
21743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
21753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
21773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getReprocessType
21783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: get the type of reprocess output supported by this channel
21803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : NONE
21823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : reprocess_type_t : type of reprocess
21843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
21853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelreprocess_type_t QCamera3RegularChannel::getReprocessType()
21863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
21873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return REPROCESS_TYPE_PRIVATE;
21883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
21893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21913d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3MetadataChannel::QCamera3MetadataChannel(uint32_t cam_handle,
21923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    uint32_t channel_handle,
21933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mm_camera_ops_t *cam_ops,
21943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    channel_cb_routine cb_routine,
2195c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    channel_cb_buffer_err cb_buffer_err,
21963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_padding_info_t *paddingInfo,
21973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_feature_mask_t postprocess_mask,
21983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    void *userData, uint32_t numBuffers) :
21993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3Channel(cam_handle, channel_handle, cam_ops,
2200c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                cb_routine, cb_buffer_err, paddingInfo, postprocess_mask,
22013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                userData, numBuffers),
2202662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev                        mMemory(NULL), mDepthDataPresent(false)
22033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2204063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang    mMapStreamBuffers = true;
22053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22073d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3MetadataChannel::~QCamera3MetadataChannel()
22083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    destroy();
22103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mMemory) {
22123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory->deallocate();
22133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete mMemory;
22143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory = NULL;
22153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3MetadataChannel::initialize(cam_is_type_t isType)
22193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2220e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_METADATA_CH_INIT);
22213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc;
22223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t streamDim;
22233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mMemory || m_numStreams > 0) {
22253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("metadata channel already initialized");
22263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -EINVAL;
22273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.width = (int32_t)sizeof(metadata_buffer_t),
22303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.height = 1;
22313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = isType;
22333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::addStream(CAM_STREAM_TYPE_METADATA, CAM_FORMAT_MAX,
22343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamDim, ROTATE_0, (uint8_t)mNumBuffers, mPostProcMask, mIsType);
22353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
22363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("addStream failed");
22373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
22393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3MetadataChannel::request(buffer_handle_t * /*buffer*/,
2242c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                                uint32_t /*frameNumber*/,
2243c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                                int&  /*indexUsed*/)
22443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_bIsActive) {
22463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return start();
22473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    else
22493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return 0;
22503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3MetadataChannel::streamCbRoutine(
22533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mm_camera_super_buf_t *super_frame,
22543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3Stream * /*stream*/)
22553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ATRACE_NAME("metadata_stream_cb_routine");
22573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t requestNumber = 0;
22583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (super_frame == NULL || super_frame->num_bufs != 1) {
22593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("super_frame is not valid");
22603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
22613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mChannelCB) {
22633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mChannelCB(super_frame, NULL, requestNumber, false, mUserData);
22643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22673d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3StreamMem* QCamera3MetadataChannel::getStreamBufs(uint32_t len)
22683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc;
22703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (len < sizeof(metadata_buffer_t)) {
22713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Metadata buffer size less than structure %d vs %d",
22723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                len,
22733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                sizeof(metadata_buffer_t));
22743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
22753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory = new QCamera3StreamMem(MIN_STREAMING_BUFFER_NUM);
22773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!mMemory) {
22783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("unable to create metadata memory");
22793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
22803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mMemory->allocateAll(len);
22823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
22833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("unable to allocate metadata memory");
22843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete mMemory;
22853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory = NULL;
22863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
22873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    clear_metadata_buffer((metadata_buffer_t*)mMemory->getPtr(0));
2289662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev
2290662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev    for (uint32_t i = 0; i < mMemory->getCnt(); i++) {
2291662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev        if (mMemory->valid(i)) {
2292662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            metadata_buffer_t *metadata_buffer_t =
2293662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev                    static_cast<::metadata_buffer_t *> (mMemory->getPtr(i));
2294662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            metadata_buffer_t->depth_data.depth_data = nullptr;
2295662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            if (mDepthDataPresent) {
2296662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev                metadata_buffer_t->depth_data.depth_data =
2297656e4fafd6ec53944c26e36803f509733f8b480fEmilian Peev                        new uint8_t[PD_DATA_SIZE];
2298662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            }
2299662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev        } else {
2300662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            LOGE("Invalid meta buffer at index: %d", i);
2301662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev        }
2302662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev    }
2303662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev
23043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return mMemory;
23053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
23063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3MetadataChannel::putStreamBufs()
23083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2309662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev    for (uint32_t i = 0; i < mMemory->getCnt(); i++) {
2310662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev        if (mMemory->valid(i)) {
2311662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            metadata_buffer_t *metadata_buffer_t =
2312662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev                    static_cast<::metadata_buffer_t *> (mMemory->getPtr(i));
2313662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            if (nullptr != metadata_buffer_t->depth_data.depth_data) {
2314662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev                delete [] metadata_buffer_t->depth_data.depth_data;
2315662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev                metadata_buffer_t->depth_data.depth_data = nullptr;
2316662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            }
2317662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev        } else {
2318662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev            LOGE("Invalid meta buffer at index: %d", i);
2319662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev        }
2320662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev    }
2321662c05ead2a1fa5b3a8baeb3b4f4eff23d2a032dEmilian Peev
23223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory->deallocate();
23233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    delete mMemory;
23243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory = NULL;
23253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
23263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*************************************************************************************/
23273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// RAW Channel related functions
23283d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3RawChannel::QCamera3RawChannel(uint32_t cam_handle,
23293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    uint32_t channel_handle,
23303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mm_camera_ops_t *cam_ops,
23313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    channel_cb_routine cb_routine,
2332c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    channel_cb_buffer_err cb_buffer_err,
23333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_padding_info_t *paddingInfo,
23343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    void *userData,
23353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    camera3_stream_t *stream,
23363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_feature_mask_t postprocess_mask,
23373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    QCamera3Channel *metadataChannel,
23383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    bool raw_16, uint32_t numBuffers) :
23393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3RegularChannel(cam_handle, channel_handle, cam_ops,
2340c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                cb_routine, cb_buffer_err, paddingInfo, userData, stream,
23413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                CAM_STREAM_TYPE_RAW, postprocess_mask,
23423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                metadataChannel, numBuffers),
23433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mIsRaw16(raw_16)
23443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
23453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char prop[PROPERTY_VALUE_MAX];
23463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.raw.debug.dump", prop, "0");
23473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mRawDump = atoi(prop);
2348063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang    mMapStreamBuffers = (mRawDump || mIsRaw16);
23493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
23503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23513d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3RawChannel::~QCamera3RawChannel()
23523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
23533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
23543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
23563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : initialize
23573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
23583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initialize and add camera channel & stream
23593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
23603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
23613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @isType    : image stabilization type on the stream
23623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
23633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
23643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
23653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
23663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
23673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3RawChannel::initialize(cam_is_type_t isType)
23693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
23703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return QCamera3RegularChannel::initialize(isType);
23713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
23723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3RawChannel::streamCbRoutine(
23743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mm_camera_super_buf_t *super_frame,
23753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3Stream * stream)
23763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2377e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_RAW_CH_STRM_CB);
23783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* Move this back down once verified */
23793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mRawDump)
23803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        dumpRawSnapshot(super_frame->bufs[0]);
23813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mIsRaw16) {
2383cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        cam_format_t streamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_RAW,
2384c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                mCamera3Stream->width, mCamera3Stream->height, m_bUBWCenable, mIsType);
2385cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        if (streamFormat == CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG)
23863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            convertMipiToRaw16(super_frame->bufs[0]);
23873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        else
23883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            convertLegacyToRaw16(super_frame->bufs[0]);
23893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
239048c509a47e132a995e28f15d644550caf50eb126Shuzhen Wang        //Make sure cache coherence because extra processing is done
239148c509a47e132a995e28f15d644550caf50eb126Shuzhen Wang        mMemory.cleanCache(super_frame->bufs[0]->buf_idx);
239248c509a47e132a995e28f15d644550caf50eb126Shuzhen Wang    }
23933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3RegularChannel::streamCbRoutine(super_frame, stream);
23953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
23963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
23973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3RawChannel::dumpRawSnapshot(mm_camera_buf_def_t *frame)
23993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
24003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   QCamera3Stream *stream = getStreamByIndex(0);
24013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   if (stream != NULL) {
24023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       char buf[FILENAME_MAX];
24033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       memset(buf, 0, sizeof(buf));
24043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       cam_dimension_t dim;
24053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       memset(&dim, 0, sizeof(dim));
24063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       stream->getFrameDimension(dim);
24073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       cam_frame_len_offset_t offset;
24093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       memset(&offset, 0, sizeof(cam_frame_len_offset_t));
24103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       stream->getFrameOffset(offset);
24113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       snprintf(buf, sizeof(buf), QCAMERA_DUMP_FRM_LOCATION"r_%d_%dx%d.raw",
24123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                frame->frame_idx, offset.mp[0].stride, offset.mp[0].scanline);
24133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       int file_fd = open(buf, O_RDWR| O_CREAT, 0644);
24153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       if (file_fd >= 0) {
24163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          ssize_t written_len = write(file_fd, frame->buffer, frame->frame_len);
24173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          LOGD("written number of bytes %zd", written_len);
2418295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel          frame->cache_flags |= CPU_HAS_READ;
24193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          close(file_fd);
24203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       } else {
24213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          LOGE("failed to open file to dump image");
24223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       }
24233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   } else {
24243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       LOGE("Could not find stream");
24253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   }
24263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
24283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3RawChannel::convertLegacyToRaw16(mm_camera_buf_def_t *frame)
24303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
24313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Convert image buffer from Opaque raw format to RAW16 format
24323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 10bit Opaque raw is stored in the format of:
24333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 0000 - p5 - p4 - p3 - p2 - p1 - p0
24343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // where p0 to p5 are 6 pixels (each is 10bit)_and most significant
24353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 4 bits are 0s. Each 64bit word contains 6 pixels.
24363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  QCamera3Stream *stream = getStreamByIndex(0);
24383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  if (stream != NULL) {
24393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      cam_dimension_t dim;
24403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      memset(&dim, 0, sizeof(dim));
24413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      stream->getFrameDimension(dim);
24423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      cam_frame_len_offset_t offset;
24443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      memset(&offset, 0, sizeof(cam_frame_len_offset_t));
24453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      stream->getFrameOffset(offset);
24463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      uint32_t raw16_stride = ((uint32_t)dim.width + 15U) & ~15U;
24483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      uint16_t* raw16_buffer = (uint16_t *)frame->buffer;
24493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // In-place format conversion.
24513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // Raw16 format always occupy more memory than opaque raw10.
24523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // Convert to Raw16 by iterating through all pixels from bottom-right
24533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // to top-left of the image.
24543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // One special notes:
24553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // 1. Cross-platform raw16's stride is 16 pixels.
24563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      // 2. Opaque raw10's stride is 6 pixels, and aligned to 16 bytes.
24573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      for (int32_t ys = dim.height - 1; ys >= 0; ys--) {
24583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          uint32_t y = (uint32_t)ys;
24593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          uint64_t* row_start = (uint64_t *)frame->buffer +
24603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                  y * (uint32_t)offset.mp[0].stride_in_bytes / 8;
24613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          for (int32_t xs = dim.width - 1; xs >= 0; xs--) {
24623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              uint32_t x = (uint32_t)xs;
24633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              uint16_t raw16_pixel = 0x3FF & (row_start[x/6] >> (10*(x%6)));
24643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel              raw16_buffer[y*raw16_stride+x] = raw16_pixel;
24653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          }
24663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      }
24673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  } else {
24683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      LOGE("Could not find stream");
24693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
24703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
24723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3RawChannel::convertMipiToRaw16(mm_camera_buf_def_t *frame)
24743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
24753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Convert image buffer from mipi10 raw format to RAW16 format
24763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // mipi10 opaque raw is stored in the format of:
24773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // P3(1:0) P2(1:0) P1(1:0) P0(1:0) P3(9:2) P2(9:2) P1(9:2) P0(9:2)
24783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 4 pixels occupy 5 bytes, no padding needed
24793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Stream *stream = getStreamByIndex(0);
24813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (stream != NULL) {
24823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_dimension_t dim;
24833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&dim, 0, sizeof(dim));
24843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stream->getFrameDimension(dim);
24853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_frame_len_offset_t offset;
24873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&offset, 0, sizeof(cam_frame_len_offset_t));
24883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stream->getFrameOffset(offset);
24893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t raw16_stride = ((uint32_t)dim.width + 15U) & ~15U;
24913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint16_t* raw16_buffer = (uint16_t *)frame->buffer;
24925dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang        uint8_t first_quintuple[5];
24935dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang        memcpy(first_quintuple, raw16_buffer, sizeof(first_quintuple));
24943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // In-place format conversion.
24963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Raw16 format always occupy more memory than opaque raw10.
24973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Convert to Raw16 by iterating through all pixels from bottom-right
24983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // to top-left of the image.
24993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // One special notes:
25003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // 1. Cross-platform raw16's stride is 16 pixels.
25013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // 2. mipi raw10's stride is 4 pixels, and aligned to 16 bytes.
25023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (int32_t ys = dim.height - 1; ys >= 0; ys--) {
25033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            uint32_t y = (uint32_t)ys;
25043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            uint8_t* row_start = (uint8_t *)frame->buffer +
25053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    y * (uint32_t)offset.mp[0].stride_in_bytes;
25063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            for (int32_t xs = dim.width - 1; xs >= 0; xs--) {
25073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                uint32_t x = (uint32_t)xs;
25083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                uint8_t upper_8bit = row_start[5*(x/4)+x%4];
2509605c06bfc3cca9b42b0d51db9aa40eb13d382c25Yin-Chia Yeh                uint8_t lower_2bit = ((row_start[5*(x/4)+4] >> ((x%4) << 1)) & 0x3);
25103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                uint16_t raw16_pixel =
25113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (uint16_t)(((uint16_t)upper_8bit)<<2 |
25123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (uint16_t)lower_2bit);
25133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                raw16_buffer[y*raw16_stride+x] = raw16_pixel;
25143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
25153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
25165dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang
25175dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang        // Re-convert the first 2 pixels of the buffer because the loop above messes
25185dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang        // them up by reading the first quintuple while modifying it.
25195dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang        raw16_buffer[0] = ((uint16_t)first_quintuple[0]<<2) | (first_quintuple[4] & 0x3);
25205dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang        raw16_buffer[1] = ((uint16_t)first_quintuple[1]<<2) | ((first_quintuple[4] >> 2) & 0x3);
25215dea3e8a5173ad864594a3ff820bde0ca9e482e5Shuzhen Wang
25223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
25233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Could not find stream");
25243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
25253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
25273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
25293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getReprocessType
25303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: get the type of reprocess output supported by this channel
25323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : NONE
25343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : reprocess_type_t : type of reprocess
25363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
25373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelreprocess_type_t QCamera3RawChannel::getReprocessType()
25383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
25393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return REPROCESS_TYPE_RAW;
25403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
25413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*************************************************************************************/
25443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// RAW Dump Channel related functions
25453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
25473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3RawDumpChannel
25483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Constructor for RawDumpChannel
25503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
25523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle    : Handle for Camera
25533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops       : Function pointer table
25543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @rawDumpSize   : Dimensions for the Raw stream
25553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @paddinginfo   : Padding information for stream
25563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @userData      : Cookie for parent
25573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pp mask       : PP feature mask for this stream
25583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @numBuffers    : number of max dequeued buffers
25593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN           : NA
25613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
25623d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3RawDumpChannel::QCamera3RawDumpChannel(uint32_t cam_handle,
25633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    uint32_t channel_handle,
25643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mm_camera_ops_t *cam_ops,
25653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_dimension_t rawDumpSize,
25663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_padding_info_t *paddingInfo,
25673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    void *userData,
25683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_feature_mask_t postprocess_mask, uint32_t numBuffers) :
25693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3Channel(cam_handle, channel_handle, cam_ops, NULL,
2570c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                NULL, paddingInfo, postprocess_mask,
25713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                userData, numBuffers),
25723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mDim(rawDumpSize),
25733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mMemory(NULL)
25743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
25753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char prop[PROPERTY_VALUE_MAX];
25763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.raw.dump", prop, "0");
25773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mRawDump = atoi(prop);
25783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
25793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
25813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3RawDumpChannel
25823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Destructor for RawDumpChannel
25843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
25863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN           : NA
25883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
25893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25903d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3RawDumpChannel::~QCamera3RawDumpChannel()
25913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
25923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    destroy();
25933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
25943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
25963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : dumpRawSnapshot
25973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Helper function to dump Raw frames
25993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
26013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  @frame      : stream buf frame to be dumped
26023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  RETURN      : NA
26043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
26053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3RawDumpChannel::dumpRawSnapshot(mm_camera_buf_def_t *frame)
26063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
26073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Stream *stream = getStreamByIndex(0);
26083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (stream != NULL) {
26093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        char buf[FILENAME_MAX];
26103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct timeval tv;
26113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct tm timeinfo_data;
26123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct tm *timeinfo;
26133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_dimension_t dim;
26153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&dim, 0, sizeof(dim));
26163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stream->getFrameDimension(dim);
26173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_frame_len_offset_t offset;
26193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&offset, 0, sizeof(cam_frame_len_offset_t));
26203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stream->getFrameOffset(offset);
26213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        gettimeofday(&tv, NULL);
26233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        timeinfo = localtime_r(&tv.tv_sec, &timeinfo_data);
26243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NULL != timeinfo) {
26263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(buf, 0, sizeof(buf));
26273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            snprintf(buf, sizeof(buf),
26283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    QCAMERA_DUMP_FRM_LOCATION
26293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    "%04d-%02d-%02d-%02d-%02d-%02d-%06ld_%d_%dx%d.raw",
26303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,
26313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    timeinfo->tm_mday, timeinfo->tm_hour,
26323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    timeinfo->tm_min, timeinfo->tm_sec,tv.tv_usec,
26333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    frame->frame_idx, dim.width, dim.height);
26343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int file_fd = open(buf, O_RDWR| O_CREAT, 0777);
26363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (file_fd >= 0) {
26373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ssize_t written_len =
26383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        write(file_fd, frame->buffer, offset.frame_len);
26393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGD("written number of bytes %zd", written_len);
2640295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                frame->cache_flags |= CPU_HAS_READ;
26413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                close(file_fd);
26423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
26433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("failed to open file to dump image");
26443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
26453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
26463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("localtime_r() error");
26473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
26493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Could not find stream");
26503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
26513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
26533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
26553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : streamCbRoutine
26563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Callback routine invoked for each frame generated for
26583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              Rawdump channel
26593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
26613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @super_frame  : stream buf frame generated
26623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream       : Underlying Stream object cookie
26633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN          : NA
26653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
26663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3RawDumpChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
26673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                __unused QCamera3Stream *stream)
26683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
26693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("E");
26703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (super_frame == NULL || super_frame->num_bufs != 1) {
26713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("super_frame is not valid");
26723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
26733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
26743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mRawDump)
26763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        dumpRawSnapshot(super_frame->bufs[0]);
26773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    bufDone(super_frame);
26793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    free(super_frame);
26803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
26813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
26833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamBufs
26843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Callback function provided to interface to get buffers.
26863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
26883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @len       : Length of each buffer to be allocated
26893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NULL on buffer allocation failure
26913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              QCamera3StreamMem object on sucess
26923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
26933d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3StreamMem* QCamera3RawDumpChannel::getStreamBufs(uint32_t len)
26943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
26953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc;
26963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory = new QCamera3StreamMem(mNumBuffers);
26973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!mMemory) {
26993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("unable to create heap memory");
27003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
27013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mMemory->allocateAll((size_t)len);
27033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
27043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("unable to allocate heap memory");
27053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete mMemory;
27063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory = NULL;
27073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
27083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return mMemory;
27103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
27113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
27133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : putStreamBufs
27143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Callback function provided to interface to return buffers.
27163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              Although no handles are actually returned, implicitl assumption
27173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              that interface will no longer use buffers and channel can
27183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              deallocated if necessary.
27193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : NA
27213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NA
27233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
27243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3RawDumpChannel::putStreamBufs()
27253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
27263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory->deallocate();
27273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    delete mMemory;
27283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory = NULL;
27293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
27303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
27323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : request
27333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Request function used as trigger
27353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
27373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @recvd_frame : buffer- this will be NULL since this is internal channel
27383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frameNumber : Undefined again since this is internal stream
27393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
27413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
27423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
27433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
27443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3RawDumpChannel::request(buffer_handle_t * /*buffer*/,
2745c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                                uint32_t /*frameNumber*/,
2746c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                                int & /*indexUsed*/)
27473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
27483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_bIsActive) {
27493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return QCamera3Channel::start();
27503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    else
27523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return 0;
27533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
27543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
27563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : intialize
27573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initializes channel params and creates underlying stream
27593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
27613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *    @isType : type of image stabilization required on this stream
27623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
27633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
27643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
27653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
27663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
27673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3RawDumpChannel::initialize(cam_is_type_t isType)
27683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
27693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc;
27703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = isType;
27723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::addStream(CAM_STREAM_TYPE_RAW,
27733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CAM_FORMAT_BAYER_MIPI_RAW_10BPP_GBRG, mDim, ROTATE_0, (uint8_t)mNumBuffers,
27743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mPostProcMask, mIsType);
27753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
27763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("addStream failed");
27773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
27793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
27808e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen
27818e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen/*************************************************************************************/
27828e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen// HDR+ RAW Source Channel related functions
27838e599494ee73f899a803d51b508249cebef5b4ddChien-Yu ChenQCamera3HdrPlusRawSrcChannel::QCamera3HdrPlusRawSrcChannel(uint32_t cam_handle,
27848e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen                    uint32_t channel_handle,
27858e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen                    mm_camera_ops_t *cam_ops,
27868e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen                    cam_dimension_t rawDumpSize,
27878e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen                    cam_padding_info_t *paddingInfo,
27888e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen                    void *userData,
2789e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                    cam_feature_mask_t postprocess_mask,
2790e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                    std::shared_ptr<HdrPlusClient> hdrPlusClient,
2791e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                    uint32_t hdrPlusStreamId,
2792e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                    uint32_t numBuffers) :
27938e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen    QCamera3RawDumpChannel(cam_handle, channel_handle, cam_ops, rawDumpSize, paddingInfo, userData,
2794e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                    postprocess_mask, numBuffers),
2795e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mHdrPlusClient(hdrPlusClient),
2796e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mHdrPlusStreamId(hdrPlusStreamId)
27978e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen{
2798e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
27998e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen}
28008e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen
28018e599494ee73f899a803d51b508249cebef5b4ddChien-Yu ChenQCamera3HdrPlusRawSrcChannel::~QCamera3HdrPlusRawSrcChannel()
28028e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen{
28038e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen}
28048e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen
28058e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chenvoid QCamera3HdrPlusRawSrcChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
28068e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen                            __unused QCamera3Stream *stream)
28078e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen{
28088e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen    if (super_frame == NULL || super_frame->num_bufs != 1) {
28098e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen        LOGE("super_frame is not valid");
28108e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen        return;
28118e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen    }
28128e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen
2813e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Send RAW buffer to HDR+ service
2814e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    sendRawToHdrPlusService(super_frame->bufs[0]);
28158e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen
28168e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen    bufDone(super_frame);
28178e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen    free(super_frame);
28188e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen}
28198e599494ee73f899a803d51b508249cebef5b4ddChien-Yu Chen
2820e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chenvoid QCamera3HdrPlusRawSrcChannel::sendRawToHdrPlusService(mm_camera_buf_def_t *frame)
2821e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen{
2822e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    QCamera3Stream *stream = getStreamByIndex(0);
2823e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (stream == nullptr) {
2824e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        LOGE("%s: Could not find stream.", __FUNCTION__);
2825e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return;
2826e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
2827e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
2828e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    cam_frame_len_offset_t offset = {};
2829e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    stream->getFrameOffset(offset);
2830e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
2831e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    pbcamera::StreamBuffer buffer;
2832e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    buffer.streamId = mHdrPlusStreamId;
2833e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    buffer.data = frame->buffer;
2834e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    buffer.dataSize = offset.frame_len;
2835e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
2836e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Use the frame timestamp as mock Easel timestamp.
2837e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    int64_t mockEaselTimestampNs = (int64_t)frame->ts.tv_sec * 1000000000 + frame->ts.tv_nsec;
2838e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mHdrPlusClient->notifyInputBuffer(buffer, mockEaselTimestampNs);
2839e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen}
2840e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
28413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*************************************************************************************/
28423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3YUVChannel methods */
28443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
28463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3YUVChannel
28473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
28483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCamera3YUVChannel
28493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
28503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
28513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
28523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
28533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cb_routine : callback routine to frame aggregator
28543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @paddingInfo : padding information for the stream
28553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream     : camera3_stream_t structure
28563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @stream_type: Channel stream type
28573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @postprocess_mask: the postprocess mask for streams of this channel
28583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @metadataChannel: handle to the metadataChannel
28593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
28603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
28613d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3YUVChannel::QCamera3YUVChannel(uint32_t cam_handle,
28623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t channel_handle,
28633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_ops_t *cam_ops,
28643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        channel_cb_routine cb_routine,
2865c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        channel_cb_buffer_err cb_buf_err,
28663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_padding_info_t *paddingInfo,
28673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *userData,
28683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_t *stream,
28693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_stream_type_t stream_type,
28703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_feature_mask_t postprocess_mask,
28713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Channel *metadataChannel) :
28723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera3ProcessingChannel(cam_handle, channel_handle, cam_ops,
2873c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    cb_routine, cb_buf_err, paddingInfo, userData, stream, stream_type,
28743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    postprocess_mask, metadataChannel)
28753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
28763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mBypass = (postprocess_mask == CAM_QCOM_FEATURE_NONE);
28783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mFrameLen = 0;
28793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mEdgeMode.edge_mode = CAM_EDGE_MODE_OFF;
28803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mEdgeMode.sharpness = 0;
28813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mNoiseRedMode = CAM_NOISE_REDUCTION_MODE_OFF;
28823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&mCropRegion, 0, sizeof(mCropRegion));
28833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
28843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
28863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCamera3YUVChannel
28873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
28883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCamera3YUVChannel
28893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
28903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
28913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
28923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
28933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
28943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
28953d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3YUVChannel::~QCamera3YUVChannel()
28963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
28973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   // Deallocation of heap buffers allocated in mMemory is freed
28983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   // automatically by its destructor
28993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
29003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
29023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : initialize
29033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
29043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Initialize and add camera channel & stream
29053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
29063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
29073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @isType    : the image stabilization type
29083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
29093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
29103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
29113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
29123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
29133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3YUVChannel::initialize(cam_is_type_t isType)
29143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2915e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_YUV_CH_INIT);
29163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
29173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t streamDim;
29183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == mCamera3Stream) {
29203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Camera stream uninitialized");
29213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
29223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
29233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (1 <= m_numStreams) {
29253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Only one stream per channel supported in v3 Hal
29263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
29273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
29283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType  = isType;
2930cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mStreamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_CALLBACK,
2931c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee            mCamera3Stream->width, mCamera3Stream->height, m_bUBWCenable, mIsType);
29323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.width = mCamera3Stream->width;
29333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.height = mCamera3Stream->height;
29343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::addStream(mStreamType,
29363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreamFormat,
29373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamDim,
29383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ROTATE_0,
29393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mNumBufs,
29403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mPostProcMask,
29413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mIsType);
29423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
29433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("addStream failed");
29443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
29453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
29463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_buf_plane_info_t buf_planes;
29483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_padding_info_t paddingInfo = mPaddingInfo;
29493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&buf_planes, 0, sizeof(buf_planes));
29513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //to ensure a big enough buffer size set the height and width
29523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //padding to max(height padding, width padding)
29533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    paddingInfo.width_padding = MAX(paddingInfo.width_padding, paddingInfo.height_padding);
29543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    paddingInfo.height_padding = paddingInfo.width_padding;
29553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mm_stream_calc_offset_snapshot(mStreamFormat, &streamDim, &paddingInfo,
29573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            &buf_planes);
29583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
29593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("mm_stream_calc_offset_preview failed");
29603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
29613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
29623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mFrameLen = buf_planes.plane_info.frame_len;
29643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR != rc) {
29663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Initialize failed, rc = %d", rc);
29673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
29683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
29693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* initialize offline meta memory for input reprocess */
29713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3ProcessingChannel::initialize(isType);
29723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR != rc) {
29733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Processing Channel initialize failed, rc = %d",
29743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 rc);
29753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
29763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
29783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
29793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
29803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
29813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : request
29823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
29833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: entry function for a request on a YUV stream. This function
29843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              has the logic to service a request based on its type
29853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
29863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
29873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buffer          : pointer to the output buffer
29883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frameNumber     : frame number of the request
29893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pInputBuffer    : pointer to input buffer if an input request
29903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata        : parameters associated with the request
2991e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel * @internalreq      : boolean to indicate if this is purely internal request
2992e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel *                    needing internal buffer allocation
2993e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel * @meteringonly    : boolean indicating metering only frame subset of internal
2994e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel *                    not consumed by postprocessor
29953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
29963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : 0 on a success start of capture
29973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -EINVAL on invalid input
29983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -ENODEV on serious error
29993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
30003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3YUVChannel::request(buffer_handle_t *buffer,
30013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t frameNumber,
30023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_buffer_t* pInputBuffer,
3003c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        metadata_buffer_t* metadata, bool &needMetadata,
3004e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        int &indexUsed,
3005e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        __unused bool internalRequest = false,
3006e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        __unused bool meteringOnly = false)
30073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
30083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
30093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    Mutex::Autolock lock(mOfflinePpLock);
30103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("pInputBuffer is %p frame number %d", pInputBuffer, frameNumber);
30123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == buffer || NULL == metadata) {
30133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid buffer/metadata in channel request");
30143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
30153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
30163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    PpInfo ppInfo;
30183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&ppInfo, 0, sizeof(ppInfo));
30193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ppInfo.frameNumber = frameNumber;
30203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ppInfo.offlinePpFlag = false;
30213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mBypass && !pInputBuffer ) {
30223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ppInfo.offlinePpFlag = needsFramePostprocessing(metadata);
30233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ppInfo.output = buffer;
30243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflinePpInfoList.push_back(ppInfo);
30253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
30263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("offlinePpFlag is %d", ppInfo.offlinePpFlag);
30283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    needMetadata = ppInfo.offlinePpFlag;
30293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!ppInfo.offlinePpFlag) {
30303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // regular request
30313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return QCamera3ProcessingChannel::request(buffer, frameNumber,
3032c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                pInputBuffer, metadata, indexUsed);
30333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
30343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        //we need to send this frame through the CPP
30363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        //Allocate heap memory, then buf done on the buffer
30373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t bufIdx;
30383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mFreeHeapBufferList.empty()) {
30393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mMemory.allocateOne(mFrameLen);
30403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc < 0) {
30413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Failed allocating heap buffer. Fatal");
30423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return BAD_VALUE;
30433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
30443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                bufIdx = (uint32_t)rc;
30453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
30463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
30473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bufIdx = *(mFreeHeapBufferList.begin());
30483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFreeHeapBufferList.erase(mFreeHeapBufferList.begin());
30493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
30503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        /* Configure and start postproc if necessary */
30523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        reprocess_config_t reproc_cfg;
30533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_dimension_t dim;
30543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&reproc_cfg, 0, sizeof(reprocess_config_t));
30553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&dim, 0, sizeof(dim));
30563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mStreams[0]->getFrameDimension(dim);
30573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        setReprocConfig(reproc_cfg, NULL, metadata, mStreamFormat, dim);
30583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Start postprocessor without input buffer
30603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        startPostProc(reproc_cfg);
30613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("erasing %d", bufIdx);
30633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory.markFrameNumber(bufIdx, frameNumber);
3065c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        indexUsed = bufIdx;
30663c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        if (m_bIsActive) {
30673c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            mStreams[0]->bufDone(bufIdx);
30683c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        }
30693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
30713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
30723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
30733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
30743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
307540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * FUNCTION   : postprocFail
307640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *
307740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * DESCRIPTION: notify clients about failing post-process requests.
307840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *
307940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * PARAMETERS :
308040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * @ppBuffer  : pointer to the pp buffer.
308140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *
308240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev * RETURN     : 0 on success
308340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *              -EINVAL on invalid input
308440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev *==========================================================================*/
308540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peevint32_t QCamera3YUVChannel::postprocFail(qcamera_hal3_pp_buffer_t *ppBuffer) {
308640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    if (ppBuffer == nullptr) {
308740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        return BAD_VALUE;
308840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    }
308940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
309040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    {
309140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        List<PpInfo>::iterator ppInfo;
309240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
309340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        Mutex::Autolock lock(mOfflinePpLock);
309440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        for (ppInfo = mOfflinePpInfoList.begin();
309540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev                ppInfo != mOfflinePpInfoList.end(); ppInfo++) {
309640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev            if (ppInfo->frameNumber == ppBuffer->frameNumber) {
309740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev                break;
309840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev            }
309940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        }
310040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
310140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        if (ppInfo == mOfflinePpInfoList.end()) {
310240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev            LOGE("Offline reprocess info for frame number: %d not found!", ppBuffer->frameNumber);
310340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev            return BAD_VALUE;
310440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        }
310540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
310640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        LOGE("Failed YUV post-process on frame number: %d removing from offline queue!",
310740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev                ppBuffer->frameNumber);
310840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        mOfflinePpInfoList.erase(ppInfo);
310940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    }
311040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
311140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    int32_t bufferIndex = mMemory.getHeapBufferIndex(ppBuffer->frameNumber);
311240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    if (bufferIndex < 0) {
311340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        LOGE("Fatal %d: no buffer index for frame number %d", bufferIndex, ppBuffer->frameNumber);
311440ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        return BAD_VALUE;
311540ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    } else {
311640ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        mMemory.markFrameNumber(bufferIndex, -1);
311740ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev        mFreeHeapBufferList.push_back(bufferIndex);
311840ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    }
311940ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
312040ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev    return QCamera3ProcessingChannel::postprocFail(ppBuffer);
312140ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev}
312240ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev
312340ba48ae0a3f2710f16c4fee53685002040595baEmilian Peev/*===========================================================================
31243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : streamCbRoutine
31253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
31263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION:
31273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
31283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
31293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : the super frame with filled buffer
31303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream      : stream on which the buffer was requested and filled
31313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
31323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
31333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
31343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3YUVChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
31353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *stream)
31363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3137e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_YUV_CH_STRM_CB);
31383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t frameIndex;
31393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t resultFrameNumber;
3140a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev    bool droppedInputPPBuffer = false;
31413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
31423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (checkStreamCbErrors(super_frame, stream) != NO_ERROR) {
31433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error with the stream callback");
31443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
31453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
31463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
31473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
31483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(frameIndex >= mNumBufs) {
31493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Error, Invalid index for buffer");
31503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         stream->bufDone(frameIndex);
31513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return;
31523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
31533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
31543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mBypass) {
315537ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev        {
315637ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            List<PpInfo>::iterator ppInfo;
31573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
315837ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            Mutex::Autolock lock(mOfflinePpLock);
315937ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            resultFrameNumber = mMemory.getFrameNumber(frameIndex);
316037ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            for (ppInfo = mOfflinePpInfoList.begin();
316137ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    ppInfo != mOfflinePpInfoList.end(); ppInfo++) {
316237ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                if (ppInfo->frameNumber == (uint32_t)resultFrameNumber) {
316337ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    break;
31643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
316537ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            }
316637ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            LOGD("frame index %d, frame number %d", frameIndex,
316737ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    resultFrameNumber);
316837ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            //check the reprocessing required flag against the frame number
316937ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            if (ppInfo == mOfflinePpInfoList.end()) {
317037ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                LOGE("Error, request for frame number is a reprocess.");
317137ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                stream->bufDone(frameIndex);
31723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return;
31733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
31743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
317537ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            if (ppInfo->offlinePpFlag) {
3176a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                if (ppInfo != mOfflinePpInfoList.begin() &&
3177a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                        IS_BUFFER_ERROR(super_frame->bufs[0]->flags)) {
3178a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    droppedInputPPBuffer = true;
3179a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    mOfflinePpInfoList.erase(ppInfo);
3180a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                } else {
3181a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    mm_camera_super_buf_t *frame =
318237ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                        (mm_camera_super_buf_t *)malloc(sizeof(
3183a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                                    mm_camera_super_buf_t));
3184a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    if (frame == NULL) {
3185a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                        LOGE("Error allocating memory to save received_frame structure.");
3186a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                        if(stream) {
3187a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                            stream->bufDone(frameIndex);
3188a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                        }
3189a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                        return;
319037ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    }
3191a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev
3192a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    *frame = *super_frame;
3193a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    m_postprocessor.processData(frame, ppInfo->output,
3194a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                            resultFrameNumber);
3195a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    free(super_frame);
319637ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    return;
31973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
31983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
319937ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                if (ppInfo != mOfflinePpInfoList.begin()) {
320037ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    // There is pending reprocess buffer, cache current buffer
320137ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    if (ppInfo->callback_buffer != NULL) {
320237ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                        LOGE("Fatal: cached callback_buffer is already present");
320337ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    }
320437ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    ppInfo->callback_buffer = super_frame;
320537ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    return;
320637ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                } else {
320737ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                    mOfflinePpInfoList.erase(ppInfo);
320837ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                }
32093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
32103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
321137ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev
321237ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev        if (IS_BUFFER_ERROR(super_frame->bufs[0]->flags)) {
321337ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev            mChannelCbBufErr(this, resultFrameNumber,
321437ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev                            CAMERA3_BUFFER_STATUS_ERROR, mUserData);
3215a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev            if (droppedInputPPBuffer) {
3216a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                camera3_stream_buffer_t result = {};
3217a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                result.buffer = (buffer_handle_t *)mMemory.getBufferHandle(frameIndex);
3218a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                int32_t bufferIndex =
3219a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    mMemory.getHeapBufferIndex(resultFrameNumber);
3220a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                if (bufferIndex < 0) {
3221a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    LOGE("Fatal %d: no buffer index for frame number %d",
3222a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                            bufferIndex, resultFrameNumber);
3223a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                } else {
3224a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    mMemory.markFrameNumber(bufferIndex, -1);
3225a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    mFreeHeapBufferList.push_back(bufferIndex);
3226a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                }
3227a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev
3228a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                LOGE("Input frame number: %d dropped!", resultFrameNumber);
3229a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                result.stream = mCamera3Stream;
3230a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                result.status = CAMERA3_BUFFER_STATUS_ERROR;
3231a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                result.acquire_fence = -1;
3232a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                result.release_fence = -1;
3233a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                if (mChannelCB) {
3234a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                    mChannelCB(NULL, &result, (uint32_t)resultFrameNumber, false, mUserData);
3235a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                }
3236a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                free(super_frame);
3237a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev
3238a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev                return;
3239a0545f73ba4ebf0393cc9dbb9e1b5272433bcec5Emilian Peev            }
324037ca0b4337fda1efaaf435150d5d3dd9e154fae3Emilian Peev        }
32413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
32423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
32433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3ProcessingChannel::streamCbRoutine(super_frame, stream);
3244c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
3245c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    /* return any pending buffers that were received out of order earlier */
3246c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    while((super_frame = getNextPendingCbBuffer())) {
3247c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        QCamera3ProcessingChannel::streamCbRoutine(super_frame, stream);
3248c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    }
3249c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
32503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
32513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
32523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
32533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3254c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * FUNCTION   : getNextPendingCbBuffer
3255c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
3256c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * DESCRIPTION: Returns the callback_buffer from the first entry of
3257c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *              mOfflinePpInfoList
3258c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
3259c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * PARAMETERS : none
3260c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
3261c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * RETURN     : callback_buffer
3262c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *==========================================================================*/
3263c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudelmm_camera_super_buf_t* QCamera3YUVChannel::getNextPendingCbBuffer() {
3264c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    mm_camera_super_buf_t* super_frame = NULL;
3265c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    if (mOfflinePpInfoList.size()) {
3266c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        if ((super_frame = mOfflinePpInfoList.begin()->callback_buffer)) {
3267c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            mOfflinePpInfoList.erase(mOfflinePpInfoList.begin());
3268c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        }
3269c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    }
3270c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    return super_frame;
3271c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel}
3272c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
3273c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel/*===========================================================================
32743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : reprocessCbRoutine
32753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
32763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback function for the reprocessed frame. This frame now
32773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              should be returned to the framework. This same callback is
32783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              used during input reprocessing or offline postprocessing
32793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
32803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
32813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultBuffer      : buffer containing the reprocessed data
32823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultFrameNumber : frame number on which the buffer was requested
32833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
32843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : NONE
32853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
32863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
32873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3YUVChannel::reprocessCbRoutine(buffer_handle_t *resultBuffer,
32883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t resultFrameNumber)
32893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
32903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("E: frame number %d", resultFrameNumber);
32913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    Vector<mm_camera_super_buf_t *> pendingCbs;
32923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
32933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* release the input buffer and input metadata buffer if used */
32943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 > mMemory.getHeapBufferIndex(resultFrameNumber)) {
32953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        /* mOfflineMemory and mOfflineMetaMemory used only for input reprocessing */
32963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t rc = releaseOfflineMemory(resultFrameNumber);
32973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc) {
32983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error releasing offline memory rc = %d", rc);
32993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        /* Since reprocessing is done, send the callback to release the input buffer */
33013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mChannelCB) {
33023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mChannelCB(NULL, NULL, resultFrameNumber, true, mUserData);
33033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mBypass) {
33073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t rc = handleOfflinePpCallback(resultFrameNumber, pendingCbs);
33083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
33093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return;
33103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    issueChannelCb(resultBuffer, resultFrameNumber);
33143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Call all pending callbacks to return buffers
33163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (size_t i = 0; i < pendingCbs.size(); i++) {
33173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3ProcessingChannel::streamCbRoutine(
33183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pendingCbs[i], mStreams[0]);
33193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
33223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
33243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : needsFramePostprocessing
33253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION:
33273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
33293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
33313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  TRUE if frame needs to be postprocessed
33323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *  FALSE is frame does not need to be postprocessed
33333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
33353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCamera3YUVChannel::needsFramePostprocessing(metadata_buffer_t *meta)
33363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
33373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    bool ppNeeded = false;
33383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //sharpness
33403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(cam_edge_application_t, edgeMode,
33413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CAM_INTF_META_EDGE_MODE, meta) {
33423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mEdgeMode = *edgeMode;
33433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //wnr
33463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(uint32_t, noiseRedMode,
33473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CAM_INTF_META_NOISE_REDUCTION_MODE, meta) {
33483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mNoiseRedMode = *noiseRedMode;
33493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //crop region
33523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(cam_crop_region_t, scalerCropRegion,
33533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CAM_INTF_META_SCALER_CROP_REGION, meta) {
33543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mCropRegion = *scalerCropRegion;
33553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((CAM_EDGE_MODE_OFF != mEdgeMode.edge_mode) &&
33583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (CAM_EDGE_MODE_ZERO_SHUTTER_LAG != mEdgeMode.edge_mode)) {
33593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ppNeeded = true;
33603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((CAM_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG != mNoiseRedMode) &&
33623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (CAM_NOISE_REDUCTION_MODE_OFF != mNoiseRedMode) &&
33633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (CAM_NOISE_REDUCTION_MODE_MINIMAL != mNoiseRedMode)) {
33643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ppNeeded = true;
33653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((mCropRegion.width < (int32_t)mCamera3Stream->width) ||
33673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (mCropRegion.height < (int32_t)mCamera3Stream->height)) {
33683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ppNeeded = true;
33693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
33703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return ppNeeded;
33723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
33733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
33753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : handleOfflinePpCallback
33763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback function for the reprocessed frame from offline
33783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              postprocessing.
33793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
33813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @resultFrameNumber : frame number on which the buffer was requested
33823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pendingCbs        : pending buffers to be returned first
33833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
33853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
33863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
33873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
33883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3YUVChannel::handleOfflinePpCallback(uint32_t resultFrameNumber,
33893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            Vector<mm_camera_super_buf_t *>& pendingCbs)
33903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
33913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    Mutex::Autolock lock(mOfflinePpLock);
33923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    List<PpInfo>::iterator ppInfo;
33933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
33943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (ppInfo = mOfflinePpInfoList.begin();
33953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ppInfo != mOfflinePpInfoList.end(); ppInfo++) {
33963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (ppInfo->frameNumber == resultFrameNumber) {
33973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
33983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
33993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
34003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (ppInfo == mOfflinePpInfoList.end()) {
34023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGI("Request of frame number %d is reprocessing",
34033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 resultFrameNumber);
34043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
34053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (ppInfo != mOfflinePpInfoList.begin()) {
34063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("callback for frame number %d should be head of list",
34073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 resultFrameNumber);
34083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
34093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
34103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (ppInfo->offlinePpFlag) {
34123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Need to get the input buffer frame index from the
34133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // mMemory object and add that to the free heap buffers list.
34143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t bufferIndex =
34153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mMemory.getHeapBufferIndex(resultFrameNumber);
34163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (bufferIndex < 0) {
34173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Fatal %d: no buffer index for frame number %d",
34183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     bufferIndex, resultFrameNumber);
34193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return BAD_VALUE;
34203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel        mMemory.markFrameNumber(bufferIndex, -1);
3422c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        mFreeHeapBufferList.push_back(bufferIndex);
34239e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel        //Move heap buffer into free pool and invalidate the frame number
34243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ppInfo = mOfflinePpInfoList.erase(ppInfo);
34253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3426c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        /* return any pending buffers that were received out of order
3427c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            earlier */
3428c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        mm_camera_super_buf_t* super_frame;
3429c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        while((super_frame = getNextPendingCbBuffer())) {
3430c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            pendingCbs.push_back(super_frame);
34313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
34333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Fatal: request of frame number %d doesn't need"
34343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                " offline postprocessing. However there is"
34353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                " reprocessing callback.",
34363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                resultFrameNumber);
34373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
34383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
34393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
34413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
34423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
34443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getReprocessType
34453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
34463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: get the type of reprocess output supported by this channel
34473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
34483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : NONE
34493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
34503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : reprocess_type_t : type of reprocess
34513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
34523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelreprocess_type_t QCamera3YUVChannel::getReprocessType()
34533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
34543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return REPROCESS_TYPE_YUV;
34553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
34563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3PicChannel methods */
34583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
34603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : jpegEvtHandle
34613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
34623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Function registerd to mm-jpeg-interface to handle jpeg events.
34633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                Construct result payload and call mChannelCb to deliver buffer
34643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                to framework.
34653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
34663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
34673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @status    : status of jpeg job
34683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @client_hdl: jpeg client handle
34693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @jobId     : jpeg job Id
34703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @p_ouput   : ptr to jpeg output result struct
34713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @userdata  : user data ptr
34723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
34733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
34743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
34753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3PicChannel::jpegEvtHandle(jpeg_job_status_t status,
34763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              uint32_t /*client_hdl*/,
34773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              uint32_t jobId,
34783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              mm_jpeg_output_t *p_output,
34793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                              void *userdata)
34803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3481e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_PIC_CH_JPEG_EVT_HANDLE);
34823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    buffer_handle_t *resultBuffer = NULL;
34833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    buffer_handle_t *jpegBufferHandle = NULL;
34843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int resultStatus = CAMERA3_BUFFER_STATUS_OK;
34853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera3_stream_buffer_t result;
34863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera3_jpeg_blob_t jpegHeader;
34873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3PicChannel *obj = (QCamera3PicChannel *)userdata;
34893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (obj) {
34903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        //Construct payload for process_capture_result. Call mChannelCb
34913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_hal3_jpeg_data_t *job = obj->m_postprocessor.findJpegJobByJobId(jobId);
34933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ((job == NULL) || (status == JPEG_JOB_STATUS_ERROR)) {
34953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error in jobId: (%d) with status: %d", jobId, status);
34963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            resultStatus = CAMERA3_BUFFER_STATUS_ERROR;
34973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
34983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
34993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NULL != job) {
35003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            uint32_t bufIdx = (uint32_t)job->jpeg_settings->out_buf_index;
35013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("jpeg out_buf_index: %d", bufIdx);
35023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            //Construct jpeg transient header of type camera3_jpeg_blob_t
35043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            //Append at the end of jpeg image of buf_filled_len size
35053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            jpegHeader.jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
35073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (JPEG_JOB_STATUS_DONE == status) {
35083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                jpegHeader.jpeg_size = (uint32_t)p_output->buf_filled_len;
35093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                char* jpeg_buf = (char *)p_output->buf_vaddr;
3510cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                cam_frame_len_offset_t offset;
3511cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                memset(&offset, 0, sizeof(cam_frame_len_offset_t));
3512cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                mm_camera_buf_def_t *jpeg_dump_buffer = NULL;
3513cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                cam_dimension_t dim;
3514cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                dim.width = obj->mCamera3Stream->width;
3515cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                dim.height = obj->mCamera3Stream->height;
3516cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                jpeg_dump_buffer = (mm_camera_buf_def_t *)malloc(sizeof(mm_camera_buf_def_t));
3517cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                if(!jpeg_dump_buffer) {
3518cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    LOGE("Could not allocate jpeg dump buffer");
3519cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                } else {
3520cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    jpeg_dump_buffer->buffer = p_output->buf_vaddr;
3521cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    jpeg_dump_buffer->frame_len = p_output->buf_filled_len;
3522cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    jpeg_dump_buffer->frame_idx = obj->mMemory.getFrameNumber(bufIdx);
3523cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    obj->dumpYUV(jpeg_dump_buffer, dim, offset, QCAMERA_DUMP_FRM_OUTPUT_JPEG);
3524cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                    free(jpeg_dump_buffer);
3525cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel                }
35263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ssize_t maxJpegSize = -1;
35283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Gralloc buffer may have additional padding for 4K page size
35303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Follow size guidelines based on spec since framework relies
35313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // on that to reach end of buffer and with it the header
35323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                //Handle same as resultBuffer, but for readablity
35343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                jpegBufferHandle =
35353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (buffer_handle_t *)obj->mMemory.getBufferHandle(bufIdx);
35363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (NULL != jpegBufferHandle) {
35383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    maxJpegSize = ((private_handle_t*)(*jpegBufferHandle))->width;
35393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (maxJpegSize > obj->mMemory.getSize(bufIdx)) {
35403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        maxJpegSize = obj->mMemory.getSize(bufIdx);
35413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
35423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    size_t jpeg_eof_offset =
35443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            (size_t)(maxJpegSize - (ssize_t)sizeof(jpegHeader));
35453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    char *jpeg_eof = &jpeg_buf[jpeg_eof_offset];
35463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    memcpy(jpeg_eof, &jpegHeader, sizeof(jpegHeader));
35473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    obj->mMemory.cleanInvalidateCache(bufIdx);
35483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
35493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("JPEG buffer not found and index: %d",
35503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            bufIdx);
35513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    resultStatus = CAMERA3_BUFFER_STATUS_ERROR;
35523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
35533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
35543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ////Use below data to issue framework callback
35563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            resultBuffer =
35573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    (buffer_handle_t *)obj->mMemory.getBufferHandle(bufIdx);
35583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t resultFrameNumber = obj->mMemory.getFrameNumber(bufIdx);
35593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t rc = obj->mMemory.unregisterBuffer(bufIdx);
35603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
35613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error %d unregistering stream buffer %d",
35623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc, bufIdx);
35633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
35643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.stream = obj->mCamera3Stream;
35663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.buffer = resultBuffer;
35673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.status = resultStatus;
35683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.acquire_fence = -1;
35693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            result.release_fence = -1;
35703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Release any snapshot buffers before calling
35723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // the user callback. The callback can potentially
35733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // unblock pending requests to snapshot stream.
35743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t snapshotIdx = -1;
35753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mm_camera_super_buf_t* src_frame = NULL;
35763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (job->src_reproc_frame)
35783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                src_frame = job->src_reproc_frame;
35793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            else
35803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                src_frame = job->src_frame;
35813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (src_frame) {
35833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (obj->mStreams[0]->getMyHandle() ==
35843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        src_frame->bufs[0]->stream_id) {
35853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    snapshotIdx = (int32_t)src_frame->bufs[0]->buf_idx;
358672c75ca34e4a91a632329548fd5d26b1320476c4Shuzhen Wang                    if (0 <= snapshotIdx) {
358772c75ca34e4a91a632329548fd5d26b1320476c4Shuzhen Wang                        Mutex::Autolock lock(obj->mFreeBuffersLock);
358872c75ca34e4a91a632329548fd5d26b1320476c4Shuzhen Wang                        obj->mFreeBufferList.push_back((uint32_t)snapshotIdx);
358972c75ca34e4a91a632329548fd5d26b1320476c4Shuzhen Wang                    }
35903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
35913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
35923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
35933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGI("Issue Jpeg Callback frameNumber = %d status = %d",
35943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    resultFrameNumber, resultStatus);
3595850a7c2e7b35c456f51c267feb223557356bd063Shuzhen Wang            ATRACE_ASYNC_END("SNAPSHOT", resultFrameNumber);
35963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (obj->mChannelCB) {
35973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                obj->mChannelCB(NULL,
35983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        &result,
35993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (uint32_t)resultFrameNumber,
36003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        false,
36013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        obj->mUserData);
36023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
36033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // release internal data for jpeg job
36053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ((NULL != job->fwk_frame) || (NULL != job->fwk_src_buffer)) {
36063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                /* unregister offline input buffer */
36073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                int32_t inputBufIndex =
36083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        obj->mOfflineMemory.getGrallocBufferIndex((uint32_t)resultFrameNumber);
36093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (0 <= inputBufIndex) {
36103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    rc = obj->mOfflineMemory.unregisterBuffer(inputBufIndex);
36113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
36123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("could not find the input buf index, frame number %d",
36133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             resultFrameNumber);
36143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
36153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (NO_ERROR != rc) {
36163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("Error %d unregistering input buffer %d",
36173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             rc, bufIdx);
36183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
36193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                /* unregister offline meta buffer */
36213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                int32_t metaBufIndex =
36223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        obj->mOfflineMetaMemory.getHeapBufferIndex((uint32_t)resultFrameNumber);
36233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (0 <= metaBufIndex) {
36243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    Mutex::Autolock lock(obj->mFreeOfflineMetaBuffersLock);
36253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    obj->mFreeOfflineMetaBuffersList.push_back((uint32_t)metaBufIndex);
36263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
36273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("could not find the input meta buf index, frame number %d",
36283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                             resultFrameNumber);
36293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
36303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
36313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            obj->m_postprocessor.releaseOfflineBuffers(false);
36323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            obj->m_postprocessor.releaseJpegJobData(job);
36333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            free(job);
36343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
36353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
36373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // }
36383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
36393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Null userdata in jpeg callback");
36403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
36413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
36423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36433d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3PicChannel::QCamera3PicChannel(uint32_t cam_handle,
36443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    uint32_t channel_handle,
36453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mm_camera_ops_t *cam_ops,
36463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    channel_cb_routine cb_routine,
3647c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                    channel_cb_buffer_err cb_buf_err,
36483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_padding_info_t *paddingInfo,
36493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    void *userData,
36503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    camera3_stream_t *stream,
36513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_feature_mask_t postprocess_mask,
36523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    __unused bool is4KVideo,
36533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    bool isInputStreamConfigured,
36543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    QCamera3Channel *metadataChannel,
36553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    uint32_t numBuffers) :
36563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3ProcessingChannel(cam_handle, channel_handle,
3657c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                cam_ops, cb_routine, cb_buf_err, paddingInfo, userData,
36583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                stream, CAM_STREAM_TYPE_SNAPSHOT,
36593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                postprocess_mask, metadataChannel, numBuffers),
36603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mNumSnapshotBufs(0),
36613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mInputBufferHint(isInputStreamConfigured),
36623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mYuvMemory(NULL),
36633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mFrameLen(0)
36643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
36653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)mUserData;
36663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_max_pic_dim = hal_obj->calcMaxJpegDim();
36673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mYuvWidth = stream->width;
36683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mYuvHeight = stream->height;
36693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mStreamType = CAM_STREAM_TYPE_SNAPSHOT;
36703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Use same pixelformat for 4K video case
3671cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel    mStreamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_SNAPSHOT,
3672c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee            stream->width, stream->height, m_bUBWCenable, IS_TYPE_NONE);
36733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = m_postprocessor.initJpeg(jpegEvtHandle, &m_max_pic_dim, this);
36743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc != 0) {
36753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Init Postprocessor failed");
36763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
36773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
36783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
36803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : flush
36813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
36823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush pic channel, which will stop all processing within, including
36833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              the reprocessing channel in postprocessor and YUV stream.
36843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
36853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
36863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
36873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
36883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
36893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
36903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
36913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3PicChannel::flush()
36923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
36933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
36943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!m_bIsActive) {
36953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Attempt to flush inactive channel");
36963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
36973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
36983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
36993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = m_postprocessor.flush();
37003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == 0) {
37013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Postprocessor flush failed, rc = %d", rc);
37023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
37033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 < mOfflineMetaMemory.getCnt()) {
37063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineMetaMemory.deallocate();
37073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 < mOfflineMemory.getCnt()) {
37093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineMemory.unregisterBuffers();
37103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    Mutex::Autolock lock(mFreeBuffersLock);
37123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mFreeBufferList.clear();
3713e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
37143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < mCamera3Stream->max_buffers; i++) {
37153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFreeBufferList.push_back(i);
37163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
37183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
37193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37213d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3PicChannel::~QCamera3PicChannel()
37223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
37233c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    if (mYuvMemory != nullptr) {
37243c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        mYuvMemory->deallocate();
37253c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        delete mYuvMemory;
37263c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        mYuvMemory = nullptr;
37273c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    }
37283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
37293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3730e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen/*===========================================================================
3731e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen * FUNCTION : metadataBufDone
3732e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen *
3733e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen * DESCRIPTION: Buffer done method for a metadata buffer
3734e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen *
3735e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen * PARAMETERS :
3736e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen * @recvd_frame : received metadata frame
3737e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen *
3738e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen * RETURN     : int32_t type of status
3739e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen *              OK  -- success
3740e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen *              none-zero failure code
3741e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen *==========================================================================*/
3742e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chenint32_t QCamera3PicChannel::metadataBufDone(mm_camera_super_buf_t *recvd_frame)
3743e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen{
3744e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Check if this is an external metadata
3745e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (recvd_frame != nullptr && recvd_frame->num_bufs == 1) {
3746e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        Mutex::Autolock lock(mPendingExternalMetadataLock);
3747e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        auto iter = mPendingExternalMetadata.begin();
3748e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        while (iter != mPendingExternalMetadata.end()) {
3749e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            if (iter->get() == recvd_frame->bufs[0]->buffer) {
3750e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                // Remove the metadata allocated externally.
3751e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                mPendingExternalMetadata.erase(iter);
3752e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                return OK;
3753e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            }
3754e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
3755e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            iter++;
3756e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        }
3757e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
3758e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
3759e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // If this is not an external metadata, return the metadata.
3760e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    return QCamera3ProcessingChannel::metadataBufDone(recvd_frame);
3761e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen}
3762e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
37633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3PicChannel::initialize(cam_is_type_t isType)
37643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
37653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
37663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t streamDim;
37673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_type_t streamType;
37683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_format_t streamFormat;
37693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == mCamera3Stream) {
37713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Camera stream uninitialized");
37723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
37733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (1 <= m_numStreams) {
37763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Only one stream per channel supported in v3 Hal
37773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
37783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = isType;
37813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamType = mStreamType;
37823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamFormat = mStreamFormat;
37833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.width = (int32_t)mYuvWidth;
37843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamDim.height = (int32_t)mYuvHeight;
37853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mNumSnapshotBufs = mCamera3Stream->max_buffers;
37873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::addStream(streamType, streamFormat, streamDim,
37883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ROTATE_0, (uint8_t)mCamera3Stream->max_buffers, mPostProcMask,
37893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mIsType);
37903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR != rc) {
37923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Initialize failed, rc = %d", rc);
37933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
37943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
37953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
37963c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    mYuvMemory = new QCamera3StreamMem(mCamera3Stream->max_buffers);
37973c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    if (!mYuvMemory) {
37983c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        LOGE("unable to create YUV buffers");
37993c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        return NO_MEMORY;
38003c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    }
38013c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    cam_stream_buf_plane_info_t buf_planes;
38023c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    cam_padding_info_t paddingInfo = mPaddingInfo;
38033c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang
38043c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    memset(&buf_planes, 0, sizeof(buf_planes));
38053c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    //to ensure a big enough buffer size set the height and width
38063c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    //padding to max(height padding, width padding)
38073c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    paddingInfo.width_padding = MAX(paddingInfo.width_padding, paddingInfo.height_padding);
38083c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    paddingInfo.height_padding = paddingInfo.width_padding;
38093c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang
38103c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    rc = mm_stream_calc_offset_snapshot(mStreamFormat, &streamDim, &paddingInfo,
38113c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            &buf_planes);
38123c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    if (rc < 0) {
38133c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        LOGE("mm_stream_calc_offset_preview failed");
38143c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        return rc;
38153c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    }
38163c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang    mFrameLen = buf_planes.plane_info.frame_len;
38173c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang
38183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* initialize offline meta memory for input reprocess */
38193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3ProcessingChannel::initialize(isType);
38203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR != rc) {
38213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Processing Channel initialize failed, rc = %d",
38223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 rc);
38233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
38243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
38263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
38273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
38293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : request
38303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: handle the request - either with an input buffer or a direct
38323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              output request
38333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
38353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buffer       : pointer to the output buffer
38363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frameNumber  : frame number of the request
38373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pInputBuffer : pointer to input buffer if an input request
38383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata     : parameters associated with the request
3839e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel * @internalreq      : boolean to indicate if this is purely internal request
3840e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel *                    needing internal buffer allocation
3841e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel * @meteringonly    : boolean indicating metering only frame subset of internal
3842e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel *                    not consumed by postprocessor
38433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
38443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : 0 on a success start of capture
38453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -EINVAL on invalid input
38463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              -ENODEV on serious error
38473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
38483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3PicChannel::request(buffer_handle_t *buffer,
38493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t frameNumber,
38503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera3_stream_buffer_t *pInputBuffer,
3851e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        metadata_buffer_t *metadata, int &indexUsed,
3852e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        bool internalRequest, bool meteringOnly)
38533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3854e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_PIC_CH_REQ);
38553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //FIX ME: Return buffer back in case of failures below.
38563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
38583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
38593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config_t reproc_cfg;
38603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t dim;
38613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&reproc_cfg, 0, sizeof(reprocess_config_t));
38623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //make sure to set the correct input stream dim in case of YUV size override
38633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //and recalculate the plane info
38643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dim.width = (int32_t)mYuvWidth;
38653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dim.height = (int32_t)mYuvHeight;
3866e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
38673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    setReprocConfig(reproc_cfg, pInputBuffer, metadata, mStreamFormat, dim);
38683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3869e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    // Start postprocessor
3870e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    startPostProc(reproc_cfg);
38713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3872e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    if (!internalRequest) {
3873e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        int index = mMemory.getMatchBufIndex((void*)buffer);
38743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3875e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        if(index < 0) {
3876e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            rc = registerBuffer(buffer, mIsType);
3877e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            if (NO_ERROR != rc) {
3878e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                LOGE("On-the-fly buffer registration failed %d",
3879e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                         rc);
3880e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                return rc;
3881e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            }
3882e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
3883e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            index = mMemory.getMatchBufIndex((void*)buffer);
3884e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            if (index < 0) {
3885e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                LOGE("Could not find object among registered buffers");
3886e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel                return DEAD_OBJECT;
3887e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            }
38883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3889e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        LOGD("buffer index %d, frameNumber: %u", index, frameNumber);
38903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3891e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        rc = mMemory.markFrameNumber((uint32_t)index, frameNumber);
38923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3893e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        // Queue jpeg settings
3894e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        rc = queueJpegSetting((uint32_t)index, metadata);
3895e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
3896e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    } else {
3897e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        LOGD("Internal request @ Picchannel");
3898e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
38993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (pInputBuffer == NULL) {
39023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mFreeBuffersLock);
39033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t bufIdx;
39043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mFreeBufferList.empty()) {
3905367f2cbfbb2efea55aca34a1ae69f86681869b2eChien-Yu Chen            rc = mYuvMemory->allocateOne(mFrameLen, /*isCached*/false);
39063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc < 0) {
39073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Failed to allocate heap buffer. Fatal");
39083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
39093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
39103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                bufIdx = (uint32_t)rc;
39113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
39123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
39133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            List<uint32_t>::iterator it = mFreeBufferList.begin();
39143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bufIdx = *it;
39153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFreeBufferList.erase(it);
39163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3917e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        if (meteringOnly) {
3918e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            mYuvMemory->markFrameNumber(bufIdx, 0xFFFFFFFF);
3919e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        } else {
3920e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            mYuvMemory->markFrameNumber(bufIdx, frameNumber);
3921e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        }
39223c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        if (m_bIsActive) {
39233c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            mStreams[0]->bufDone(bufIdx);
39243c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        }
3925c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        indexUsed = bufIdx;
39263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
39273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_fwk_input_pp_data_t *src_frame = NULL;
39283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        src_frame = (qcamera_fwk_input_pp_data_t *)calloc(1,
39293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                sizeof(qcamera_fwk_input_pp_data_t));
39303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (src_frame == NULL) {
39313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("No memory for src frame");
39323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return NO_MEMORY;
39333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
39343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = setFwkInputPPData(src_frame, pInputBuffer, &reproc_cfg, metadata,
39353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                NULL /*fwk output buffer*/, frameNumber);
39363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc) {
39373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error %d while setting framework input PP data", rc);
39383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            free(src_frame);
39393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
39403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
39413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGH("Post-process started");
39423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_postprocessor.processData(src_frame);
39433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
39443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
39453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
39463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
39503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : dataNotifyCB
39513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
39523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Channel Level callback used for super buffer data notify.
39533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              This function is registered with mm-camera-interface to handle
39543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              data notify
39553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
39563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
39573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @recvd_frame   : stream frame received
39583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   userdata       : user data ptr
39593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
39603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
39613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
39623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3PicChannel::dataNotifyCB(mm_camera_super_buf_t *recvd_frame,
39633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 void *userdata)
39643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3965e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_PIC_CH_DATA_NOTIFY_CB);
39663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("E\n");
39673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3PicChannel *channel = (QCamera3PicChannel *)userdata;
39683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (channel == NULL) {
39703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("invalid channel pointer");
39713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
39723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
39733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(channel->m_numStreams != 1) {
39753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error: Bug: This callback assumes one stream per channel");
39763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
39773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
39783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(channel->mStreams[0] == NULL) {
39813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error: Invalid Stream object");
39823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
39833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
39843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    channel->QCamera3PicChannel::streamCbRoutine(recvd_frame, channel->mStreams[0]);
39863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("X\n");
39883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
39893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
39903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
39913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
39923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : streamCbRoutine
39933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
39943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION:
39953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
39963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
39973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @super_frame : the super frame with filled buffer
39983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream      : stream on which the buffer was requested and filled
39993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
40003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
40013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
40023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3PicChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
40033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            QCamera3Stream *stream)
40043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
40059ec39c64004dda78086849a21087cb217d0bf6acThierry Strudel    KPI_ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_CAPTURE_CH_CB);
40063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //TODO
40073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Used only for getting YUV. Jpeg callback will be sent back from channel
40083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //directly to HWI. Refer to func jpegEvtHandle
40093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Got the yuv callback. Calling yuv callback handler in PostProc
40113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t frameIndex;
40123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_super_buf_t* frame = NULL;
40133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t dim;
40143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_frame_len_offset_t offset;
40153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&dim, 0, sizeof(dim));
40173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&offset, 0, sizeof(cam_frame_len_offset_t));
40183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (checkStreamCbErrors(super_frame, stream) != NO_ERROR) {
40203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error with the stream callback");
40213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
40223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
40233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
40253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("recvd buf_idx: %u for further processing",
40263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         (uint32_t)frameIndex);
40273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(frameIndex >= mNumSnapshotBufs) {
40283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Error, Invalid index for buffer");
40293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         if(stream) {
40303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             Mutex::Autolock lock(mFreeBuffersLock);
40313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             mFreeBufferList.push_back(frameIndex);
40323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             stream->bufDone(frameIndex);
40333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         }
40343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return;
40353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
40363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4037e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    if ((uint32_t)mYuvMemory->getFrameNumber(frameIndex) == EMPTY_FRAMEWORK_FRAME_NUMBER) {
4038e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        LOGD("Internal Request recycle frame");
4039e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        Mutex::Autolock lock(mFreeBuffersLock);
4040e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        mFreeBufferList.push_back(frameIndex);
4041e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        return;
4042e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
4043e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
40443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t));
40453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (frame == NULL) {
40463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       LOGE("Error allocating memory to save received_frame structure.");
40473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       if(stream) {
40483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           Mutex::Autolock lock(mFreeBuffersLock);
40493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           mFreeBufferList.push_back(frameIndex);
40503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           stream->bufDone(frameIndex);
40513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       }
40523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       return;
40533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
40543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    *frame = *super_frame;
40553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    stream->getFrameDimension(dim);
40563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    stream->getFrameOffset(offset);
40573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dumpYUV(frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_INPUT_REPROCESS);
40583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4059c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    if (IS_BUFFER_ERROR(super_frame->bufs[0]->flags)) {
4060c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        mChannelCbBufErr(this, mYuvMemory->getFrameNumber(frameIndex),
4061c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                CAMERA3_BUFFER_STATUS_ERROR, mUserData);
4062c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    }
4063c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
40643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_postprocessor.processData(frame);
40653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    free(super_frame);
40663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
40673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
40683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40693c077d73494b534143fe755b85ea6c68604ebc26Shuzhen WangQCamera3StreamMem* QCamera3PicChannel::getStreamBufs(uint32_t /*len*/)
40703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
40713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return mYuvMemory;
40723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
40733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3PicChannel::putStreamBufs()
40753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
40763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3ProcessingChannel::putStreamBufs();
40776e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev    Mutex::Autolock lock(mFreeBuffersLock);
40783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mFreeBufferList.clear();
40796e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev
40806e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev    if (nullptr != mYuvMemory) {
40816e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev        uint32_t count = mYuvMemory->getCnt();
40826e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev        for (uint32_t i = 0; i < count; i++) {
40836e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev            mFreeBufferList.push_back(i);
40846e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev        }
40856e7b7ad377748ad7f5c65c4e3bce3e93d248bd4aEmilian Peev    }
40863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
40873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3PicChannel::queueJpegSetting(uint32_t index, metadata_buffer_t *metadata)
40893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
40903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)mUserData;
40913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    jpeg_settings_t *settings =
40923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (jpeg_settings_t *)malloc(sizeof(jpeg_settings_t));
40933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!settings) {
40953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("out of memory allocating jpeg_settings");
40963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENOMEM;
40973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
40983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
40993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(settings, 0, sizeof(jpeg_settings_t));
41003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    settings->out_buf_index = index;
41023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    settings->jpeg_orientation = 0;
41043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(int32_t, orientation, CAM_INTF_META_JPEG_ORIENTATION, metadata) {
41053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->jpeg_orientation = *orientation;
41063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    settings->jpeg_quality = 85;
41093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(uint32_t, quality1, CAM_INTF_META_JPEG_QUALITY, metadata) {
41103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->jpeg_quality = (uint8_t) *quality1;
41113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(uint32_t, quality2, CAM_INTF_META_JPEG_THUMB_QUALITY, metadata) {
41143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->jpeg_thumb_quality = (uint8_t) *quality2;
41153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(cam_dimension_t, dimension, CAM_INTF_META_JPEG_THUMB_SIZE, metadata) {
41183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->thumbnail_size = *dimension;
41193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    settings->gps_timestamp_valid = 0;
41223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(int64_t, timestamp, CAM_INTF_META_JPEG_GPS_TIMESTAMP, metadata) {
41233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->gps_timestamp = *timestamp;
41243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->gps_timestamp_valid = 1;
41253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    settings->gps_coordinates_valid = 0;
41283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(double, coordinates, CAM_INTF_META_JPEG_GPS_COORDINATES, metadata) {
41293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memcpy(settings->gps_coordinates, coordinates, 3*sizeof(double));
41303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->gps_coordinates_valid = 1;
41313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(uint8_t, proc_methods, CAM_INTF_META_JPEG_GPS_PROC_METHODS, metadata) {
41343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(settings->gps_processing_method, 0,
41353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                sizeof(settings->gps_processing_method));
41363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        strlcpy(settings->gps_processing_method, (const char *)proc_methods,
41373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                sizeof(settings->gps_processing_method));
41383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4140e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    settings->hdr_snapshot = 0;
4141e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    IF_META_AVAILABLE(cam_hdr_param_t, hdr_info, CAM_INTF_PARM_HAL_BRACKETING_HDR, metadata) {
4142e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        if (hdr_info->hdr_enable) {
4143e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel            settings->hdr_snapshot = 1;
4144e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel        }
4145e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    }
4146e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
4147e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel
41483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Image description
41493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    const char *eepromVersion = hal_obj->getEepromVersionInfo();
41503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    const uint32_t *ldafCalib = hal_obj->getLdafCalib();
4151082a4d7613ab566ff52b323790589fb5a14e1eeeArnd Geis    const char *easelFwVersion = hal_obj->getEaselFwVersion();
41523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((eepromVersion && strlen(eepromVersion)) ||
4153f1e8b151b3b2a7a1e8ba4c18b3b9254d146b278aChien-Yu Chen            ldafCalib || easelFwVersion) {
4154f1e8b151b3b2a7a1e8ba4c18b3b9254d146b278aChien-Yu Chen        uint32_t len = 0;
41553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        settings->image_desc_valid = true;
41563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (eepromVersion && strlen(eepromVersion)) {
41573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            len = snprintf(settings->image_desc, sizeof(settings->image_desc),
4158082a4d7613ab566ff52b323790589fb5a14e1eeeArnd Geis                    "%s", eepromVersion);
41593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
41603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (ldafCalib) {
4161082a4d7613ab566ff52b323790589fb5a14e1eeeArnd Geis            len += snprintf(settings->image_desc + len,
41623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    sizeof(settings->image_desc) - len, "L:%u-%u",
41633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    ldafCalib[0], ldafCalib[1]);
41643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4165082a4d7613ab566ff52b323790589fb5a14e1eeeArnd Geis        if (easelFwVersion) {
4166082a4d7613ab566ff52b323790589fb5a14e1eeeArnd Geis            ALOGD("%s: Easel FW version %s", __FUNCTION__, easelFwVersion);
4167f1e8b151b3b2a7a1e8ba4c18b3b9254d146b278aChien-Yu Chen            if (len > 0 && len < sizeof(settings->image_desc)) {
4168f1e8b151b3b2a7a1e8ba4c18b3b9254d146b278aChien-Yu Chen                settings->image_desc[len] = ',';
4169f1e8b151b3b2a7a1e8ba4c18b3b9254d146b278aChien-Yu Chen                len++;
4170f1e8b151b3b2a7a1e8ba4c18b3b9254d146b278aChien-Yu Chen            }
4171082a4d7613ab566ff52b323790589fb5a14e1eeeArnd Geis            len += snprintf(settings->image_desc + len,
4172f1e8b151b3b2a7a1e8ba4c18b3b9254d146b278aChien-Yu Chen                            sizeof(settings->image_desc) - len, "E-ver:%s", easelFwVersion);
4173082a4d7613ab566ff52b323790589fb5a14e1eeeArnd Geis        }
41743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
41753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return m_postprocessor.processJpegSettingData(settings);
41773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
41783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3PicChannel::overrideYuvSize(uint32_t width, uint32_t height)
41813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
41823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   mYuvWidth = width;
41833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   mYuvHeight = height;
41843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
41853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
41863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
41873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getReprocessType
41883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
41893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: get the type of reprocess output supported by this channel
41903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
41913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : NONE
41923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
41933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : reprocess_type_t : type of reprocess
41943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
41953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelreprocess_type_t QCamera3PicChannel::getReprocessType()
41963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
41973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* a picture channel could either use the postprocessor for reprocess+jpeg
41983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       or only for reprocess */
41993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_type_t expectedReprocess;
42003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mPostProcMask == CAM_QCOM_FEATURE_NONE || mInputBufferHint) {
42013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        expectedReprocess = REPROCESS_TYPE_JPEG;
42023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
42033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        expectedReprocess = REPROCESS_TYPE_NONE;
42043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
42053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("expectedReprocess from Pic Channel is %d", expectedReprocess);
42063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return expectedReprocess;
42073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
42083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
42093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
42103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4211c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * FUNCTION   : timeoutFrame
4212c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
4213c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * DESCRIPTION: Method to indicate to channel that a given frame has take too
4214c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *              long to be generated
4215c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
4216c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * PARAMETERS : framenumber indicating the framenumber of the buffer timingout
4217c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *
4218c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel * RETURN     : int32_t type of status
4219c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *              NO_ERROR  -- success
4220c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *              none-zero failure code
4221c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel *==========================================================================*/
4222c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudelint32_t QCamera3PicChannel::timeoutFrame(uint32_t frameNumber)
4223c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel{
4224c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    int32_t bufIdx;
4225c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
4226c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    bufIdx = mYuvMemory->getBufferIndex(frameNumber);
4227c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
4228c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    if (bufIdx < 0) {
4229c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        LOGE("%s: Buffer not found for frame:%d", __func__, frameNumber);
4230c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        return -1;
4231c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    }
4232c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
4233c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    mStreams[0]->timeoutFrame(bufIdx);
4234c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
4235c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    return NO_ERROR;
4236c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel}
4237c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel
4238e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chenint32_t QCamera3PicChannel::getYuvBufferForRequest(mm_camera_buf_def_t *frame,
4239e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        uint32_t frameNumber)
4240e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen{
4241e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    uint32_t bufIdx;
4242e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    status_t rc;
4243e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4244e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    Mutex::Autolock lock(mFreeBuffersLock);
4245e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4246e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Get an available YUV buffer.
4247e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (mFreeBufferList.empty()) {
4248e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        // Allocate a buffer if no one is available.
4249367f2cbfbb2efea55aca34a1ae69f86681869b2eChien-Yu Chen        rc = mYuvMemory->allocateOne(mFrameLen, /*isCached*/false);
4250e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        if (rc < 0) {
4251e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            LOGE("Failed to allocate heap buffer. Fatal");
4252e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            return rc;
4253e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        } else {
4254e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            bufIdx = (uint32_t)rc;
4255e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        }
4256e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    } else {
4257e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        List<uint32_t>::iterator it = mFreeBufferList.begin();
4258e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        bufIdx = *it;
4259e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        mFreeBufferList.erase(it);
4260e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4261e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4262e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mYuvMemory->markFrameNumber(bufIdx, frameNumber);
4263e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4264e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    cam_frame_len_offset_t offset = {};
4265e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mStreams[0]->getFrameOffset(offset);
4266e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4267e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Get a buffer from YUV memory.
4268063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang    rc = mYuvMemory->getBufDef(offset, *frame, bufIdx, mMapStreamBuffers);
4269e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (rc != 0) {
4270e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        ALOGE("%s: Getting a frame failed: %s (%d).", __FUNCTION__, strerror(-rc), rc);
4271e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return rc;
4272e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4273e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4274e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Set the frame's stream ID because it's not set in getBufDef.
4275e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    frame->stream_id = mStreams[0]->getMyHandle();
4276e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    return 0;
4277e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen}
4278e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4279e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chenint32_t QCamera3PicChannel::returnYuvBuffer(mm_camera_buf_def_t *frame)
4280e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen{
4281e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    Mutex::Autolock lock(mFreeBuffersLock);
4282e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mFreeBufferList.push_back(frame->buf_idx);
4283e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    return 0;
4284e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen}
4285e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4286e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chenint32_t QCamera3PicChannel::returnYuvBufferAndEncode(mm_camera_buf_def_t *frame,
4287e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        buffer_handle_t *outBuffer, uint32_t frameNumber,
4288e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        std::shared_ptr<metadata_buffer_t> metadata)
4289e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen{
4290e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    int32_t rc = OK;
4291e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4292e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Picture stream must have been started before any request comes in.
4293e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (!m_bIsActive) {
4294e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        LOGE("Channel not started!!");
4295e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return NO_INIT;
4296e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4297e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4298e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Set up reprocess configuration
4299e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    reprocess_config_t reproc_cfg = {};
4300e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    cam_dimension_t dim;
4301e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    dim.width = (int32_t)mYuvWidth;
4302e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    dim.height = (int32_t)mYuvHeight;
4303e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    setReprocConfig(reproc_cfg, nullptr, metadata.get(), mStreamFormat, dim);
4304e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4305e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Override reprocess type to just JPEG encoding without reprocessing.
4306e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    reproc_cfg.reprocess_type = REPROCESS_TYPE_NONE;
4307e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4308e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Get the index of the output jpeg buffer.
4309e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    int index = mMemory.getMatchBufIndex((void*)outBuffer);
4310e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if(index < 0) {
4311e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        rc = registerBuffer(outBuffer, mIsType);
4312e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        if (OK != rc) {
4313e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            LOGE("On-the-fly buffer registration failed %d",
4314e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                     rc);
4315e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            return rc;
4316e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        }
4317e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4318e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        index = mMemory.getMatchBufIndex((void*)outBuffer);
4319e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        if (index < 0) {
4320e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            LOGE("Could not find object among registered buffers");
4321e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            return DEAD_OBJECT;
4322e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        }
4323e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4324e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4325e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    rc = mMemory.markFrameNumber((uint32_t)index, frameNumber);
4326e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (rc != OK) {
4327e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        ALOGE("%s: Marking frame number (%u) for jpeg buffer (%d) failed: %s (%d)", __FUNCTION__,
4328e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                frameNumber, index, strerror(-rc), rc);
4329e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return rc;
4330e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4331e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4332e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Start postprocessor
4333e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    startPostProc(reproc_cfg);
4334e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4335e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Queue jpeg settings
4336e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    rc = queueJpegSetting((uint32_t)index, metadata.get());
4337e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (rc != OK) {
4338e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        ALOGE("%s: Queueing Jpeg setting for frame number (%u) buffer index (%d) failed: %s (%d)",
4339e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                __FUNCTION__, frameNumber, index, strerror(-rc), rc);
4340e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return rc;
4341e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4342e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4343e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Allocate a buffer for the YUV input. It will be freed in QCamera3PostProc.
4344e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mm_camera_super_buf_t *src_frame =
4345e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            (mm_camera_super_buf_t *)calloc(1, sizeof(mm_camera_super_buf_t));
4346e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (src_frame == nullptr) {
4347e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        LOGE("%s: No memory for src frame", __FUNCTION__);
4348e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return NO_MEMORY;
4349e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4350e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    src_frame->camera_handle = m_camHandle;
4351e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    src_frame->ch_id = getMyHandle();
4352e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    src_frame->num_bufs = 1;
4353e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    src_frame->bufs[0] = frame;
4354e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4355e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Start processing the YUV buffer.
4356e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    ALOGD("%s: %d: Post-process started", __FUNCTION__, __LINE__);
4357e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    rc = m_postprocessor.processData(src_frame);
4358e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (rc != OK) {
4359e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        ALOGE("%s: Post processing frame (frame number: %u, jpeg buffer: %d) failed: %s (%d)",
4360e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            __FUNCTION__, frameNumber, index, strerror(-rc), rc);
4361e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return rc;
4362e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4363e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4364e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Allocate a buffer for the metadata. It will be freed in QCamera3PostProc.
4365e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    mm_camera_super_buf_t *metadataBuf =
4366e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen            (mm_camera_super_buf_t *)calloc(1, sizeof(mm_camera_super_buf_t));
4367e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (metadata == nullptr) {
4368e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        LOGE("%s: No memory for metadata", __FUNCTION__);
4369e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return NO_MEMORY;
4370e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4371e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    metadataBuf->camera_handle = m_camHandle;
4372e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    metadataBuf->ch_id = getMyHandle();
4373e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    metadataBuf->num_bufs = 1;
4374e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    metadataBuf->bufs[0] = (mm_camera_buf_def_t *)calloc(1, sizeof(mm_camera_buf_def_t));
4375e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    metadataBuf->bufs[0]->buffer = metadata.get();
4376e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4377e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Start processing the metadata
4378e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    rc = m_postprocessor.processPPMetadata(metadataBuf);
4379e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    if (rc != OK) {
4380e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        ALOGE("%s: Post processing metadata (frame number: %u, jpeg buffer: %d) failed: %s (%d)",
4381e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen                __FUNCTION__, frameNumber, index, strerror(-rc), rc);
4382e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        return rc;
4383e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4384e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4385e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    // Queue the external metadata.
4386e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    {
4387e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        Mutex::Autolock lock(mPendingExternalMetadataLock);
4388e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen        mPendingExternalMetadata.push_back(metadata);
4389e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    }
4390e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4391e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen    return OK;
4392e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen}
4393e687bd08d05a3bb59b453509dc3b31f4beca7998Chien-Yu Chen
4394c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel/*===========================================================================
43953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3ReprocessChannel
43963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
43973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCamera3ReprocessChannel
43983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
43993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
44003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
44013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
44023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pp_mask    : post-proccess feature mask
44033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
44043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
44053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
44063d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3ReprocessChannel::QCamera3ReprocessChannel(uint32_t cam_handle,
44073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                 uint32_t channel_handle,
44083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                 mm_camera_ops_t *cam_ops,
44093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                 channel_cb_routine cb_routine,
4410c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                                 channel_cb_buffer_err cb_buf_err,
44113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                 cam_padding_info_t *paddingInfo,
44123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                 cam_feature_mask_t postprocess_mask,
44133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                                 void *userData, void *ch_hdl) :
44143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* In case of framework reprocessing, pproc and jpeg operations could be
44153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * parallelized by allowing 1 extra buffer for reprocessing output:
44163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel     * ch_hdl->getNumBuffers() + 1 */
4417c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel    QCamera3Channel(cam_handle, channel_handle, cam_ops, cb_routine, cb_buf_err, paddingInfo,
44183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    postprocess_mask, userData,
44193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    ((QCamera3ProcessingChannel *)ch_hdl)->getNumBuffers()
44203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                              + (MAX_REPROCESS_PIPELINE_STAGES - 1)),
44213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    inputChHandle(ch_hdl),
44223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mOfflineBuffersIndex(-1),
44233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mFrameLen(0),
44243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mReprocessType(REPROCESS_TYPE_NONE),
44253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_pSrcChannel(NULL),
44263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_pMetaChannel(NULL),
44273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory(NULL),
44283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mGrallocMemory(0),
44293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mReprocessPerfMode(false)
44303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
44313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles));
44323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mOfflineBuffersIndex = mNumBuffers -1;
44333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mOfflineMetaIndex = (int32_t) (2*mNumBuffers -1);
44343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
44353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
44383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3ReprocessChannel
44393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
44403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCamera3ReprocessChannel
44413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
44423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
44433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
44443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
44453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pp_mask    : post-proccess feature mask
44463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
44473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
44483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
44493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::initialize(cam_is_type_t isType)
44503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
44513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
44523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_channel_attr_t attr;
44533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
44553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
44563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    attr.max_unmatched_frames = 1;
44573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_handle = m_camOps->add_channel(m_camHandle,
44593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      &attr,
44603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      NULL,
44613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                      this);
44623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_handle == 0) {
44633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Add channel failed");
44643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return UNKNOWN_ERROR;
44653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
44663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = isType;
44683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
44693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
44703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
44723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : registerBuffer
44733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
44743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: register streaming buffer to the channel object
44753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
44763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
44773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buffer     : buffer to be registered
44783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @isType     : the image stabilization type for the buffer
44793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
44803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
44813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
44823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
44833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
44843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::registerBuffer(buffer_handle_t *buffer,
44853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_is_type_t isType)
44863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4487e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_REPROC_CH_REG_BUF);
44883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = 0;
44893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = isType;
44903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_type_t streamType;
44913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (buffer == NULL) {
44933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error: Cannot register a NULL buffer");
44943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
44953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
44963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
44973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((uint32_t)mGrallocMemory.getCnt() > (mNumBuffers - 1)) {
44983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Trying to register more buffers than initially requested");
44993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
45003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
45013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (0 == m_numStreams) {
45033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = initialize(mIsType);
45043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
45053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Couldn't initialize camera stream %d",
45063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc);
45073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
45083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
45093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
45103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamType = mStreams[0]->getMyType();
45123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mGrallocMemory.registerBuffer(buffer, streamType);
45133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (ALREADY_EXISTS == rc) {
45143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
45153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (NO_ERROR != rc) {
45163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Buffer %p couldn't be registered %d", buffer, rc);
45173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return rc;
45183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
45193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
45213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
45223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
45243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : QCamera3ReprocessChannel
45253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
45263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCamera3ReprocessChannel
45273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
45283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
45293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_handle : camera handle
45303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_ops    : ptr to camera ops table
45313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pp_mask    : post-proccess feature mask
45323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
45333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
45343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
45353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ReprocessChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame,
45363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  QCamera3Stream *stream)
45373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
45383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Got the pproc data callback. Now send to jpeg encoding
45393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t frameIndex;
45403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t resultFrameNumber;
454126ea6ac35479efe4ddf126a7898dc0fc233bb7a5Shuzhen Wang    ATRACE_CALL();
45423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_super_buf_t* frame = NULL;
45433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3ProcessingChannel *obj = (QCamera3ProcessingChannel *)inputChHandle;
45443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t dim;
45453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_frame_len_offset_t offset;
45463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&dim, 0, sizeof(dim));
45483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&offset, 0, sizeof(cam_frame_len_offset_t));
45493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!super_frame) {
45503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Invalid Super buffer");
45513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return;
45523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
45533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(super_frame->num_bufs != 1) {
45553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Multiple streams are not supported");
45563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return;
45573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
45583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(super_frame->bufs[0] == NULL ) {
45593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         LOGE("Error, Super buffer frame does not contain valid buffer");
45603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel         return;
45613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
45623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
45633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mReprocessType == REPROCESS_TYPE_JPEG) {
45663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        resultFrameNumber =  mMemory->getFrameNumber(frameIndex);
45673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t));
45683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (frame == NULL) {
45693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           LOGE("Error allocating memory to save received_frame structure.");
45703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if(stream) {
45713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               stream->bufDone(frameIndex);
45723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
45733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           return;
45743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
45753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGI("bufIndex: %u recvd from post proc",
45763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 (uint32_t)frameIndex);
45773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        *frame = *super_frame;
45783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
45793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stream->getFrameDimension(dim);
45803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        stream->getFrameOffset(offset);
4581cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel        dumpYUV(frame->bufs[0], dim, offset, QCAMERA_DUMP_FRM_INPUT_JPEG);
45828c0646dcd6b49732bb13d8786cc2c2149c1b180fEino-Ville Talvala        // Release offline buffers.
45838c0646dcd6b49732bb13d8786cc2c2149c1b180fEino-Ville Talvala        int32_t rc = obj->releaseOfflineMemory(resultFrameNumber);
45848c0646dcd6b49732bb13d8786cc2c2149c1b180fEino-Ville Talvala        if (NO_ERROR != rc) {
45858c0646dcd6b49732bb13d8786cc2c2149c1b180fEino-Ville Talvala            LOGE("Error releasing offline memory %d", rc);
45868c0646dcd6b49732bb13d8786cc2c2149c1b180fEino-Ville Talvala        }
45873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        /* Since reprocessing is done, send the callback to release the input buffer */
45883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mChannelCB) {
45893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mChannelCB(NULL, NULL, resultFrameNumber, true, mUserData);
45903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
45913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        obj->m_postprocessor.processPPData(frame);
45923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
45933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        buffer_handle_t *resultBuffer;
45943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx;
45953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        resultBuffer = (buffer_handle_t *)mGrallocMemory.getBufferHandle(frameIndex);
45963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        resultFrameNumber = mGrallocMemory.getFrameNumber(frameIndex);
45973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t rc = stream->bufRelease(frameIndex);
45983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc) {
45993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error %d releasing stream buffer %d",
46003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc, frameIndex);
46013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
46023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = mGrallocMemory.unregisterBuffer(frameIndex);
46033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (NO_ERROR != rc) {
46043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error %d unregistering stream buffer %d",
46053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     rc, frameIndex);
46063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
46073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        obj->reprocessCbRoutine(resultBuffer, resultFrameNumber);
46083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
46093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        obj->m_postprocessor.releaseOfflineBuffers(false);
46103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_hal3_pp_data_t *pp_job = obj->m_postprocessor.dequeuePPJob(resultFrameNumber);
46113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pp_job != NULL) {
46123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            obj->m_postprocessor.releasePPJobData(pp_job);
46133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
46143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        free(pp_job);
46153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        resetToCamPerfNormal(resultFrameNumber);
46163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
46173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    free(super_frame);
46183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
46193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
46203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
46213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
46223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : resetToCamPerfNormal
46233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Set the perf mode to normal if all the priority frames
46253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              have been reprocessed
46263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
46283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *      @frameNumber: Frame number of the reprocess completed frame
46293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : QCamera3StreamMem *
46313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
46323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::resetToCamPerfNormal(uint32_t frameNumber)
46333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
46343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
46353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    bool resetToPerfNormal = false;
46363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    {
46373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mPriorityFramesLock);
46383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        /* remove the priority frame number from the list */
46393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (size_t i = 0; i < mPriorityFrames.size(); i++) {
46403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (mPriorityFrames[i] == frameNumber) {
46413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mPriorityFrames.removeAt(i);
46423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
46433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
46443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        /* reset the perf mode if pending priority frame list is empty */
46453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mReprocessPerfMode && mPriorityFrames.empty()) {
46463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            resetToPerfNormal = true;
46473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
46483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
46493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (resetToPerfNormal) {
46503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *pStream = mStreams[0];
46513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_stream_parm_buffer_t param;
46523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
46533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
46543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.type = CAM_STREAM_PARAM_TYPE_REQUEST_OPS_MODE;
46553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.perf_mode = CAM_PERF_NORMAL;
46563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = pStream->setParameter(param);
46573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        {
46583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            Mutex::Autolock lock(mPriorityFramesLock);
46593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mReprocessPerfMode = false;
46603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
46613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
46623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
46633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
46643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
46653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
46663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamBufs
46673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: register the buffers of the reprocess channel
46693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
46713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : QCamera3StreamMem *
46733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
46743d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3StreamMem* QCamera3ReprocessChannel::getStreamBufs(uint32_t len)
46753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
46763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mReprocessType == REPROCESS_TYPE_JPEG) {
46773c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        mMemory = new QCamera3StreamMem(mNumBuffers);
46783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (!mMemory) {
46793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("unable to create reproc memory");
46803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return NULL;
46813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
46823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFrameLen = len;
46833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return mMemory;
46843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
46853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return &mGrallocMemory;
46863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
46873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
46883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
46893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : putStreamBufs
46903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: release the reprocess channel buffers
46923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
46943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
46953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
46963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
46973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3ReprocessChannel::putStreamBufs()
46983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
46993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   if (mReprocessType == REPROCESS_TYPE_JPEG) {
47003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       mMemory->deallocate();
47013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       delete mMemory;
47023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       mMemory = NULL;
47033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       mFreeBufferList.clear();
47043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   } else {
47053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       mGrallocMemory.unregisterBuffers();
47063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel   }
47073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
47083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
47103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : ~QCamera3ReprocessChannel
47113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCamera3ReprocessChannel
47133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
47153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : none
47173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
47183d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3ReprocessChannel::~QCamera3ReprocessChannel()
47193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
47203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    destroy();
47213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_handle) {
47233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_camOps->delete_channel(m_camHandle, m_handle);
47243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("deleting channel %d", m_handle);
47253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_handle = 0;
47263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
47273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
47283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
47303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : start
47313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: start reprocess channel.
47333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
47353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
47373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
47383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
47393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
47403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::start()
47413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4742e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_REPROC_CH_START);
47433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
47443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::start();
47463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == NO_ERROR) {
4748ce5b8667939a3d4678b0178011ad519013c86384Chien-Yu Chen       rc = m_camOps->start_channel(m_camHandle, m_handle, /*start_sensor_streaming*/true);
47493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       // Check failure
47513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       if (rc != NO_ERROR) {
47523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           LOGE("start_channel failed %d", rc);
47533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           QCamera3Channel::stop();
47543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       }
47553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
47563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
47573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
47583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
47603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stop
47613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop reprocess channel.
47633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
47653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
47673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
47683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
47693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
47703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::stop()
47713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4772e80ad7c01b6fb44006dc55546b700fca34bb00edThierry Strudel    ATRACE_CAMSCOPE_CALL(CAMSCOPE_HAL3_REPROC_CH_STOP);
47733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
47743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::stop();
477609cb28ee5fe4b3664777977d75fde8a6372d2f32Chien-Yu Chen    rc |= m_camOps->stop_channel(m_camHandle, m_handle, /*stop_channel_immediately*/false);
47773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Unmapping the buffers
47783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    unmapOfflineBuffers(true);
47793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
47803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
47813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
47833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getStreamBySrcHandle
47843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: find reprocess stream by its source stream handle
47863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
47883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @srcHandle : source stream handle
47893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
47903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : ptr to reprocess stream if found. NULL if not found
47913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
47923d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3Stream * QCamera3ReprocessChannel::getStreamBySrcHandle(uint32_t srcHandle)
47933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
47943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Stream *pStream = NULL;
47953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
47963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
47973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mSrcStreamHandles[i] == srcHandle) {
47983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pStream = mStreams[i];
47993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
48003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
48013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
48023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return pStream;
48033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
48043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
48053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
48063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getSrcStreamBySrcHandle
48073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
48083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: find source stream by source stream handle
48093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
48103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
48113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @srcHandle : source stream handle
48123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
48133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : ptr to reprocess stream if found. NULL if not found
48143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
48153d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3Stream * QCamera3ReprocessChannel::getSrcStreamBySrcHandle(uint32_t srcHandle)
48163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
48173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Stream *pStream = NULL;
48183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
48193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == m_pSrcChannel) {
48203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
48213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
48223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
48233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
48243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mSrcStreamHandles[i] == srcHandle) {
48253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pStream = m_pSrcChannel->getStreamByIndex(i);
48263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
48273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
48283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
48293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return pStream;
48303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
48313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
48323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
48333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : unmapOfflineBuffers
48343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
48353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Unmaps offline buffers
48363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
48373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
48383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
48393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
48403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
48413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
48423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
48433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::unmapOfflineBuffers(bool all)
48443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
48453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
48465c4e9f590ee6371b2dc3b63a7640a732d1f011bcEmilian Peev    Mutex::Autolock l(mOfflineBuffersLock);
48473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!mOfflineBuffers.empty()) {
48483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *stream = NULL;
48493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        List<OfflineBuffer>::iterator it = mOfflineBuffers.begin();
48503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (; it != mOfflineBuffers.end(); it++) {
48513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           stream = (*it).stream;
48523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if (NULL != stream) {
48533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = stream->unmapBuf((*it).type,
48543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     (*it).index,
48553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        -1);
48563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               if (NO_ERROR != rc) {
48573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   LOGE("Error during offline buffer unmap %d",
48583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                          rc);
48593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               }
48603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               LOGD("Unmapped buffer with index %d", (*it).index);
48613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
48623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if (!all) {
48633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               mOfflineBuffers.erase(it);
48643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               break;
48653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
48663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
48673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (all) {
48683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           mOfflineBuffers.clear();
48693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
48703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
48713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
48723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!mOfflineMetaBuffers.empty()) {
48733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *stream = NULL;
48743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        List<OfflineBuffer>::iterator it = mOfflineMetaBuffers.begin();
48753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (; it != mOfflineMetaBuffers.end(); it++) {
48763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           stream = (*it).stream;
48773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if (NULL != stream) {
48783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               rc = stream->unmapBuf((*it).type,
48793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     (*it).index,
48803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        -1);
48813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               if (NO_ERROR != rc) {
48823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   LOGE("Error during offline buffer unmap %d",
48833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                          rc);
48843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               }
48853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               LOGD("Unmapped meta buffer with index %d", (*it).index);
48863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
48873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           if (!all) {
48883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               mOfflineMetaBuffers.erase(it);
48893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel               break;
48903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           }
48913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
48923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (all) {
48933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           mOfflineMetaBuffers.clear();
48943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
48953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
48963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
48973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
48983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
48993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
49003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : bufDone
49013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
49023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Return reprocess stream buffer to free buffer list.
49033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              Note that this function doesn't queue buffer back to kernel.
49043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              It's up to doReprocessOffline to do that instead.
49053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
49063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @recvd_frame  : stream buf frame to be returned
49073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
49083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
49093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
49103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
49113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
49123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::bufDone(mm_camera_super_buf_t *recvd_frame)
49133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
49143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
49153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (recvd_frame && recvd_frame->num_bufs == 1) {
49163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mFreeBuffersLock);
49173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t buf_idx = recvd_frame->bufs[0]->buf_idx;
49183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mFreeBufferList.push_back(buf_idx);
49193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
49213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Fatal. Not supposed to be here");
49223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = BAD_VALUE;
49233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
49243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
49263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
49273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
49293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : overrideMetadata
49303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
49313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Override metadata entry such as rotation, crop, and CDS info.
49323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
49333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
49343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame     : input frame from source stream
49353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   meta_buffer: metadata buffer
49363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @metadata  : corresponding metadata
49373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @fwk_frame :
49383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
49393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
49403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
49413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
49423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
49433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::overrideMetadata(qcamera_hal3_pp_buffer_t *pp_buffer,
49443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mm_camera_buf_def_t *meta_buffer, jpeg_settings_t *jpeg_settings,
49453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_fwk_input_pp_data_t &fwk_frame)
49463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
49473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = NO_ERROR;
49483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3HardwareInterface* hal_obj = (QCamera3HardwareInterface*)mUserData;
49493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((NULL == meta_buffer) || (NULL == pp_buffer) || (NULL == pp_buffer->input) ||
49503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (NULL == hal_obj)) {
49513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
49523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
49533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    metadata_buffer_t *meta = (metadata_buffer_t *)meta_buffer->buffer;
49553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_super_buf_t *frame = pp_buffer->input;
49563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == meta) {
49573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
49583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
49593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < frame->num_bufs; i++) {
49613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *pStream = getStreamBySrcHandle(frame->bufs[i]->stream_id);
49623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *pSrcStream = getSrcStreamBySrcHandle(frame->bufs[i]->stream_id);
49633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pStream != NULL && pSrcStream != NULL) {
49653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (jpeg_settings) {
49663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // Find rotation info for reprocess stream
49673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_rotation_info_t rotation_info;
49683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                memset(&rotation_info, 0, sizeof(rotation_info));
49693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (jpeg_settings->jpeg_orientation == 0) {
49703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   rotation_info.rotation = ROTATE_0;
49713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else if (jpeg_settings->jpeg_orientation == 90) {
49723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   rotation_info.rotation = ROTATE_90;
49733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else if (jpeg_settings->jpeg_orientation == 180) {
49743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   rotation_info.rotation = ROTATE_180;
49753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else if (jpeg_settings->jpeg_orientation == 270) {
49763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                   rotation_info.rotation = ROTATE_270;
49773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
49786ec8eac5b7725ce87492184a7d11ea64a70d014dShuzhen Wang
49796ec8eac5b7725ce87492184a7d11ea64a70d014dShuzhen Wang                rotation_info.device_rotation = ROTATE_0;
49803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rotation_info.streamId = mStreams[0]->getMyServerID();
49813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ADD_SET_PARAM_ENTRY_TO_BATCH(meta, CAM_INTF_PARM_ROTATION, rotation_info);
49823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
49833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Find and insert crop info for reprocess stream
49853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, meta) {
49863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (MAX_NUM_STREAMS > crop_data->num_of_streams) {
49873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    for (int j = 0; j < crop_data->num_of_streams; j++) {
49883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (crop_data->crop_info[j].stream_id ==
49893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                pSrcStream->getMyServerID()) {
49903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
49913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            // Store crop/roi information for offline reprocess
49923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            // in the reprocess stream slot
49933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            crop_data->crop_info[crop_data->num_of_streams].crop =
49943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].crop;
49953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            crop_data->crop_info[crop_data->num_of_streams].roi_map =
49963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].roi_map;
49973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            crop_data->crop_info[crop_data->num_of_streams].stream_id =
49983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    mStreams[0]->getMyServerID();
49993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            crop_data->num_of_streams++;
50003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGD("Reprocess stream server id: %d",
50023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     mStreams[0]->getMyServerID());
50033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGD("Found offline reprocess crop %dx%d %dx%d",
50043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].crop.left,
50053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].crop.top,
50063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].crop.width,
50073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].crop.height);
50083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGD("Found offline reprocess roimap %dx%d %dx%d",
50093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].roi_map.left,
50103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].roi_map.top,
50113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].roi_map.width,
50123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    crop_data->crop_info[j].roi_map.height);
50133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            break;
50153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
50163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
50173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
50183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("No space to add reprocess stream crop/roi information");
50193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
50203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
50213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            IF_META_AVAILABLE(cam_cds_data_t, cdsInfo, CAM_INTF_META_CDS_DATA, meta) {
50233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                uint8_t cnt = cdsInfo->num_of_streams;
50243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (cnt <= MAX_NUM_STREAMS) {
50253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_stream_cds_info_t repro_cds_info;
50263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    memset(&repro_cds_info, 0, sizeof(repro_cds_info));
50273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    repro_cds_info.stream_id = mStreams[0]->getMyServerID();
50283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    for (size_t i = 0; i < cnt; i++) {
50293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (cdsInfo->cds_info[i].stream_id ==
50303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                pSrcStream->getMyServerID()) {
50313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            repro_cds_info.cds_enable =
50323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    cdsInfo->cds_info[i].cds_enable;
50333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            break;
50343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
50353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
50363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cdsInfo->num_of_streams = 1;
50373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cdsInfo->cds_info[0] = repro_cds_info;
50383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                } else {
50393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("No space to add reprocess stream cds information");
50403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
50413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
50423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            fwk_frame.input_buffer = *frame->bufs[i];
50443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            fwk_frame.metadata_buffer = *meta_buffer;
50453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            fwk_frame.output_buffer = pp_buffer->output;
50463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
50473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
50483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Source/Re-process streams are invalid");
50493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc |= BAD_VALUE;
50503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
50513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
50523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
50543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
50553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
50573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* FUNCTION : overrideFwkMetadata
50583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
50593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* DESCRIPTION: Override frameworks metadata such as rotation, crop, and CDS data.
50603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
50613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* PARAMETERS :
50623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* @frame : input frame for reprocessing
50633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*
50643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* RETURN : int32_t type of status
50653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* NO_ERROR -- success
50663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* none-zero failure code
50673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel*==========================================================================*/
50683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::overrideFwkMetadata(
50693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_fwk_input_pp_data_t *frame)
50703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
50713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == frame) {
50723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Incorrect input frame");
50733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
50743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
50753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == frame->metadata_buffer.buffer) {
50773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No metadata available");
50783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
50793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
50803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    metadata_buffer_t *meta = (metadata_buffer_t *) frame->metadata_buffer.buffer;
50813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Not doing rotation at all for YUV to YUV reprocess
50833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mReprocessType != REPROCESS_TYPE_JPEG) {
50843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("Override rotation to 0 for channel reprocess type %d",
50853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mReprocessType);
50863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_rotation_info_t rotation_info;
50873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&rotation_info, 0, sizeof(rotation_info));
50883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rotation_info.rotation = ROTATE_0;
50893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rotation_info.streamId = mStreams[0]->getMyServerID();
50903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        ADD_SET_PARAM_ENTRY_TO_BATCH(meta, CAM_INTF_PARM_ROTATION, rotation_info);
50913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
50923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
50933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Find and insert crop info for reprocess stream
50943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(cam_crop_data_t, crop_data, CAM_INTF_META_CROP_DATA, meta) {
50953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (1 == crop_data->num_of_streams) {
50963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Store crop/roi information for offline reprocess
50973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // in the reprocess stream slot
50983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            crop_data->crop_info[crop_data->num_of_streams].crop =
50993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].crop;
51003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            crop_data->crop_info[crop_data->num_of_streams].roi_map =
51013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].roi_map;
51023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            crop_data->crop_info[crop_data->num_of_streams].stream_id =
51033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mStreams[0]->getMyServerID();
51043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            crop_data->num_of_streams++;
51053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Reprocess stream server id: %d",
51073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     mStreams[0]->getMyServerID());
51083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Found offline reprocess crop %dx%d %dx%d",
51093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].crop.left,
51103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].crop.top,
51113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].crop.width,
51123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].crop.height);
51133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Found offline reprocess roi map %dx%d %dx%d",
51143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].roi_map.left,
51153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].roi_map.top,
51163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].roi_map.width,
51173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->crop_info[0].roi_map.height);
51183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
51193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Incorrect number of offline crop data entries %d",
51203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    crop_data->num_of_streams);
51213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return BAD_VALUE;
51223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
51233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
51243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Crop data not present");
51253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
51263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    IF_META_AVAILABLE(cam_cds_data_t, cdsInfo, CAM_INTF_META_CDS_DATA, meta) {
51283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (1 == cdsInfo->num_of_streams) {
51293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cdsInfo->cds_info[0].stream_id = mStreams[0]->getMyServerID();
51303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
51313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Incorrect number of offline cds info entries %d",
51323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     cdsInfo->num_of_streams);
51333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return BAD_VALUE;
51343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
51353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
51363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
51383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
51393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
51413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : doReprocessOffline
51423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
51433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do a reprocess on the frame
51443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
51453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
51463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame     : input frame for reprocessing
51473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @isPriorityFrame: Hint that this frame is of priority, equivalent to
51483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              real time, even though it is processed in offline mechanism
51493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
51503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
51513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
51523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
51533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
51543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t  QCamera3ReprocessChannel::doReprocessOffline(
51553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_fwk_input_pp_data_t *frame, bool isPriorityFrame)
51563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
51573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
51583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int index;
51593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    OfflineBuffer mappedBuffer;
516026ea6ac35479efe4ddf126a7898dc0fc233bb7a5Shuzhen Wang    ATRACE_CALL();
51613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_numStreams < 1) {
51633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No reprocess stream is created");
51643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
51653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
51663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == frame) {
51683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Incorrect input frame");
51693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
51703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
51713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == frame->metadata_buffer.buffer) {
51733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No metadata available");
51743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
51753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
51763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5177063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang    if (0 > frame->input_buffer.fd) {
51783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No input buffer available");
51793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
51803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
51813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((0 == m_numStreams) || (NULL == mStreams[0])) {
51833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Reprocess stream not initialized!");
51843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
51853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
51863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Stream *pStream = mStreams[0];
51883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
51893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //qbuf the output buffer if it was allocated by the framework
51903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mReprocessType != REPROCESS_TYPE_JPEG && frame->output_buffer != NULL) {
51913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        index = mGrallocMemory.getMatchBufIndex((void*)frame->output_buffer);
51923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if(index < 0) {
51933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = registerBuffer(frame->output_buffer, mIsType);
51943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (NO_ERROR != rc) {
51953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("On-the-fly buffer registration failed %d",
51963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                         rc);
51973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
51983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
51993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
52003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            index = mGrallocMemory.getMatchBufIndex((void*)frame->output_buffer);
52013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (index < 0) {
52023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Could not find object among registered buffers");
52033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return DEAD_OBJECT;
52043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
52053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5206c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        rc = mGrallocMemory.markFrameNumber(index, frame->frameNumber);
5207c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        if(rc != NO_ERROR) {
5208c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            LOGE("Failed to mark frame#:%d, index:%d",frame->frameNumber,index);
5209c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel            return rc;
5210c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel        }
52113c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        if(!m_bIsActive) {
52123c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            rc = start();
52133c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            if (NO_ERROR != rc) {
52143c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang                return rc;
52153c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            }
52163c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang        } else {
52173c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            rc = pStream->bufDone(index);
52183c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            if(rc != NO_ERROR) {
52193c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang                LOGE("Failed to Q new buffer to stream %d", rc);
52203c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang                mGrallocMemory.markFrameNumber(index, -1);
52213c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang                return rc;
52223c077d73494b534143fe755b85ea6c68604ebc26Shuzhen Wang            }
52233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
52243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
52253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else if (mReprocessType == REPROCESS_TYPE_JPEG) {
52263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        Mutex::Autolock lock(mFreeBuffersLock);
52273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t bufIdx;
52283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (mFreeBufferList.empty()) {
52293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mMemory->allocateOne(mFrameLen);
52303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc < 0) {
52313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Failed allocating heap buffer. Fatal");
52323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return BAD_VALUE;
52333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
52343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                bufIdx = (uint32_t)rc;
52353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
52363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
52373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            bufIdx = *(mFreeBufferList.begin());
52383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mFreeBufferList.erase(mFreeBufferList.begin());
52393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
52403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
52413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory->markFrameNumber(bufIdx, frame->frameNumber);
52423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = pStream->bufDone(bufIdx);
52433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
52443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Failed to queue new buffer to stream");
52453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
52463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
52473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
52483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
52493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t max_idx = (int32_t) (mNumBuffers - 1);
52503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //loop back the indices if max burst count reached
52513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mOfflineBuffersIndex == max_idx) {
52523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       mOfflineBuffersIndex = -1;
52533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
52543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t buf_idx = (uint32_t)(mOfflineBuffersIndex + 1);
5255295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel
5256295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel    //Do cache ops before sending for reprocess
5257295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel    if (mMemory != NULL) {
5258295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel        mMemory->cleanInvalidateCache(buf_idx);
5259295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel    }
5260295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel
52613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = pStream->mapBuf(
52623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
52633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            buf_idx, -1,
52643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            frame->input_buffer.fd, frame->input_buffer.buffer,
52653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            frame->input_buffer.frame_len);
52663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR == rc) {
52675c4e9f590ee6371b2dc3b63a7640a732d1f011bcEmilian Peev        Mutex::Autolock l(mOfflineBuffersLock);
52683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.index = buf_idx;
52693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.stream = pStream;
52703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF;
52713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineBuffers.push_back(mappedBuffer);
52723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineBuffersIndex = (int32_t)buf_idx;
52733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("Mapped buffer with index %d", mOfflineBuffersIndex);
52743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
52753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
52763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    max_idx = (int32_t) ((mNumBuffers * 2) - 1);
52773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //loop back the indices if max burst count reached
52783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mOfflineMetaIndex == max_idx) {
52793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel       mOfflineMetaIndex = (int32_t) (mNumBuffers - 1);
52803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
52813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t meta_buf_idx = (uint32_t)(mOfflineMetaIndex + 1);
52823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc |= pStream->mapBuf(
52833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF,
52843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            meta_buf_idx, -1,
52853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            frame->metadata_buffer.fd, frame->metadata_buffer.buffer,
52863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            frame->metadata_buffer.frame_len);
52873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NO_ERROR == rc) {
52885c4e9f590ee6371b2dc3b63a7640a732d1f011bcEmilian Peev        Mutex::Autolock l(mOfflineBuffersLock);
52893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.index = meta_buf_idx;
52903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.stream = pStream;
52913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF;
52923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineMetaBuffers.push_back(mappedBuffer);
52933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mOfflineMetaIndex = (int32_t)meta_buf_idx;
52943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("Mapped meta buffer with index %d", mOfflineMetaIndex);
52953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
52963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
52973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == NO_ERROR) {
52983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_stream_parm_buffer_t param;
52993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint32_t numPendingPriorityFrames = 0;
53003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if(isPriorityFrame && (mReprocessType != REPROCESS_TYPE_JPEG)) {
53023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            Mutex::Autolock lock(mPriorityFramesLock);
53033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            /* read the length before pushing the frame number to check if
53043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             * vector is empty */
53053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            numPendingPriorityFrames = mPriorityFrames.size();
53063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mPriorityFrames.push(frame->frameNumber);
53073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
53083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if(isPriorityFrame && !numPendingPriorityFrames &&
53103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (mReprocessType != REPROCESS_TYPE_JPEG)) {
53113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
53123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.type = CAM_STREAM_PARAM_TYPE_REQUEST_OPS_MODE;
53133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.perf_mode = CAM_PERF_HIGH_PERFORMANCE;
53143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = pStream->setParameter(param);
53153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
5316c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                LOGE("%s: setParameter for CAM_PERF_HIGH_PERFORMANCE failed",
53173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    __func__);
53183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
53193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            {
53203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                Mutex::Autolock lock(mPriorityFramesLock);
53213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                mReprocessPerfMode = true;
53223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
53233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
53243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
53263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
53273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.reprocess.buf_index = buf_idx;
53283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.reprocess.frame_idx = frame->input_buffer.frame_idx;
53293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.reprocess.meta_present = 1;
53303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        param.reprocess.meta_buf_index = meta_buf_idx;
53313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGI("Offline reprocessing id = %d buf Id = %d meta index = %d",
53333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    param.reprocess.frame_idx, param.reprocess.buf_index,
53343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    param.reprocess.meta_buf_index);
53353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = pStream->setParameter(param);
53363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
53373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("stream setParameter for reprocess failed");
53383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            resetToCamPerfNormal(frame->frameNumber);
53393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
53403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
53413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Input buffer memory map failed: %d", rc);
53423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
53433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
53453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
53463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
53483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : doReprocess
53493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
53503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do a reprocess on the frame
53513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
53523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
53533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buf_fd     : fd to the input buffer that needs reprocess
53543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buffer     : Buffer ptr
53553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @buf_lenght : length of the input buffer
53563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @ret_val    : result of reprocess.
53573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                 Example: Could be faceID in case of register face image.
53583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @meta_frame : metadata frame.
53593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
53603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
53613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
53623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
53633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
53643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::doReprocess(int buf_fd, void *buffer, size_t buf_length,
53653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t &ret_val, mm_camera_super_buf_t *meta_frame)
53663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
53673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
53683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_numStreams < 1) {
53693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No reprocess stream is created");
53703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
53713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
53723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (meta_frame == NULL) {
53733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Did not get corresponding metadata in time");
53743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -1;
53753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
53763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t buf_idx = 0;
53783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < m_numStreams; i++) {
53793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
53803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 buf_idx, -1,
53813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                 buf_fd, buffer, buf_length);
53823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5383295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel        //Do cache ops before sending for reprocess
5384295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel        if (mMemory != NULL) {
5385295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel            mMemory->cleanInvalidateCache(buf_idx);
5386295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel        }
5387295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel
53883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc == NO_ERROR) {
53893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cam_stream_parm_buffer_t param;
53903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(&param, 0, sizeof(cam_stream_parm_buffer_t));
53913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS;
53923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.buf_index = buf_idx;
53933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.meta_present = 1;
53943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.meta_stream_handle = m_pMetaChannel->mStreams[0]->getMyServerID();
53953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            param.reprocess.meta_buf_index = meta_frame->bufs[0]->buf_idx;
53963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
53973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGI("Online reprocessing id = %d buf Id = %d meta index = %d",
53983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    param.reprocess.frame_idx, param.reprocess.buf_index,
53993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    param.reprocess.meta_buf_index);
54003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = mStreams[i]->setParameter(param);
54013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc == NO_ERROR) {
54023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ret_val = param.reprocess.ret_val;
54033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
54043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF,
54053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                  buf_idx, -1);
54063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
54073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
54083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
54093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
54103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
54123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : addReprocStreamsFromSource
54133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
54143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: add reprocess streams from input source channel
54153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
54163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
54173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @config         : pp feature configuration
54183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @src_config     : source reprocess configuration
54193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @isType         : type of image stabilization required on this stream
54203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pMetaChannel   : ptr to metadata channel to get corresp. metadata
54213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
54223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
54233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
54243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
54253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
54263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
54273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3ReprocessChannel::addReprocStreamsFromSource(cam_pp_feature_config_t &pp_config,
54283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        const reprocess_config_t &src_config , cam_is_type_t is_type,
54293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Channel *pMetaChannel)
54303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
54313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = 0;
54323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_reproc_config_t reprocess_config;
54333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_stream_type_t streamType;
54343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_dimension_t streamDim = src_config.output_stream_dim;
54363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL != src_config.src_channel) {
54383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera3Stream *pSrcStream = src_config.src_channel->getStreamByIndex(0);
54393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pSrcStream == NULL) {
54403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           LOGE("source channel doesn't have a stream");
54413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           return BAD_VALUE;
54423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
54433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mSrcStreamHandles[m_numStreams] = pSrcStream->getMyHandle();
54443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
54453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    streamType = CAM_STREAM_TYPE_OFFLINE_PROC;
54473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config.pp_type = CAM_OFFLINE_REPROCESS_TYPE;
54483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config.offline.input_fmt = src_config.stream_format;
54503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config.offline.input_dim = src_config.input_stream_dim;
54513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config.offline.input_buf_planes.plane_info =
54523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            src_config.input_stream_plane_info.plane_info;
54533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config.offline.num_of_bufs = (uint8_t)mNumBuffers;
54543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config.offline.input_type = src_config.stream_type;
54553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reprocess_config.pp_feature_config = pp_config;
54573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera3Stream *pStream = new QCamera3Stream(m_camHandle,
54583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_handle,
54593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_camOps,
54603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            &mPaddingInfo,
5461063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang            (QCamera3Channel*)this,
5462063deb5e04459641c701b5cbf30d8c710b796298Shuzhen Wang            false/*mapStreamBuffers*/);
54633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (pStream == NULL) {
54643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("No mem for Stream");
54653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_MEMORY;
54663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
54673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = pStream->init(streamType, src_config.stream_format,
54693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            streamDim, ROTATE_0, &reprocess_config,
54703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (uint8_t)mNumBuffers,
54713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            reprocess_config.pp_feature_config.feature_mask,
54723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            is_type,
54733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            0,/* batchSize */
54743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera3Channel::streamCbRoutine, this);
54753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == 0) {
54773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mStreams[m_numStreams] = pStream;
54783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_numStreams++;
54793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
54803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("failed to create reprocess stream");
54813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete pStream;
54823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
54833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
54843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc == NO_ERROR) {
54853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pSrcChannel = src_config.src_channel;
54863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pMetaChannel = pMetaChannel;
54873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mReprocessType = src_config.reprocess_type;
54883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("mReprocessType is %d", mReprocessType);
54893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
54903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_camera_req_buf_t buf;
54913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&buf, 0x0, sizeof(buf));
54923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    buf.type = MM_CAMERA_REQ_SUPER_BUF;
54933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    buf.num_buf_requested = 1;
54943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(m_camOps->request_super_buf(m_camHandle,m_handle, &buf) < 0) {
54953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Request for super buffer failed");
54963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
54973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
54983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
54993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* QCamera3SupportChannel methods */
55013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelcam_dimension_t QCamera3SupportChannel::kDim = {640, 480};
55033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55043d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3SupportChannel::QCamera3SupportChannel(uint32_t cam_handle,
55053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    uint32_t channel_handle,
55063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mm_camera_ops_t *cam_ops,
55073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_padding_info_t *paddingInfo,
55083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_feature_mask_t postprocess_mask,
55093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_stream_type_t streamType,
55103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_dimension_t *dim,
55113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_format_t streamFormat,
55123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    uint8_t hw_analysis_supported,
55133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_color_filter_arrangement_t color_arrangement,
55143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    void *userData, uint32_t numBuffers) :
55153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3Channel(cam_handle, channel_handle, cam_ops,
5516c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                NULL, NULL, paddingInfo, postprocess_mask,
55173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                userData, numBuffers),
5518c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        mMemory(NULL),
5519c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        mHwAnalysisSupported(hw_analysis_supported),
5520c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                        mColorArrangement(color_arrangement)
55213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
55223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memcpy(&mDim, dim, sizeof(cam_dimension_t));
55233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mStreamType = streamType;
55243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mStreamFormat = streamFormat;
55253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
55263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55273d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3SupportChannel::~QCamera3SupportChannel()
55283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
55293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    destroy();
55303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mMemory) {
55323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory->deallocate();
55333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete mMemory;
55343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory = NULL;
55353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
55363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
55373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3SupportChannel::initialize(cam_is_type_t isType)
55393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
55403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc;
55413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (mMemory || m_numStreams > 0) {
55433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("metadata channel already initialized");
55443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -EINVAL;
55453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
55463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mIsType = isType;
5548c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee   // Make Analysis same as Preview format
5549c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee   if (!mHwAnalysisSupported && mStreamType == CAM_STREAM_TYPE_ANALYSIS &&
5550c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee           mColorArrangement != CAM_FILTER_ARRANGEMENT_Y) {
5551c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee        mStreamFormat = getStreamDefaultFormat(CAM_STREAM_TYPE_PREVIEW,
5552c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee                mDim.width, mDim.height, m_bUBWCenable, mIsType);
5553c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee   }
5554c4cf503a65ea7f0be6ab98a18dd7aebcb33985deJason Lee
55553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3Channel::addStream(mStreamType,
55563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mStreamFormat, mDim, ROTATE_0, MIN_STREAMING_BUFFER_NUM,
55573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mPostProcMask, mIsType);
55583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
55593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("addStream failed");
55603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
55613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
55623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
55633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCamera3SupportChannel::request(buffer_handle_t * /*buffer*/,
5565c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                                uint32_t /*frameNumber*/,
5566c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel                                                int & /*indexUsed*/)
55673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
55683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
55693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
55703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3SupportChannel::streamCbRoutine(
55723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        mm_camera_super_buf_t *super_frame,
55733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        QCamera3Stream * /*stream*/)
55743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
55753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (super_frame == NULL || super_frame->num_bufs != 1) {
55763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("super_frame is not valid");
55773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
55783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
55793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    bufDone(super_frame);
55803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    free(super_frame);
55813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
55823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
55833d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera3StreamMem* QCamera3SupportChannel::getStreamBufs(uint32_t len)
55843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
55853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc;
55863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory = new QCamera3StreamMem(mNumBuffers);
55873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!mMemory) {
55883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("unable to create heap memory");
55893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
55903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
55913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = mMemory->allocateAll(len);
55923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (rc < 0) {
55933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("unable to allocate heap memory");
55943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete mMemory;
55953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mMemory = NULL;
55963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
55973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
55983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return mMemory;
55993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
56003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
56013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCamera3SupportChannel::putStreamBufs()
56023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
56033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory->deallocate();
56043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    delete mMemory;
56053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mMemory = NULL;
56063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
56073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
56087650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian PeevQCamera3DepthChannel::~QCamera3DepthChannel() {
56097650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    unmapAllBuffers();
56107650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev}
56117650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56127650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev/*===========================================================================
56137650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * FUNCTION   : mapBuffer
56147650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56157650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * DESCRIPTION: Maps stream depth buffer
56167650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56177650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * PARAMETERS :
56187650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *   @buffer       : Depth buffer
56197650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *   @frameNumber  : Frame number
56207650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56217650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56227650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * RETURN     : int32_t type of status
56237650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              NO_ERROR  -- success
56247650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              none-zero failure code
56257650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *==========================================================================*/
56267650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevint32_t QCamera3DepthChannel::mapBuffer(buffer_handle_t *buffer,
56277650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        uint32_t frameNumber) {
56287650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    int32_t rc = NO_ERROR;
56297650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56307650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    int32_t index = mGrallocMem.getMatchBufIndex((void*)buffer);
56317650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (0 > index) {
56327650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        rc = mGrallocMem.registerBuffer(buffer, CAM_STREAM_TYPE_DEFAULT);
56337650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        if (NO_ERROR != rc) {
56347650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev            LOGE("Buffer registration failed %d", rc);
56357650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev            return rc;
56367650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        }
56377650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56387650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        index = mGrallocMem.getMatchBufIndex((void*)buffer);
56397650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        if (index < 0) {
56407650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev            LOGE("Could not find object among registered buffers");
56417650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev            return DEAD_OBJECT;
56427650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        }
56437650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    } else {
56447650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Buffer: %p is already present at index: %d!", buffer, index);
56457650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return ALREADY_EXISTS;
56467650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
56477650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56487650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    rc = mGrallocMem.markFrameNumber((uint32_t)index, frameNumber);
56497650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56507650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    return rc;
56517650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev}
56527650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56537650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev/*===========================================================================
56547650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * FUNCTION   : populateDepthData
56557650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56567650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * DESCRIPTION: Copies the incoming depth data in the respective depth buffer
56577650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56587650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * PARAMETERS :
56597650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *   @data         : Incoming Depth data
56607650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *   @frameNumber  : Frame number of incoming depth data
56617650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56627650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
56637650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * RETURN     : int32_t type of status
56647650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              NO_ERROR  -- success
56657650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              none-zero failure code
56667650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *==========================================================================*/
56677650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevint32_t QCamera3DepthChannel::populateDepthData(const cam_depth_data_t &data,
56687650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        uint32_t frameNumber) {
56697650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (nullptr == mStream) {
56707650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Invalid depth stream!");
56717650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return BAD_VALUE;
56727650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
56737650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56747650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    ssize_t length = data.length;
56757650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    int32_t index = mGrallocMem.getBufferIndex(frameNumber);
56767650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (0 > index) {
56777650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Frame number: %u not present!");
56787650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return BAD_VALUE;
56797650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
56807650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56817650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    void *dst = mGrallocMem.getPtr(index);
56827650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (nullptr == dst) {
56837650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Invalid mapped buffer");
56847650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return BAD_VALUE;
56857650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
56867650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56877650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    camera3_jpeg_blob_t jpegHeader;
56887650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    ssize_t headerSize = sizeof jpegHeader;
56897650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    buffer_handle_t *blobBufferHandle = static_cast<buffer_handle_t *>
56907650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev            (mGrallocMem.getBufferHandle(index));
56917650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    ssize_t maxBlobSize;
56927650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (nullptr != blobBufferHandle) {
56937650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        maxBlobSize = ((private_handle_t*)(*blobBufferHandle))->width;
56947650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    } else {
56957650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Couldn't query buffer handle!");
56967650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return BAD_VALUE;
56977650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
56987650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
56997650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if ((length + headerSize) > maxBlobSize) {
57007650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Depth buffer size mismatch expected: %d actual: %d",
57017650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev                (length + headerSize), maxBlobSize);
57027650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return BAD_VALUE;
57037650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
5704656e4fafd6ec53944c26e36803f509733f8b480fEmilian Peev
5705656e4fafd6ec53944c26e36803f509733f8b480fEmilian Peev    if (0 < length) {
5706656e4fafd6ec53944c26e36803f509733f8b480fEmilian Peev        memcpy(dst, data.depth_data, length);
5707656e4fafd6ec53944c26e36803f509733f8b480fEmilian Peev    }
57087650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57097650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    memset(&jpegHeader, 0, headerSize);
57107650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    jpegHeader.jpeg_blob_id = CAMERA3_JPEG_BLOB_ID;
57117650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    jpegHeader.jpeg_size = length;
57127650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    size_t jpeg_eof_offset = static_cast<size_t> (maxBlobSize - headerSize);
57137650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    uint8_t *jpegBuffer = static_cast<uint8_t *> (dst);
57147650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    uint8_t *jpegEOF = &jpegBuffer[jpeg_eof_offset];
57157650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    memcpy(jpegEOF, &jpegHeader, headerSize);
57167650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57177650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    return NO_ERROR;
57187650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev}
57197650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57207650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev/*===========================================================================
57217650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * FUNCTION   : getOldestFrame
57227650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57237650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * DESCRIPTION: Return oldest mapped buffer
57247650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57257650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * PARAMETERS :
57267650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *   @frameNumber         : Sets oldest frame number if present
57277650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57287650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57297650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * RETURN     : buffer_handle_t pointer
57307650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              NULL in case of error
57317650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *==========================================================================*/
57327650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevbuffer_handle_t *QCamera3DepthChannel::getOldestFrame(uint32_t &frameNumber) {
57337650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    uint32_t oldestIndex = UINT32_MAX;
57347650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    int32_t frameNumberResult = mGrallocMem.getOldestFrameNumber(oldestIndex);
57357650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (0 > frameNumberResult) {
57367650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGD("Invalid frame number!");
57377650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return nullptr;
57387650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
57397650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    frameNumber = static_cast<uint32_t> (frameNumberResult);
57407650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57417650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    buffer_handle_t *ret = static_cast<buffer_handle_t *>
57427650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev            (mGrallocMem.getBufferHandle(oldestIndex));
57437650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (nullptr == ret) {
57447650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Invalid buffer handle!");
57457650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return nullptr;
57467650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
57477650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57487650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    return ret;
57497650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev}
57507650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57517650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev/*===========================================================================
57527650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * FUNCTION   : unmapBuffer
57537650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57547650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * DESCRIPTION: Unmap a single buffer
57557650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57567650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * PARAMETERS :
57577650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *   @frameNumber         : Frame number of buffer that should get unmapped
57587650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57597650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57607650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * RETURN     : int32_t type of status
57617650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              NO_ERROR  -- success
57627650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              none-zero failure code
57637650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *==========================================================================*/
57647650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevint32_t QCamera3DepthChannel::unmapBuffer(uint32_t frameNumber) {
57657650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    int32_t index = mGrallocMem.getBufferIndex(frameNumber);
57667650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    if (0 > index) {
57677650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        LOGE("Frame number: %u not present!", frameNumber);
57687650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev        return BAD_VALUE;
57697650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    }
57707650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57717650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    return mGrallocMem.unregisterBuffer(index);
57727650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev}
57737650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57747650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev/*===========================================================================
57757650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * FUNCTION   : unmapAllBuffers
57767650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57777650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * DESCRIPTION: This will unmap all buffers
57787650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57797650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * PARAMETERS :
57807650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *
57817650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev * RETURN     : int32_t type of status
57827650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              NO_ERROR  -- success
57837650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *              none-zero failure code
57847650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev *==========================================================================*/
57857650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peevint32_t QCamera3DepthChannel::unmapAllBuffers() {
57867650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    mGrallocMem.unregisterBuffers();
57877650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57887650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev    return NO_ERROR;
57897650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev}
57907650c1251a7f9290f9caa7678bc556e0b83b7f11Emilian Peev
57913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace qcamera
5792