154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved. 254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * Redistribution and use in source and binary forms, with or without 454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * modification, are permitted provided that the following conditions are 554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * met: 654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * * Redistributions of source code must retain the above copyright 754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * notice, this list of conditions and the following disclaimer. 854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * * Redistributions in binary form must reproduce the above 954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * copyright notice, this list of conditions and the following 1054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * disclaimer in the documentation and/or other materials provided 1154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * with the distribution. 1254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * * Neither the name of The Linux Foundation nor the names of its 1354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * contributors may be used to endorse or promote products derived 1454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * from this software without specific prior written permission. 1554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 1654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 2854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel */ 2954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 3054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#define LOG_TAG "DualFOVPP" 3154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel// System dependencies 3254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include <dlfcn.h> 3354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include <utils/Errors.h> 3454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include <stdio.h> 3554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include <stdlib.h> 3654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel// Camera dependencies 3754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include "QCameraDualFOVPP.h" 3854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include "QCameraTrace.h" 3954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include "cam_intf.h" 4054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelextern "C" { 4154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#include "mm_camera_dbg.h" 4254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 4354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 4454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel#define LIB_PATH_LENGTH 100 4554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 4654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelnamespace qcamera { 4754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 4854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 4954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : QCameraDualFOVPP 5054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 5154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: constructor of QCameraDualFOVPP. 5254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 5354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : None 5454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 5554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : None 5654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 5754dc9783295b20e33ec11e132d98a1b8efbf254cThierry StrudelQCameraDualFOVPP::QCameraDualFOVPP() 5854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel : QCameraHALPP() 5954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 6054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_dlHandle = NULL; 6154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_pCaps = NULL; 6254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 6354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 6454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 6554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : ~QCameraDualFOVPP 6654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 6754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: destructor of QCameraDualFOVPP. 6854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 6954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : None 7054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 7154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : None 7254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 7354dc9783295b20e33ec11e132d98a1b8efbf254cThierry StrudelQCameraDualFOVPP::~QCameraDualFOVPP() 7454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 7554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 7654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 7754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 7854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : init 7954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 8054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: initialization of QCameraDualFOVPP 8154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 8254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : 8354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @bufNotifyCb : call back function after HALPP process 8454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @getOutputCb : call back function to request output buffe 8554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pUserData : Parent of HALPP, i.e. QCameraPostProc 8654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pStaticParam : holds dual camera calibration data in an array and its size 8754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * (expected size is 264 bytes) 8854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 8954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : int32_t type of status 9054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * NO_ERROR -- success 9154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * none-zero failure code 9254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 9354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::init(halPPBufNotify bufNotifyCb, halPPGetOutput getOutputCb, 9454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel void *pUserData, void *pStaticParam) 9554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 9654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 9754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int32_t rc = NO_ERROR; 9854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraHALPP::init(bufNotifyCb, getOutputCb, pUserData); 9954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 10054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_pCaps = (cam_capability_t *)pStaticParam; 10154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 10254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel /* we should load 3rd libs here, with dlopen/dlsym */ 10354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel doDualFovPPInit(); 10454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 10554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 10654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 10754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 10854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 10954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 11054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : deinit 11154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 11254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: de initialization of QCameraDualFOVPP 11354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 11454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : None 11554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 11654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : int32_t type of status 11754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * NO_ERROR -- success 11854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * none-zero failure code 11954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 12054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::deinit() 12154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 12254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int32_t rc = NO_ERROR; 12354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 12454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 12554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_dlHandle = NULL; 12654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 12754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraHALPP::deinit(); 12854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 12954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 13054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 13154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 13254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 13354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : start 13454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 13554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: starting QCameraDualFOVPP 13654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 13754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : 13854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 13954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : int32_t type of status 14054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * NO_ERROR -- success 14154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * none-zero failure code 14254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 14354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::start() 14454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 14554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int32_t rc = NO_ERROR; 14654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 14754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 14854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel rc = QCameraHALPP::start(); 14954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 15054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 15154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 15254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 15354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 15454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 15554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 15654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : feedInput 15754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 15854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: function to feed input data. 15954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * Enqueue the frame index to inputQ if it is new frame 16054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * Also, add the input image data to frame hash map 16154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 16254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : 16354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pInput : ptr to input data 16454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 16554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : int32_t type of status 16654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * NO_ERROR -- success 16754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * none-zero failure code 16854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 16954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::feedInput(qcamera_hal_pp_data_t *pInputData) 17054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 17154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int32_t rc = NO_ERROR; 17254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 17354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (NULL != pInputData) { 17454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pSnapshotStream = NULL; 17554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *pInputSnapshotBuf = getSnapshotBuf(pInputData, pSnapshotStream); 17654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pInputSnapshotBuf != NULL) { 17754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t frameIndex = pInputSnapshotBuf->frame_idx; 17854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel std::vector<qcamera_hal_pp_data_t*> *pVector = getFrameVector(frameIndex); 17954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if(pVector == NULL) { 18054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("insert new frame index = %d", frameIndex); 18154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t *pFrameIndex = new uint32_t; 18254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *pFrameIndex = frameIndex; 18354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // new the vector first 18454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pVector = new std::vector<qcamera_hal_pp_data_t*>(WIDE_TELE_CAMERA_NUMBER); 18554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pVector->at(WIDE_INPUT) = NULL; 18654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pVector->at(TELE_INPUT) = NULL; 18754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Add vector to the hash map 18854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_frameMap[frameIndex] = pVector; 18954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Enqueue the frame index (i.e. key of vector) to queue 19054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (false == m_iuputQ.enqueue((void*)pFrameIndex)) { 19154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Input Q is not active!!!"); 19254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel releaseData(pInputData); 19354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_frameMap.erase(frameIndex); 19454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel delete pFrameIndex; 19554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel delete pVector; 19654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel rc = INVALID_OPERATION; 19754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 19854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 19954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 20054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pInputData->frameIndex = frameIndex; 20154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Check if frame is from main wide camera 20254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel bool bIsMain = true; 20354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t mainHandle = get_main_camera_handle( 20454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pInputData->src_reproc_frame->camera_handle); 20554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (mainHandle == 0) { 20654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel bIsMain = false; 20754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 20854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("mainHandle = %d, is main frame = %d", mainHandle, bIsMain); 20954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Add input data to vector 21054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (bIsMain) { 21154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pVector->at(WIDE_INPUT) = pInputData; 21254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } else { 21354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pVector->at(TELE_INPUT) = pInputData; 21454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 21554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 21654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // request output buffer only if both wide and tele input data are recieved 21754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pVector->at(0) != NULL && pVector->at(1) != NULL) { 21854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_halPPGetOutputCB(frameIndex, m_pQCameraPostProc); 21954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 22054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 22154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } else { 22254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("pInput is NULL"); 22354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel rc = UNEXPECTED_NULL; 22454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 22554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 22654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 22754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 22854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 22954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 23054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : feedOutput 23154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 23254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: function to feed output buffer and metadata 23354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 23454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : 23554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pOutput : ptr to output data 23654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 23754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : int32_t type of status 23854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * NO_ERROR -- success 23954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * none-zero failure code 24054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 24154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::feedOutput(qcamera_hal_pp_data_t *pOutputData) 24254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 24354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int32_t rc = NO_ERROR; 24454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 24554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (NULL != pOutputData) { 24654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t frameIndex = pOutputData->frameIndex; 24754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel std::vector<qcamera_hal_pp_data_t*> *pVector = getFrameVector(frameIndex); 24854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Get the main (Wide) input frame in order to get output buffer len, 24954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // and copy metadata buffer. 25054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pVector != NULL && pVector->at(WIDE_INPUT) != NULL) { 25154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel qcamera_hal_pp_data_t *pInputData = pVector->at(WIDE_INPUT); 25254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_super_buf_t *pInputFrame = pInputData->frame; 25354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pSnapshotStream = NULL; 25454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pMetadataStream = NULL; 25554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *pInputSnapshotBuf = getSnapshotBuf(pInputData, pSnapshotStream); 25654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *pInputMetadataBuf = getMetadataBuf(pInputData, pMetadataStream); 25754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_super_buf_t *pOutputFrame = pOutputData->frame; 25854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *pOutputBufDefs = pOutputData->bufs; 25954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 26054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pInputSnapshotBuf == NULL || pInputMetadataBuf == NULL) { 26154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("cannot get sanpshot or metadata buf def"); 26254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel releaseData(pOutputData); 26354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 26454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 26554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pSnapshotStream == NULL || pMetadataStream == NULL) { 26654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("cannot get sanpshot or metadata stream"); 26754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel releaseData(pOutputData); 26854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 26954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 27054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 27154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Copy main input frame info to output frame 27254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->camera_handle = pInputFrame->camera_handle; 27354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->ch_id = pInputFrame->ch_id; 27454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->num_bufs = HAL_PP_NUM_BUFS;//snapshot and metadata 27554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->bUnlockAEC = pInputFrame->bUnlockAEC; 27654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->bReadyForPrepareSnapshot = pInputFrame->bReadyForPrepareSnapshot; 27754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 27854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Reconstruction of output_frame super buffer 27954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->bufs[0] = &pOutputBufDefs[0]; 28054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->bufs[1] = &pOutputBufDefs[1]; 28154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 28254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Allocate heap buffer for output image frame 28354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel cam_frame_len_offset_t offset; 28454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 28554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("pInputSnapshotBuf->frame_len = %d", pInputSnapshotBuf->frame_len); 28654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel rc = pOutputData->snapshot_heap->allocate(1, pInputSnapshotBuf->frame_len); 28754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (rc < 0) { 28854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Unable to allocate heap memory for image buf"); 28954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel releaseData(pOutputData); 29054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return NO_MEMORY; 29154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 29254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pSnapshotStream->getFrameOffset(offset); 29354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memcpy(&pOutputBufDefs[0], pInputSnapshotBuf, sizeof(mm_camera_buf_def_t)); 29454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("pOutputFrame->bufs[0]->fd = %d, pOutputFrame->bufs[0]->buffer = %x", 29554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->bufs[0]->fd, pOutputFrame->bufs[0]->buffer); 29654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputData->snapshot_heap->getBufDef(offset, pOutputBufDefs[0], 0); 29754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("pOutputFrame->bufs[0]->fd = %d, pOutputFrame->bufs[0]->buffer = %x", 29854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputFrame->bufs[0]->fd, pOutputFrame->bufs[0]->buffer); 29954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 30054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Allocate heap buffer for output metadata 30154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("pInputMetadataBuf->frame_len = %d", pInputMetadataBuf->frame_len); 30254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel rc = pOutputData->metadata_heap->allocate(1, pInputMetadataBuf->frame_len); 30354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (rc < 0) { 30454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Unable to allocate heap memory for metadata buf"); 30554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel releaseData(pOutputData); 30654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return NO_MEMORY; 30754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 30854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 30954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMetadataStream->getFrameOffset(offset); 31054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memcpy(&pOutputBufDefs[1], pInputMetadataBuf, sizeof(mm_camera_buf_def_t)); 31154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputData->metadata_heap->getBufDef(offset, pOutputBufDefs[1], 0); 31254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // copy the whole metadata 31354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memcpy(pOutputBufDefs[1].buffer, pInputMetadataBuf->buffer, 31454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pInputMetadataBuf->frame_len); 31554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 31654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Enqueue output_data to m_outgoingQ 31754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (false == m_outgoingQ.enqueue((void *)pOutputData)) { 31854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("outgoing Q is not active!!!"); 31954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel releaseData(pOutputData); 32054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel rc = INVALID_OPERATION; 32154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 32254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 32354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } else { 32454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("pOutput is NULL"); 32554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel rc = UNEXPECTED_NULL; 32654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 32754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 32854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 32954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 33054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 33154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 33254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : process 33354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 33454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: function to start CP FOV blending process 33554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 33654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : None 33754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 33854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : int32_t type of status 33954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * NO_ERROR -- success 34054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * none-zero failure code 34154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 34254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::process() 34354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 34454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int32_t rc = NO_ERROR; 34554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 34654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel /* dump in/out frames */ 34754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel char prop[PROPERTY_VALUE_MAX]; 34854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memset(prop, 0, sizeof(prop)); 34954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel property_get("persist.camera.dualfov.dumpimg", prop, "0"); 35054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int dumpimg = atoi(prop); 35154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 35254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 35354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 35454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // TODO: dequeue from m_inputQ and start process logic 35554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Start the blending process when it is ready 35654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (canProcess()) { 35754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGI("start Dual FOV process"); 35854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t *pFrameIndex = (uint32_t *)m_iuputQ.dequeue(); 3592896d129511c499aef15b8162df05fa299860f59Thierry Strudel if (pFrameIndex == NULL) { 3602896d129511c499aef15b8162df05fa299860f59Thierry Strudel LOGE("frame index is null"); 3612896d129511c499aef15b8162df05fa299860f59Thierry Strudel return UNEXPECTED_NULL; 3622896d129511c499aef15b8162df05fa299860f59Thierry Strudel } 36354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t frameIndex = *pFrameIndex; 36454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel std::vector<qcamera_hal_pp_data_t*> *pVector = getFrameVector(frameIndex); 36554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Search vector of input frames in frame map 36654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pVector == NULL) { 36754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find vecotr of input frames"); 36854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 36954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 37054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Get input and output frame buffer 37154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel qcamera_hal_pp_data_t *pInputMainData = 37254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel (qcamera_hal_pp_data_t *)pVector->at(WIDE_INPUT); 37354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pInputMainData == NULL) { 37454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find input main data"); 37554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 37654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 37754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pInputMainData->src_reproc_frame == NULL) { 37854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGI("process pInputMainData->src_reproc_frame = NULL"); 37954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 38054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel //mm_camera_super_buf_t *input_main_frame = input_main_data->frame; 38154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel qcamera_hal_pp_data_t *pInputAuxData = 38254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel (qcamera_hal_pp_data_t *)pVector->at(TELE_INPUT); 38354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pInputAuxData == NULL) { 38454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find input aux data"); 38554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 38654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 38754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 38854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel //mm_camera_super_buf_t *input_aux_frame = input_aux_data->frame; 38954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel qcamera_hal_pp_data_t *pOutputData = 39054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel (qcamera_hal_pp_data_t*)m_outgoingQ.dequeue(); 39154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pOutputData == NULL) { 39254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find output data"); 39354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 39454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 39554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 39654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pMainSnapshotStream = NULL; 39754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pMainMetadataStream = NULL; 39854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pAuxSnapshotStream = NULL; 39954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pAuxMetadataStream = NULL; 40054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 40154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *main_snapshot_buf = 40254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel getSnapshotBuf(pInputMainData, pMainSnapshotStream); 40354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (main_snapshot_buf == NULL) { 40454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("main_snapshot_buf is NULL"); 40554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 40654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 40754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *main_meta_buf = getMetadataBuf(pInputMainData, pMainMetadataStream); 40854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (main_meta_buf == NULL) { 40954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("main_meta_buf is NULL"); 41054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 41154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 41254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *aux_snapshot_buf = getSnapshotBuf(pInputAuxData, pAuxSnapshotStream); 41354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (aux_snapshot_buf == NULL) { 41454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("aux_snapshot_buf is NULL"); 41554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 41654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 41754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *aux_meta_buf = getMetadataBuf(pInputAuxData, pAuxMetadataStream); 41854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (aux_meta_buf == NULL) { 41954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("aux_meta_buf is NULL"); 42054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 42154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 42254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 42354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_super_buf_t *output_frame = pOutputData->frame; 42454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *output_snapshot_buf = output_frame->bufs[0]; 42554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 42654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Use offset info from reproc stream 42754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pMainSnapshotStream == NULL) { 42854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("pMainSnapshotStream is NULL"); 42954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 43054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 43154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel cam_frame_len_offset_t frm_offset; 43254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMainSnapshotStream->getFrameOffset(frm_offset); 43354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGI("Stream type:%d, stride:%d, scanline:%d, frame len:%d", 43454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMainSnapshotStream->getMyType(), 43554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel frm_offset.mp[0].stride, frm_offset.mp[0].scanline, 43654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel frm_offset.frame_len); 43754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 43854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (dumpimg) { 43954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel dumpYUVtoFile((uint8_t *)main_snapshot_buf->buffer, frm_offset, 44054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel main_snapshot_buf->frame_idx, "wide"); 44154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel dumpYUVtoFile((uint8_t *)aux_snapshot_buf->buffer, frm_offset, 44254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel aux_snapshot_buf->frame_idx, "tele"); 44354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 44454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 44554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel //Get input and output parameter 44654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel dualfov_input_params_t inParams; 44754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pAuxSnapshotStream == NULL) { 44854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("pAuxSnapshotStream is NULL"); 44954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return UNEXPECTED_NULL; 45054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 45154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel getInputParams(main_meta_buf, aux_meta_buf, pMainSnapshotStream, pAuxSnapshotStream, 45254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams); 45354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel dumpInputParams(inParams); 45454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 45554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel doDualFovPPProcess((const uint8_t *)main_snapshot_buf->buffer, 45654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel (const uint8_t *)aux_snapshot_buf->buffer, 45754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams, 45854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel (uint8_t *)output_snapshot_buf->buffer); 45954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 46054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (dumpimg) { 46154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel dumpYUVtoFile((uint8_t *)output_snapshot_buf->buffer, frm_offset, 46254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel main_snapshot_buf->frame_idx, "out"); 46354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 46454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 46554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel /* clean and invalidate caches, for input and output buffers*/ 46654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pOutputData->snapshot_heap->cleanInvalidateCache(0); 46754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 46854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraMemory *pMem = (QCameraMemory *)main_snapshot_buf->mem_info; 46954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMem->invalidateCache(main_snapshot_buf->buf_idx); 47054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 47154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMem = (QCameraMemory *)aux_snapshot_buf->mem_info; 47254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMem->invalidateCache(aux_snapshot_buf->buf_idx); 47354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 47454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 47554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Calling cb function to return output_data after processed. 47654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_halPPBufNotifyCB(pOutputData, m_pQCameraPostProc); 47754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 47854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // also send input buffer to postproc. 47954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_halPPBufNotifyCB(pInputMainData, m_pQCameraPostProc); 48054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_halPPBufNotifyCB(pInputAuxData, m_pQCameraPostProc); 48154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel //releaseData(pInputMainData); 48254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel //releaseData(pInputAuxData); 48354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 48454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Release internal resource 48554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_frameMap.erase(frameIndex); 48654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel delete pFrameIndex; 48754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel delete pVector; 48854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 48954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 49054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 49154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 49254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 49354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 49454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : getSnapshotBuf 49554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 49654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: function to get snapshot buf def and the stream from frame 49754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : 49854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pData : input frame super buffer 49954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pSnapshotStream : stream of snapshot that found 50054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : snapshot buf def 50154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 50254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelmm_camera_buf_def_t* QCameraDualFOVPP::getSnapshotBuf(qcamera_hal_pp_data_t* pData, 50354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* &pSnapshotStream) 50454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 50554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *pBufDef = NULL; 50654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pData == NULL) { 50754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find input frame super buffer"); 50854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return pBufDef; 50954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 51054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_super_buf_t *pFrame = pData->frame; 51154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraChannel *pChannel = m_pQCameraPostProc->getChannelByHandle(pFrame->ch_id); 51254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pChannel == NULL) { 51354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find channel"); 51454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return pBufDef; 51554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 51654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Search for input snapshot frame buf 51754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel for (uint32_t i = 0; i < pFrame->num_bufs; i++) { 51854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pSnapshotStream = pChannel->getStreamByHandle(pFrame->bufs[i]->stream_id); 51954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pSnapshotStream != NULL) { 52054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pSnapshotStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 52154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pSnapshotStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 52254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pBufDef = pFrame->bufs[i]; 52354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel break; 52454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 52554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 52654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 52754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return pBufDef; 52854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 52954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 53054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 53154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : getMetadataBuf 53254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 53354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: function to get metadata buf def and the stream from frame 53454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : 53554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pData : input frame super buffer 53654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pMetadataStream : stream of metadata that found 53754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : metadata buf def 53854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 53954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelmm_camera_buf_def_t* QCameraDualFOVPP::getMetadataBuf(qcamera_hal_pp_data_t *pData, 54054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* &pMetadataStream) 54154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 54254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *pBufDef = NULL; 54354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pData == NULL) { 54454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find input frame super buffer"); 54554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return pBufDef; 54654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 54754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_super_buf_t* pFrame = pData->frame; 54854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraChannel *pChannel = 54954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel m_pQCameraPostProc->getChannelByHandle(pData->src_reproc_frame->ch_id); 55054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("src_reproc_frame num_bufs = %d", pFrame->num_bufs); 55154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pChannel == NULL) { 55254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find src_reproc_frame channel"); 55354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return pBufDef; 55454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 5552896d129511c499aef15b8162df05fa299860f59Thierry Strudel for (uint32_t i = 0; 55654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel (i < pData->src_reproc_frame->num_bufs); i++) { 55754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMetadataStream = pChannel->getStreamByHandle(pData->src_reproc_frame->bufs[i]->stream_id); 55854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pData->src_reproc_frame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 55954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pBufDef = pData->src_reproc_frame->bufs[i]; 56054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("find metadata stream and buf from src_reproc_frame"); 56154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel break; 56254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 56354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 56454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pBufDef == NULL) { 56554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("frame num_bufs = %d", pFrame->num_bufs); 56654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pChannel = m_pQCameraPostProc->getChannelByHandle(pFrame->ch_id); 56754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pChannel == NULL) { 56854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Cannot find frame channel"); 56954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return pBufDef; 57054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 57154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel for (uint32_t i = 0; i < pFrame->num_bufs; i++) { 57254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMetadataStream = pChannel->getStreamByHandle(pFrame->bufs[i]->stream_id); 57354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pMetadataStream != NULL) { 57454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("bufs[%d] stream_type = %d", i, pFrame->bufs[i]->stream_type); 57554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pFrame->bufs[i]->stream_type == CAM_STREAM_TYPE_METADATA) { 57654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pBufDef = pFrame->bufs[i]; 57754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel break; 57854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 57954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 58054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 58154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 58254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return pBufDef; 58354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 58454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 58554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 58654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : canProcess 58754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 58854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: function to release internal resources 58954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : If CP FOV can start blending process 59054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 59154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelbool QCameraDualFOVPP::canProcess() 59254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 59354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 59454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel bool ready = false; 59554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if(!m_iuputQ.isEmpty() && !m_outgoingQ.isEmpty()) { 59654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel ready = true; 59754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 59854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 59954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return ready; 60054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 60154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 60254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 60354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : getInputParams 60454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 60554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: Helper function to get input params from input metadata 60654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 60754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelvoid QCameraDualFOVPP::getInputParams(mm_camera_buf_def_t *pMainMetaBuf, 60854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel mm_camera_buf_def_t *pAuxMetaBuf, QCameraStream* pMainSnapshotStream, 60954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraStream* pAuxSnapshotStream, dualfov_input_params_t& inParams) 61054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 61154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 61254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memset(&inParams, 0, sizeof(dualfov_input_params_t)); 61354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel metadata_buffer_t *pMainMeta = (metadata_buffer_t *)pMainMetaBuf->buffer; 61454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel metadata_buffer_t *pAuxMeta = (metadata_buffer_t *)pAuxMetaBuf->buffer; 61554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 61654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Wide frame size 61754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel cam_frame_len_offset_t offset; 61854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pMainSnapshotStream->getFrameOffset(offset); 61954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.width = offset.mp[0].width; 62054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.height = offset.mp[0].height; 62154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.stride = offset.mp[0].stride; 62254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.scanline = offset.mp[0].scanline; 62354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.frame_len = offset.frame_len; 62454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 62554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Tele frame size 62654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pAuxSnapshotStream->getFrameOffset(offset); 62754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.tele.width = offset.mp[0].width; 62854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.tele.height = offset.mp[0].height; 62954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.tele.stride = offset.mp[0].stride; 63054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.tele.scanline = offset.mp[0].scanline; 63154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.tele.frame_len = offset.frame_len; 63254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 63354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // user_zoom 63454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int32_t zoom_level = -1; // 0 means zoom 1x. 63554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel IF_META_AVAILABLE(int32_t, userZoom, CAM_INTF_PARM_ZOOM, pMainMeta) { 63654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel zoom_level = *userZoom; 63754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("zoom level in main meta:%d", zoom_level); 63854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 63954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.user_zoom= getUserZoomRatio(zoom_level); 64054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGI("dual fov total zoom ratio: %d", inParams.user_zoom); 64154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 64254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel IF_META_AVAILABLE(int32_t, auxUserZoom, CAM_INTF_PARM_ZOOM, pAuxMeta) { 64354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("zoom level in aux meta:%d", *auxUserZoom); 64454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 64554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 64654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel IF_META_AVAILABLE(uint32_t, afState, CAM_INTF_META_AF_STATE, pMainMeta) { 64754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (((*afState) == CAM_AF_STATE_FOCUSED_LOCKED) || 64854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel ((*afState) == CAM_AF_STATE_PASSIVE_FOCUSED)) { 64954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.af_status = AF_STATUS_VALID; 65054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } else { 65154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.af_status = AF_STATUS_INVALID; 65254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 65354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("af state:%d, output af status:%d", *afState, inParams.af_status); 65454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 65554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 65654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel IF_META_AVAILABLE(uint32_t, auxAfState, CAM_INTF_META_AF_STATE, pAuxMeta) { 65754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int aux_af_status = 0; 65854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (((*auxAfState) == CAM_AF_STATE_FOCUSED_LOCKED) || 65954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel ((*auxAfState) == CAM_AF_STATE_PASSIVE_FOCUSED)) { 66054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel aux_af_status = AF_STATUS_VALID; 66154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } else { 66254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel aux_af_status = AF_STATUS_INVALID; 66354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 66454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("aux af state:%d, output af status:%d", *auxAfState, aux_af_status); 66554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 66654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 66754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 66854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 66954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 67054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 67154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 67254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::doDualFovPPInit() 67354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 67454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 67554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel int rc = NO_ERROR; 67654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 67754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 67854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return rc; 67954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 68054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 68154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelint32_t QCameraDualFOVPP::doDualFovPPProcess(const uint8_t* pWide, const uint8_t* pTele, 68254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel dualfov_input_params_t inParams, 68354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint8_t* pOut) 68454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 68554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGW("E."); 68654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 68754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // trace begin 68854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 68954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // half image from main, and half image from tele 69054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 69154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // Y 69254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memcpy(pOut, pWide, inParams.wide.stride * inParams.wide.scanline / 2); 69354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memcpy(pOut + inParams.wide.stride * inParams.wide.scanline / 2, 69454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pTele + inParams.wide.stride * inParams.wide.scanline / 2, 69554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.stride * inParams.wide.scanline / 2); 69654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 69754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // UV 69854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t uv_offset = inParams.wide.stride * inParams.wide.scanline; 69954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memcpy(pOut + uv_offset, 70054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pWide + uv_offset, 70154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.stride * (inParams.wide.scanline / 2) / 2); 70254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel memcpy(pOut + uv_offset + inParams.wide.stride * (inParams.wide.scanline / 2) / 2, 70354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel pTele + uv_offset + inParams.wide.stride * (inParams.wide.scanline / 2) / 2, 70454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel inParams.wide.stride * (inParams.wide.scanline / 2) / 2); 70554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 70654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // trace end 70754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 70854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGW("X."); 70954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return NO_ERROR; 71054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 71154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 71254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudeluint32_t QCameraDualFOVPP::getUserZoomRatio(int32_t zoom_level) 71354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 71454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint32_t zoom_ratio = 4096; 71554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 71654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E. input zoom level:%d", zoom_level); 71754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 71854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (zoom_level < 0) { 71954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGW("invalid zoom evel!"); 72054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel /* got the zoom value from QCamera2HWI Parameters */ 72154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel zoom_level = 0; 72254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 72354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 72454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel // user_zoom_ratio = qcom_zoom_ratio * 4096 / 100 72554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (m_pCaps != NULL) { 72654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel zoom_ratio *= m_pCaps->zoom_ratio_tbl[zoom_level]; 72754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel zoom_ratio /= 100; 72854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("converted zoom ratio:%d", zoom_ratio); 72954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 73054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 73154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X. zoom_ratio:%d", zoom_ratio); 73254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return zoom_ratio; 73354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 73454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 73554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelvoid QCameraDualFOVPP::dumpYUVtoFile(const uint8_t* pBuf, cam_frame_len_offset_t offset, uint32_t idx, const char* name_prefix) 73654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 73754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E."); 73854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel char filename[256]; 73954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 74054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel snprintf(filename, sizeof(filename), QCAMERA_DUMP_FRM_LOCATION"%s_%dx%d_%d.yuv", 74154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel name_prefix, offset.mp[0].stride, offset.mp[0].scanline, idx); 74254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 74354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel QCameraHALPP::dumpYUVtoFile(pBuf,(const char*)filename, offset.frame_len); 74454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 74554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X."); 74654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 74754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 74854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelvoid QCameraDualFOVPP::dumpInputParams(const dualfov_input_params_t& p) 74954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 75054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("E"); 75154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 75254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel const cam_frame_size_t* s = NULL; 75354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 75454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel s = &p.wide; 75554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("wide frame size: %d, %d, stride:%d, scanline:%d", 75654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel s->width, s->height, s->stride, s->scanline); 75754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 75854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel s = &p.tele; 75954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("wide frame size: %d, %d, stride:%d, scanline:%d", 76054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel s->width, s->height, s->stride, s->scanline); 76154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 76254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("zoom ratio: %f", p.user_zoom / 4096.0); 76354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("X"); 76454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 76554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 76654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 76754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel/*=========================================================================== 76854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * FUNCTION : dumpOISData 76954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 77054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * DESCRIPTION: Read Sensor OIS data from metadata and dump it 77154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 77254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * PARAMETERS : 77354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * @pMetadata : Frame metadata 77454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 77554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * RETURN : None 77654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel * 77754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel *==========================================================================*/ 77854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudelvoid QCameraDualFOVPP::dumpOISData(metadata_buffer_t* pMetadata) 77954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel{ 78054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (!pMetadata) { 78154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("OIS data not available"); 78254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return; 78354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 78454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 78554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel IF_META_AVAILABLE(cam_ois_data_t, pOisData, CAM_INTF_META_OIS_READ_DATA, pMetadata) { 78654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("Ois Data: data size: %d", pOisData->size); 78754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel uint8_t *data = pOisData->data; 78854dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel if (pOisData->size == 8) { 78954dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGD("Ois Data Buffer : %d %d %d %d %d %d %d %d ", 79054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); 79154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 79254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } 79354dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel return; 79454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} 79554dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 79654dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 79754dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel} // namespace qcamera 798