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