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