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 303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QCameraChannel" 313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies 333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Errors.h> 343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies 363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera2HWI.h" 373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" { 393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h" 403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace android; 433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera { 453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraChannel 483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constrcutor of QCameraChannel 503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_handle : camera handle 533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_ops : ptr to camera ops table 543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 573d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraChannel::QCameraChannel(uint32_t cam_handle, 583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops) 593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_camHandle = cam_handle; 613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_camOps = cam_ops; 623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_bIsActive = false; 633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_bAllowDynBufAlloc = false; 64cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mDualChannel = is_dual_camera_by_handle(cam_handle); 653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_handle = 0; 663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraChannel 703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constrcutor of QCameraChannel 723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 773d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraChannel::QCameraChannel() 783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_camHandle = 0; 803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_camOps = NULL; 813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_bIsActive = false; 82cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mDualChannel = 0; 833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_handle = 0; 843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~QCameraChannel 883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraChannel 903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 953d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraChannel::~QCameraChannel() 963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (m_bIsActive) { 983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stop(); 993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams[i] != NULL) { 102cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (validate_handle(m_handle, mStreams[i]->getChannelHandle())) { 103cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel delete mStreams[i]; 104cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams.clear(); 1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_camOps->delete_channel(m_camHandle, m_handle); 1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_handle = 0; 1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : deleteChannel 1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: deletes a camera channel 1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraChannel::deleteChannel() 1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (m_bIsActive) { 1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stop(); 1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 127cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if ((mStreams[i] != NULL) && 128cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) { 1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->deleteStream(); 1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_camOps->delete_channel(m_camHandle, m_handle); 1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setStreamSyncCB 1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: reg callback function to stream of stream type 1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream_type : Stream type for which callback needs to be registered. 1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream_cb : Callback function 1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * non-zero failure code 1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::setStreamSyncCB (cam_stream_type_t stream_type, 1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream_cb_routine stream_cb) 1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = UNKNOWN_ERROR; 1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[i] != NULL) && (stream_type == mStreams[i]->getMyType())) { 1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[i]->setSyncDataCB(stream_cb); 1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : init 1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: initialization of channel 1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @attr : channel bundle attribute setting 1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataCB : data notify callback 1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userData: user data ptr 1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::init(mm_camera_channel_attr_t *attr, 1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_notify_t dataCB, 1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void *userData) 1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_handle = m_camOps->add_channel(m_camHandle, 1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel attr, 1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dataCB, 1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel userData); 1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (m_handle == 0) { 1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Add channel failed"); 1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1872896d129511c499aef15b8162df05fa299860f59Thierry Strudel 1882896d129511c499aef15b8162df05fa299860f59Thierry Strudel mActiveCameras = MM_CAMERA_TYPE_MAIN; 189cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (isDualChannel()) { 1902896d129511c499aef15b8162df05fa299860f59Thierry Strudel mActiveCameras |= MM_CAMERA_TYPE_AUX; 191cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 1922896d129511c499aef15b8162df05fa299860f59Thierry Strudel mMasterCamera = MM_CAMERA_TYPE_MAIN; 1932896d129511c499aef15b8162df05fa299860f59Thierry Strudel mBundledSnapshot = false; 1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 198cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * FUNCTION : getChHandleForStream 199cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 200cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * DESCRIPTION: return actual channel handle based on use case per stream 201cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 202cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * PARAMETERS : 203cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * @ch_type : type of channel 204cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 205cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * RETURN : number of buffers needed 206cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * NOTE : Based on the use cases and auxillary camera type, 207cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel we can decide channel handle for streams. 208cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel Incase, we want to avoid any stream for auxillary camera, 209cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel we can decide here. 210cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *==========================================================================*/ 211cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudeluint32_t QCameraChannel::getChHandleForStream(cam_stream_type_t stream_type) 212cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel{ 213cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel uint32_t handle = m_handle; 214cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (!mDualChannel) { 215cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel return m_handle; 216cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 217cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 218cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel /*Based on the use case, decide channel handle for channel*/ 219cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel switch (stream_type) { 220cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_PREVIEW: 221cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_SNAPSHOT: 222cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_VIDEO: 223cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_METADATA: 224cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_ANALYSIS: 225cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_CALLBACK: 226cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel handle = m_handle; 227cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel break; 228cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_POSTVIEW: 229cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_RAW: 230cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_OFFLINE_PROC: 231cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_DEFAULT: 232cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel case CAM_STREAM_TYPE_MAX: 233cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel default: 234cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel handle = get_main_camera_handle(m_handle); 235cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel break; 236cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 237cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel return handle; 238cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} 239cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 240cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*=========================================================================== 2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : addStream 2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: add a stream into channel 2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @allocator : stream related buffer allocator 2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @streamInfoBuf : ptr to buf that contains stream info 2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @miscBuf : ptr to buf that contains misc buffers 2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @minStreamBufNum: number of stream buffers needed 2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @paddingInfo : padding information 2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream_cb : stream data notify callback 2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @userdata : user data ptr 2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @bDynAllocBuf : flag indicating if allow allocate buffers in 2 steps 2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @online_rotation: rotation applied online 2552896d129511c499aef15b8162df05fa299860f59Thierry Strudel * @cam_type : Camera type in case of dual camera 2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::addStream(QCameraAllocator &allocator, 2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraHeapMemory *streamInfoBuf, QCameraHeapMemory *miscBuf, 263cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel cam_padding_info_t *paddingInfo, stream_cb_routine stream_cb, 264cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel void *userdata, bool bDynAllocBuf, bool bDeffAlloc, 2652896d129511c499aef15b8162df05fa299860f59Thierry Strudel cam_rotation_t online_rotation, 2662896d129511c499aef15b8162df05fa299860f59Thierry Strudel uint32_t cam_type) 2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 2692896d129511c499aef15b8162df05fa299860f59Thierry Strudel uint32_t ch_handle = m_handle; 2702896d129511c499aef15b8162df05fa299860f59Thierry Strudel 2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams.size() >= MAX_STREAM_NUM_IN_BUNDLE) { 2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("stream number (%zu) exceeds max limit (%d)", 2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams.size(), MAX_STREAM_NUM_IN_BUNDLE); 2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (streamInfoBuf != NULL) { 2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfoBuf->deallocate(); 2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete streamInfoBuf; 2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfoBuf = NULL; 2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2812896d129511c499aef15b8162df05fa299860f59Thierry Strudel 2822896d129511c499aef15b8162df05fa299860f59Thierry Strudel if (cam_type == MM_CAMERA_TYPE_MAIN) { 2832896d129511c499aef15b8162df05fa299860f59Thierry Strudel ch_handle = get_main_camera_handle(m_handle); 2842896d129511c499aef15b8162df05fa299860f59Thierry Strudel } else if (cam_type == MM_CAMERA_TYPE_AUX) { 2852896d129511c499aef15b8162df05fa299860f59Thierry Strudel ch_handle = get_aux_camera_handle(m_handle); 2862896d129511c499aef15b8162df05fa299860f59Thierry Strudel } 2872896d129511c499aef15b8162df05fa299860f59Thierry Strudel 2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = new QCameraStream(allocator, 2892896d129511c499aef15b8162df05fa299860f59Thierry Strudel m_camHandle, ch_handle, m_camOps, paddingInfo, bDeffAlloc, 2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel online_rotation); 2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream == NULL) { 2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No mem for Stream"); 2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (streamInfoBuf != NULL) { 2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfoBuf->deallocate(); 2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete streamInfoBuf; 2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfoBuf = NULL; 2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 301cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel rc = pStream->init(streamInfoBuf, miscBuf, 3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream_cb, userdata, bDynAllocBuf); 3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc == 0) { 304cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel Mutex::Autolock lock(mStreamLock); 3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams.add(pStream); 3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete pStream; 3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : linkStream 3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: link a stream into channel 3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @ch : Channel which the stream belongs to 3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : Stream which needs to be linked 3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::linkStream(QCameraChannel *ch, QCameraStream *stream) 3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((0 == m_handle) || (NULL == ch) || (NULL == stream)) { 3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t handle = m_camOps->link_stream(m_camHandle, 3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ch->getMyHandle(), 3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream->getMyHandle(), 3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_handle); 3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 == handle) { 3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Linking of stream failed"); 3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = INVALID_OPERATION; 3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 341cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel Mutex::Autolock lock(mStreamLock); 3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams.add(stream); 3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : start 3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: start channel, which will start all streams belong to this channel 3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::start() 3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(m_bIsActive) { 3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("Attempt to start active channel"); 3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 368cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // there is more than one stream in the channel 369cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // we need to notify mctl that all streams in this channel need to be bundled 370cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 371cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if ((mStreams[i] != NULL) && 372cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) { 373cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mStreams[i]->setBundleInfo(); 3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 377cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[i] != NULL) && 380cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) { 3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->start(); 3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 384ce5b8667939a3d4678b0178011ad519013c86384Chien-Yu Chen rc = m_camOps->start_channel(m_camHandle, m_handle, /*start_sensor_streaming*/true); 3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[i] != NULL) && 389cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) { 3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->stop(); 3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_bIsActive = true; 3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams[i] != NULL) { 3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->cond_signal(); 3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stop 4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop a channel, which will stop all streams belong to this channel 4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::stop() 4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t i = 0; 4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!m_bIsActive) { 4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 425cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel { 426cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel Mutex::Autolock lock(mStreamLock); 427cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel while(i < mStreams.size()) { 428cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (mStreams[i] != NULL) { 429cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (validate_handle(m_handle, mStreams[i]->getChannelHandle())) { 430cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mStreams[i]->stop(); 431cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel i++; 432cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } else { 433cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel // Remove linked stream from stream list 434cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mStreams.removeAt(i); 435cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 44009cb28ee5fe4b3664777977d75fde8a6372d2f32Chien-Yu Chen rc = m_camOps->stop_channel(m_camHandle, m_handle, /*stop_immediately*/false); 4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_bIsActive = false; 4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : bufDone 4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return a stream buf back to kernel 4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @recvd_frame : stream buf frame to be returned 4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame) 4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (recvd_frame->bufs[i] != NULL) { 463cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel for (uint32_t j = 0; j < mStreams.size(); j++) { 4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams[j] != NULL && 465cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(mStreams[j]->getMyHandle(), 466cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel recvd_frame->bufs[i]->stream_id))) { 4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx); 4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; // break loop j 4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : bufDone 4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return specified buffer from super buffer to kernel 4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @recvd_frame : stream buf frame to be returned 4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream_id : stream ID of the buffer to be released 4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame, uint32_t stream_id) 4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t index; 4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int32_t i = 0; i < (int32_t)recvd_frame->num_bufs; i++) { 4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index = -1; 4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((recvd_frame->bufs[i] != NULL) && 4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (recvd_frame->bufs[i]->stream_id == stream_id)) { 498cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel for (uint32_t j = 0; j < mStreams.size(); j++) { 4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[j] != NULL) && 500cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(mStreams[j]->getMyHandle(), 501cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel recvd_frame->bufs[i]->stream_id))) { 5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx); 5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel index = i; 5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; // break loop j 5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((index >= 0) && (index < (int32_t)recvd_frame->num_bufs)) { 5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int32_t j = index; j < (int32_t)(recvd_frame->num_bufs - 1); j++) { 5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel recvd_frame->bufs[j] = recvd_frame->bufs[j + 1]; 5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel recvd_frame->num_bufs--; 5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel i--; 5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : processZoomDone 5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: process zoom done event 5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @previewWindoe : ptr to preview window ops table, needed to set preview 5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * crop information 5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @crop_info : crop info as a result of zoom operation 5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::processZoomDone(preview_stream_ops_t *previewWindow, 5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_crop_data_t &crop_info) 5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 538cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel Mutex::Autolock lock(mStreamLock); 5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[i] != NULL) && 541cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) { 5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[i]->processZoomDone(previewWindow, crop_info); 5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getStreamByHandle 5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by stream handle 5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @streamHandle : stream handle 5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : stream object. NULL if not found 5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 5583d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream *QCameraChannel::getStreamByHandle(uint32_t streamHandle) 5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 561cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (mStreams[i] != NULL && 562cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(mStreams[i]->getMyHandle(), streamHandle))) { 5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mStreams[i]; 5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getStreamByServerID 5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by stream server ID from daemon 5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @serverID : stream server ID 5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : stream object. NULL if not found 5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 5793d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream *QCameraChannel::getStreamByServerID(uint32_t serverID) 5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams[i] != NULL && mStreams[i]->getMyServerID() == serverID) { 5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mStreams[i]; 5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getStreamByIndex 5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return stream object by index of streams in the channel 5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @index : index of stream in the channel 5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : stream object. NULL if not found 5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 5993d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream *QCameraChannel::getStreamByIndex(uint32_t index) 6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (index >= MAX_STREAM_NUM_IN_BUNDLE) { 6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (index < mStreams.size()) { 6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mStreams[index]; 6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : UpdateStreamBasedParameters 6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: update any stream based settings from parameters 6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @param : reference to parameters object 6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraChannel::UpdateStreamBasedParameters(QCameraParametersIntf ¶m) 6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 626cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel Mutex::Autolock lock(mStreamLock); 6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (param.isPreviewFlipChanged()) { 6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // try to find preview stream 6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[i] != NULL) && 631cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle())) && 6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW))) ) { 6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_parm_buffer_t param_buf; 6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(¶m_buf, 0, sizeof(cam_stream_parm_buffer_t)); 6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP; 6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param_buf.flipInfo.flip_mask = 6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_PREVIEW); 6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[i]->setParameter(param_buf); 6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("set preview stream flip failed"); 6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (param.isVideoFlipChanged()) { 6473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // try to find video stream 6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 6493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[i] != NULL) && 650cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle())) && 6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO) || 6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_VIDEO))) ) { 6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_parm_buffer_t param_buf; 6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(¶m_buf, 0, sizeof(cam_stream_parm_buffer_t)); 6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP; 6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param_buf.flipInfo.flip_mask = 6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_VIDEO); 6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[i]->setParameter(param_buf); 6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("set video stream flip failed"); 6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (param.isSnapshotFlipChanged()) { 6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // try to find snapshot/postview stream 6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams[i] != NULL && 669cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle())) && 6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW) ) ) { 6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_parm_buffer_t param_buf; 6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(¶m_buf, 0, sizeof(cam_stream_parm_buffer_t)); 6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP; 6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param_buf.flipInfo.flip_mask = 6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT); 6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[i]->setParameter(param_buf); 6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("set snapshot stream flip failed"); 6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 690cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * FUNCTION : processCameraControl 691cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 692cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * DESCRIPTION: Suspend and resume camera 693cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 694cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * PARAMETERS : 695cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * @camState : Camera start. MAIN/AUX/MAIN&AUX 696cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 697cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * RETURN : int32_t type of status 698cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * NO_ERROR -- success 699cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * none-zero failure code 700cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *==========================================================================*/ 7012896d129511c499aef15b8162df05fa299860f59Thierry Strudelint32_t QCameraChannel::processCameraControl( 7022896d129511c499aef15b8162df05fa299860f59Thierry Strudel uint32_t camState, 7032896d129511c499aef15b8162df05fa299860f59Thierry Strudel bool bundledSnapshot) 704cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel{ 705cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel int32_t ret = NO_ERROR; 706cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 707cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 708cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (mStreams[i] != NULL && mStreams[i]->isDualStream()) { 709cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel ret = mStreams[i]->processCameraControl(camState); 710cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (ret != NO_ERROR) { 71154dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel LOGE("Stream handle failed"); 712cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel break; 713cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 714cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 715cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 716cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 7172896d129511c499aef15b8162df05fa299860f59Thierry Strudel mActiveCameras = camState; 7182896d129511c499aef15b8162df05fa299860f59Thierry Strudel mBundledSnapshot = bundledSnapshot; 719cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel return ret; 720cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} 721cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 722cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*=========================================================================== 723cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * FUNCTION : switchChannelCb 724cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 725cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * DESCRIPTION: switch channel's in case of dual camera 726cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 727cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * PARAMETERS : 7282896d129511c499aef15b8162df05fa299860f59Thierry Strudel * @camMaster : Master camera 729cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * 730cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * RETURN : int32_t type of status 731cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * NO_ERROR -- success 732cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel * none-zero failure code 733cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel *==========================================================================*/ 7342896d129511c499aef15b8162df05fa299860f59Thierry Strudelint32_t QCameraChannel::switchChannelCb(uint32_t camMaster) 735cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel{ 736cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel int32_t ret = NO_ERROR; 737cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 738cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 739cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (mStreams[i] != NULL && mStreams[i]->isDualStream()) { 7402896d129511c499aef15b8162df05fa299860f59Thierry Strudel ret = mStreams[i]->switchStreamCb(camMaster); 741cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (ret != NO_ERROR) { 742cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel LOGE("Stream Switch Failed"); 743cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel break; 744cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 745cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 746cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 747cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 7482896d129511c499aef15b8162df05fa299860f59Thierry Strudel // Update master camera 7492896d129511c499aef15b8162df05fa299860f59Thierry Strudel mMasterCamera = camMaster; 7502896d129511c499aef15b8162df05fa299860f59Thierry Strudel return ret; 7512896d129511c499aef15b8162df05fa299860f59Thierry Strudel} 7522896d129511c499aef15b8162df05fa299860f59Thierry Strudel 7532896d129511c499aef15b8162df05fa299860f59Thierry Strudel/*=========================================================================== 7542896d129511c499aef15b8162df05fa299860f59Thierry Strudel * FUNCTION : getSnapshotHandle 7552896d129511c499aef15b8162df05fa299860f59Thierry Strudel * 7562896d129511c499aef15b8162df05fa299860f59Thierry Strudel * DESCRIPTION: Get the camera handle for snapshot based on the bundlesnapshot 7572896d129511c499aef15b8162df05fa299860f59Thierry Strudel * flag and active camera state 7582896d129511c499aef15b8162df05fa299860f59Thierry Strudel * 7592896d129511c499aef15b8162df05fa299860f59Thierry Strudel * PARAMETERS : None 7602896d129511c499aef15b8162df05fa299860f59Thierry Strudel * 7612896d129511c499aef15b8162df05fa299860f59Thierry Strudel * RETURN : camera handle for snapshot 7622896d129511c499aef15b8162df05fa299860f59Thierry Strudel * 7632896d129511c499aef15b8162df05fa299860f59Thierry Strudel *==========================================================================*/ 7642896d129511c499aef15b8162df05fa299860f59Thierry Strudeluint32_t QCameraChannel::getSnapshotHandle() 7652896d129511c499aef15b8162df05fa299860f59Thierry Strudel{ 7662896d129511c499aef15b8162df05fa299860f59Thierry Strudel uint32_t snapshotHandle = 0; 7672896d129511c499aef15b8162df05fa299860f59Thierry Strudel 7682896d129511c499aef15b8162df05fa299860f59Thierry Strudel if ((mActiveCameras == MM_CAMERA_DUAL_CAM) && mBundledSnapshot) { 7692896d129511c499aef15b8162df05fa299860f59Thierry Strudel snapshotHandle = m_handle; 77054dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel } else { 7712896d129511c499aef15b8162df05fa299860f59Thierry Strudel snapshotHandle = (mMasterCamera == MM_CAMERA_TYPE_MAIN) ? 7722896d129511c499aef15b8162df05fa299860f59Thierry Strudel get_main_camera_handle(m_handle) : get_aux_camera_handle(m_handle); 773cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 77454dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel 7752896d129511c499aef15b8162df05fa299860f59Thierry Strudel return snapshotHandle; 776cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel} 777cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel 778cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel/*=========================================================================== 7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraPicChannel 7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCameraPicChannel 7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_handle : camera handle 7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_ops : ptr to camera ops table 7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 7893d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraPicChannel::QCameraPicChannel(uint32_t cam_handle, 7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops) : 7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel(cam_handle, cam_ops) 7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_bAllowDynBufAlloc = true; 7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraPicChannel 7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constructor of QCameraPicChannel 8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8053d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraPicChannel::QCameraPicChannel() 8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_bAllowDynBufAlloc = true; 8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~QCameraPicChannel 8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraPicChannel 8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8193d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraPicChannel::~QCameraPicChannel() 8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : takePicture 8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: send request for queued snapshot frames 8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buf : request buf info 8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::takePicture (mm_camera_req_buf_t *buf) 8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8372896d129511c499aef15b8162df05fa299860f59Thierry Strudel uint32_t snapshotHandle = getSnapshotHandle(); 8382896d129511c499aef15b8162df05fa299860f59Thierry Strudel LOGD("mSnapshotHandle = 0x%x", snapshotHandle); 8392896d129511c499aef15b8162df05fa299860f59Thierry Strudel int32_t rc = m_camOps->request_super_buf(m_camHandle, snapshotHandle, buf); 8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : cancelPicture 8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: cancel request for queued snapshot frames 8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::cancelPicture() 8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle); 8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 8583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stopAdvancedCapture 8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop advanced capture based on advanced capture type. 8643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @type : advanced capture type. 8673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 8703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::stopAdvancedCapture(mm_camera_advanced_capture_t type) 8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = m_camOps->process_advanced_capture(m_camHandle, 8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_handle, type, 0, NULL); 8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : startAdvancedCapture 8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: start advanced capture based on advanced capture type. 8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @type : advanced capture type. 8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @config: advance capture config 8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::startAdvancedCapture(mm_camera_advanced_capture_t type, 8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_capture_frame_config_t *config) 8943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = NO_ERROR; 8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8972896d129511c499aef15b8162df05fa299860f59Thierry Strudel rc = m_camOps->process_advanced_capture(m_camHandle, getSnapshotHandle(), type, 8983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1, config); 8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 9003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel* FUNCTION : flushSuperbuffer 9043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: flush the all superbuffer frames. 9063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 9083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frame_idx : frame index of focused frame 9093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 9113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 9123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 9133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraPicChannel::flushSuperbuffer(uint32_t frame_idx) 9153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = m_camOps->flush_super_buf_queue(m_camHandle, m_handle, frame_idx); 9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 9183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraVideoChannel 9223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCameraVideoChannel 9243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 9263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_handle : camera handle 9273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_ops : ptr to camera ops table 9283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 9303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9313d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraVideoChannel::QCameraVideoChannel(uint32_t cam_handle, 9323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops) : 9333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel(cam_handle, cam_ops) 9343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraVideoChannel 9393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constructor of QCameraVideoChannel 9413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 9433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 9453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9463d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraVideoChannel::QCameraVideoChannel() 9473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~QCameraVideoChannel 9523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraVideoChannel 9543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 9563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 9583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9593d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraVideoChannel::~QCameraVideoChannel() 9603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : takePicture 9653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: send request for queued snapshot frames 9673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 9693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mm_camera_req_buf_t : request buf info 9703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 9723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 9733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 9743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraVideoChannel::takePicture(mm_camera_req_buf_t *buf) 9763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9772896d129511c499aef15b8162df05fa299860f59Thierry Strudel uint32_t snapshotHandle = getSnapshotHandle(); 9782896d129511c499aef15b8162df05fa299860f59Thierry Strudel LOGD("mSnapshotHandle = 0x%x", snapshotHandle); 9792896d129511c499aef15b8162df05fa299860f59Thierry Strudel int32_t rc = m_camOps->request_super_buf(m_camHandle, snapshotHandle, buf); 9803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 9813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 9843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : cancelPicture 9853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: cancel request for queued snapshot frames 9873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 9893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 9903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 9913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraVideoChannel::cancelPicture() 9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle); 9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : releaseFrame 10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: return video frame from app 10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @opaque : ptr to video frame to be returned 10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @isMetaData : if frame is a metadata or real frame 10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraVideoChannel::releaseFrame(const void * opaque, bool isMetaData) 10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pVideoStream = NULL; 10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 10173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams[i] != NULL && mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO)) { 10183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pVideoStream = mStreams[i]; 10193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 10203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == pVideoStream) { 10243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No video stream in the channel"); 10253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 10263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = pVideoStream->bufDone(opaque, isMetaData); 10293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 10303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 10313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 10333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraReprocessChannel 10343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: constructor of QCameraReprocessChannel 10363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 10383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_handle : camera handle 10393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @cam_ops : ptr to camera ops table 10403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 10423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 10433d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraReprocessChannel::QCameraReprocessChannel(uint32_t cam_handle, 10443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_ops_t *cam_ops) : 10453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel(cam_handle, cam_ops), 10463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_pSrcChannel(NULL), 10473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPassCount(0) 10483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 10493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles)); 10503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 10513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 10533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : QCameraReprocessChannel 10543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: default constructor of QCameraReprocessChannel 10563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 10583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 10603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 10613d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraReprocessChannel::QCameraReprocessChannel() : 10623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_pSrcChannel(NULL), 10633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPassCount(0) 10643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 10653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 10663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 10683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~QCameraReprocessChannel 10693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: destructor of QCameraReprocessChannel 10713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 10733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 10753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 10763d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraReprocessChannel::~QCameraReprocessChannel() 10773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 10783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : addReprocStreamsFromSource 10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: add reprocess streams from input source channel 10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @allocator : stream related buffer allocator 10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @featureConfig : pp feature configuration 10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pSrcChannel : ptr to input source channel that needs reprocess 10893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @minStreamBufNum: number of stream buffers needed 10903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @burstNum : number of burst captures needed 10913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @paddingInfo : padding information 10923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @param : reference to parameters 10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @contStream : continous streaming mode or burst 10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @offline : configure for offline reprocessing 10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::addReprocStreamsFromSource( 11013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraAllocator& allocator, cam_pp_feature_config_t &featureConfig, 11023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraChannel *pSrcChannel, uint8_t minStreamBufNum, uint8_t burstNum, 11033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t *paddingInfo, QCameraParametersIntf ¶m, bool contStream, 11043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool offline) 11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = 0; 11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraHeapMemory *pStreamInfoBuf = NULL; 11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraHeapMemory *pMiscBuf = NULL; 11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_info_t *streamInfo = NULL; 11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_padding_info_t padding; 11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles)); 11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == paddingInfo) { 11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel padding = *paddingInfo; 11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Use maximum padding so that the buffer 11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //can be rotated 11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel padding.width_padding = MAX(padding.width_padding, padding.height_padding); 11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel padding.height_padding = padding.width_padding; 11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel padding.offset_info.offset_x = 0; 11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel padding.offset_info.offset_y = 0; 11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGD("num of src stream = %d", pSrcChannel->getNumOfStreams()); 11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < pSrcChannel->getNumOfStreams(); i++) { 11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_pp_feature_config_t pp_featuremask = featureConfig; 11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = pSrcChannel->getStreamByIndex(i); 11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream != NULL) { 11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (param.getofflineRAW() && !((pStream->isTypeOf(CAM_STREAM_TYPE_RAW)) 11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW)) 11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) 1133c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)) 1134c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) { 11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW 11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_RAW) 11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel && (!param.getofflineRAW())) { 11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Skip raw for reprocess now because PP module cannot handle 11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // meta data&raw. May need furthur discussion if Imaginglib need meta data 11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) 1147c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel && !((param.getManualCaptureMode() >= 1148c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel CAM_MANUAL_CAPTURE_TYPE_3) || (param.getQuadraCfa()))) 11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) { 1150c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Skip metadata, if not manual capture or quadra cfa 11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 11523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 11553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 11563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) || 11573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) { 11583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_feature_mask_t feature_mask = featureConfig.feature_mask; 11593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // skip thumbnail reprocessing if not needed 11613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!param.needThumbnailReprocess(&feature_mask)) { 11623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 11633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // CAC, SHARPNESS, FLIP and WNR would have been already applied - 11653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // on preview/postview stream in realtime. 11663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // So, need not apply again. 11673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel feature_mask &= ~(CAM_QCOM_FEATURE_DENOISE2D | 11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_QCOM_FEATURE_CAC | 11693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_QCOM_FEATURE_SHARPNESS | 11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_QCOM_FEATURE_FLIP | 11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_QCOM_FEATURE_RAW_PROCESSING); 11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!feature_mask) { 11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Skip thumbnail stream reprocessing since no other 11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //reprocessing is enabled. 11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1179c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // For quadra CFA, assign metada_bypass for first pass feature mask. 1180c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // For second pass in quadra CFA mode, assign metadata_processing. 1181c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // For normal reprocess(no quadra CFA), assign metadata_processing. 1182c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (!param.getQuadraCfa()) { 1183c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 1184c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pp_featuremask.feature_mask = 0; 1185c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_PROCESSING; 1186c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 1187c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else { 1188c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 1189c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // First reprocess pass in quadra CFA mode 1190c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Skip processing of the offline metadata for first pass, 1191c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pp_featuremask.feature_mask = 0; 1192c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_BYPASS; 1193c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } else if (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)) { 1194c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Second reprocess pass in quadra CFA mode 1195c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // offline Metadata processing needed for second pass. 1196c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // offline meta data will be copied from backend. 1197c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pp_featuremask.feature_mask = 0; 1198c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_PROCESSING; 1199c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC); 12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStreamInfoBuf == NULL) { 12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("no mem for stream info buf"); 12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = NO_MEMORY; 12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo = (cam_stream_info_t *)pStreamInfoBuf->getPtr(0); 12103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(streamInfo, 0, sizeof(cam_stream_info_t)); 12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC; 12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Enable CPP high performance mode to put it in turbo frequency mode for 12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // burst/longshot/HDR snapshot cases 12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->perf_mode = CAM_PERF_HIGH_PERFORMANCE; 12159e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (param.getofflineRAW() && (pStream->isTypeOf(CAM_STREAM_TYPE_RAW) 12169e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))) { 12179e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_QUADRA_CFA) { 12189e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel param.getStreamFormat(CAM_STREAM_TYPE_OFFLINE_PROC, streamInfo->fmt); 12199e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } else { 12209e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel streamInfo->fmt = CAM_FORMAT_YUV_420_NV21; 12219e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = pStream->getFormat(streamInfo->fmt); 12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 12273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 12283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) || 12293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) { 12303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_SCALE) { 12313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.getThumbnailSize(&(streamInfo->dim.width), 12323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &(streamInfo->dim.height)); 12333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFrameDimension(streamInfo->dim); 12353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12372896d129511c499aef15b8162df05fa299860f59Thierry Strudel if ((param.isPostProcScaling() || param.isDCmAsymmetricSnapMode()) && 12383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_SCALE)) { 12393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = param.getStreamDimension(CAM_STREAM_TYPE_OFFLINE_PROC, 12403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->dim); 12413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if ((param.getofflineRAW()) && 12429e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel ((pStream->isTypeOf(CAM_STREAM_TYPE_RAW)) || 12439e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)))) { 12449e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel if ((param.getQuadraCfa()) && 12459e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_QUADRA_CFA)) { 12469e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel rc = pStream->getFrameDimension(streamInfo->dim); 12479e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } else { 12489e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel param.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,streamInfo->dim); 12499e74aae7331f3227542b3e646a0dd658d3467a31Thierry Strudel } 12503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = pStream->getFrameDimension(streamInfo->dim); 12523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( contStream ) { 12563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 12573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->num_of_burst = 0; 12583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 12603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->num_of_burst = burstNum; 12613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->num_bufs = minStreamBufNum; 1263cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel streamInfo->buf_cnt = streamInfo->num_bufs; 12643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_reproc_config_t rp_cfg; 12663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&rp_cfg, 0, sizeof(cam_stream_reproc_config_t)); 12673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (offline) { 12683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_frame_len_offset_t offset; 12693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 12703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rp_cfg.pp_type = CAM_OFFLINE_REPROCESS_TYPE; 12723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFormat(rp_cfg.offline.input_fmt); 12733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFrameDimension(rp_cfg.offline.input_dim); 12743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getFrameOffset(offset); 12753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rp_cfg.offline.input_buf_planes.plane_info = offset; 12763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rp_cfg.offline.input_type = pStream->getMyOriginalType(); 12773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //For input metadata + input buffer 12783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rp_cfg.offline.num_of_bufs = 2; 12793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 12803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rp_cfg.pp_type = CAM_ONLINE_REPROCESS_TYPE; 12813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rp_cfg.online.input_stream_id = pStream->getMyServerID(); 12823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rp_cfg.online.input_stream_type = pStream->getMyOriginalType(); 12833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.getStreamRotation(streamInfo->stream_type, 12853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->pp_config, streamInfo->dim); 12863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config = rp_cfg; 12873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config = pp_featuremask; 12883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!(pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) 12903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) 12913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || pStream->isTypeOf(CAM_STREAM_TYPE_RAW) 12923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))) { 12933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // CAC, SHARPNESS, FLIP and WNR would have been already applied - 12943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // on preview/postview stream in realtime. Need not apply again. 12953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask &= 12963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~CAM_QCOM_FEATURE_CAC; 12973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask &= 12983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~CAM_QCOM_FEATURE_SHARPNESS; 12993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask &= 13003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~CAM_QCOM_FEATURE_FLIP; 13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Don't do WNR for thumbnail 13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask &= 13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~CAM_QCOM_FEATURE_DENOISE2D; 13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask &= 13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~CAM_QCOM_FEATURE_CDS; 13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask &= 13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~CAM_QCOM_FEATURE_DSDN; 13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //No need of RAW processing for other than RAW streams 13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask &= 13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ~CAM_QCOM_FEATURE_RAW_PROCESSING; 13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (param.isHDREnabled() 13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel && !param.isHDRThumbnailProcessNeeded()){ 13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask 13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &= ~CAM_QCOM_FEATURE_HDR; 13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_type_t type = CAM_STREAM_TYPE_DEFAULT; 13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (offline) { 13213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel type = streamInfo->reprocess_config.offline.input_type; 13223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 13233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel type = streamInfo->reprocess_config.online.input_stream_type; 13243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (type == CAM_STREAM_TYPE_SNAPSHOT) { 13263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int flipMode = param.getFlipMode(type); 13273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (flipMode > 0) { 13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.feature_mask |= 13293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_QCOM_FEATURE_FLIP; 13303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.flip = (uint32_t)flipMode; 13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((streamInfo->reprocess_config.pp_feature_config.feature_mask 13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel & CAM_QCOM_FEATURE_SCALE) 13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel && param.isReprocScaleEnabled() 13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel && param.isUnderReprocScaling()) { 13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //we only Scale Snapshot frame 13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->dim.width = 13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.scale_param.output_width; 13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->dim.height = 13433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->reprocess_config.pp_feature_config.scale_param.output_height; 13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGH("stream width=%d, height=%d.", 13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel streamInfo->dim.width, streamInfo->dim.height); 13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // save source stream handler 1350cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (mDualChannel) { 1351cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mSrcStreamHandles[mStreams.size()] = pStream->getMyHandle(); 1352cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } else if (get_main_camera_handle(pStream->getMyHandle())) { 1353cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mSrcStreamHandles[mStreams.size()] = 1354cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel get_main_camera_handle(pStream->getMyHandle()); 1355cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } else if (get_aux_camera_handle(pStream->getMyHandle())) { 1356cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mSrcStreamHandles[mStreams.size()] = 1357cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel get_aux_camera_handle(pStream->getMyHandle()); 1358cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } else { 1359cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel LOGE("Invalid Handle. "); 1360cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel rc = BAD_VALUE; 1361cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel break; 1362cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } 13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1364cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel mSrcStreamHandles[mStreams.size()] = pStream->getMyHandle(); 13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pMiscBuf = allocator.allocateMiscBuf(streamInfo); 13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13672896d129511c499aef15b8162df05fa299860f59Thierry Strudel if (offline) { 13682896d129511c499aef15b8162df05fa299860f59Thierry Strudel LOGH("Configure Reprocessing Input stream = %d Input: res = %dX%d," 13692896d129511c499aef15b8162df05fa299860f59Thierry Strudel "fmt = %d, buf_cnt = %d", 13702896d129511c499aef15b8162df05fa299860f59Thierry Strudel streamInfo->reprocess_config.offline.input_type, 13712896d129511c499aef15b8162df05fa299860f59Thierry Strudel rp_cfg.offline.input_dim.width, 13722896d129511c499aef15b8162df05fa299860f59Thierry Strudel rp_cfg.offline.input_dim.height, 13732896d129511c499aef15b8162df05fa299860f59Thierry Strudel rp_cfg.offline.input_fmt, rp_cfg.offline.num_of_bufs); 13742896d129511c499aef15b8162df05fa299860f59Thierry Strudel } 13752896d129511c499aef15b8162df05fa299860f59Thierry Strudel 13762896d129511c499aef15b8162df05fa299860f59Thierry Strudel LOGH("Configure Reprocessing Output: stream = %d, res = %dX%d, fmt = %d," 1377cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel "type = %d buf_cnt = %d", 13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream->getMyOriginalType(), streamInfo->dim.width, 1379cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel streamInfo->dim.height, streamInfo->fmt, type, minStreamBufNum); 13803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // add reprocess stream 13823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (streamInfo->reprocess_config.pp_feature_config.feature_mask 13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel & CAM_QCOM_FEATURE_ROTATION) { 13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = addStream(allocator, pStreamInfoBuf, pMiscBuf, 1385cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel &padding, NULL, NULL, false, false, 13862896d129511c499aef15b8162df05fa299860f59Thierry Strudel streamInfo->reprocess_config.pp_feature_config.rotation, 13872896d129511c499aef15b8162df05fa299860f59Thierry Strudel pStream->getMyCamType()); 13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = addStream(allocator, pStreamInfoBuf, pMiscBuf, 13902896d129511c499aef15b8162df05fa299860f59Thierry Strudel &padding, NULL, NULL, false, false, ROTATE_0, 13912896d129511c499aef15b8162df05fa299860f59Thierry Strudel pStream->getMyCamType()); 13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("add reprocess stream failed, ret = %d", rc); 13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc == NO_ERROR) { 14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_pSrcChannel = pSrcChannel; 14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getStreamBySrouceHandle 14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: find reprocess stream by its source stream handle 14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @srcHandle : source stream handle 14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : ptr to reprocess stream if found. NULL if not found 14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14163d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraStream * QCameraReprocessChannel::getStreamBySrouceHandle(uint32_t srcHandle) 14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 1421cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if (validate_handle(mSrcStreamHandles[i], srcHandle)) { 14223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = mStreams[i]; 14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return pStream; 14283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 14313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stop 14323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stop channel and unmap offline buffers 14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::stop() 14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = QCameraChannel::stop(); 14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mOfflineBuffers.empty()) { 14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *stream = NULL; 14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel List<OfflineBuffer>::iterator it = mOfflineBuffers.begin(); 14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int error = NO_ERROR; 14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for( ; it != mOfflineBuffers.end(); it++) { 14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stream = (*it).stream; 14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != stream) { 14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel error = stream->unmapBuf((*it).type, 14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (*it).index, 14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel -1); 14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != error) { 14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error during offline buffer unmap %d", 14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel error); 14583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mOfflineBuffers.clear(); 14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 14643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 14653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : doReprocessOffline 14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do offline reprocess on the frame 14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 14723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frame : frame to be performed a reprocess 14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @meta_buf : Metadata buffer for reprocessing 14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pStream : Actual reprocess stream 14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 14783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_buf_def_t *frame, 14813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *meta_buf, QCameraStream *pStream) 14823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 14833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = 0; 14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel OfflineBuffer mappedBuffer; 14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t buf_index = 0; 14863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t meta_buf_index = 0; 14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((frame == NULL) || (meta_buf == NULL)) { 14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid Input Paramters"); 14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return INVALID_OPERATION; 14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream == NULL) { 14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = getStreamBySrouceHandle(frame->stream_id); 14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pStream == NULL) { 14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Input validation failed."); 14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return INVALID_OPERATION; 14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mOfflineBuffers.empty()) { 15023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel List<OfflineBuffer>::iterator it = mOfflineBuffers.begin(); 15033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for( ; it != mOfflineBuffers.end(); it++) { 15043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_index = (buf_index < ((*it).index)) ? ((*it).index) : buf_index; 15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_index += 1; 15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel meta_buf_index = buf_index; 15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (meta_buf != NULL) { 15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF, 15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel meta_buf_index, 15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel -1, 15143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel meta_buf->fd, 15153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel meta_buf->buffer, 15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel meta_buf->frame_len); 15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != rc ) { 15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error during metadata buffer mapping"); 15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = -1; 15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mappedBuffer.index = meta_buf_index; 15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mappedBuffer.stream = pStream; 15253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF; 15263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mOfflineBuffers.push_back(mappedBuffer); 15273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_index += 1; 15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_index, 15323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel -1, 15333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->fd, 15343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->buffer, 15353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel frame->frame_len); 15363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != rc ) { 15373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error during reprocess input buffer mapping"); 15383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = -1; 15393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 15403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mappedBuffer.index = buf_index; 15423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mappedBuffer.stream = pStream; 15433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF; 15443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mOfflineBuffers.push_back(mappedBuffer); 15453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_parm_buffer_t param; 15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.buf_index = buf_index; 15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.frame_idx = frame->frame_idx; 155254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel param.reprocess.is_uv_subsampled = frame->is_uv_subsampled; 1553c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel cam_stream_info_t *streamInfo = 1554c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel reinterpret_cast<cam_stream_info_t *>(pStream->getStreamInfoBuf()->getPtr(0)); 1555c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel 1556c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)) && streamInfo && 1557c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel (streamInfo->reprocess_config.pp_feature_config.feature_mask & 1558c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel CAM_QCOM_FEATURE_METADATA_BYPASS)) { 1559c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel LOGH("set meta bypass for quadra cfa first pass"); 1560c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Backend will skip processing of metadata for first pass 1561c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel param.reprocess.is_offline_meta_bypass = 1; 1562c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel } 15633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (meta_buf != NULL) { 15643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_present = 1; 15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_buf_index = meta_buf_index; 15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Offline reprocessing id = %d buf Id = %d meta index = %d type = %d", 15693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.frame_idx, param.reprocess.buf_index, 15703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_buf_index, pStream->getMyOriginalType()); 15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = pStream->setParameter(param); 15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("stream setParameter for reprocess failed"); 15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 15793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : doReprocessOffline 15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do offline reprocess on the frame 15843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frame : frame to be performed a reprocess 15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @meta_buf : Metadata buffer for reprocessing 15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mParameter : camera parameters 15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 15913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 15923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 15933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 15943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_super_buf_t *frame, 15953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mm_camera_buf_def_t *meta_buf, QCameraParametersIntf &mParameter) 15963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 15973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = 0; 15983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = NULL; 15993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams.size() < 1) { 16013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No reprocess streams"); 16023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -1; 16033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (m_pSrcChannel == NULL) { 16053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No source channel for reprocess"); 16063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -1; 16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (frame == NULL) { 16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Invalid source frame"); 16113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 16123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 16153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id); 16163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pStream != NULL) && 1617cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle,pStream->getChannelHandle()))) { 16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mParameter.getofflineRAW() && 16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)) 16203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) { 16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 16223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA) 1625c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel && ((mParameter.getManualCaptureMode() 1626c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel < CAM_MANUAL_CAPTURE_TYPE_3) && (!mParameter.getQuadraCfa()))) 16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) { 16283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Skip metadata for reprocess now because PP module cannot handle meta data 16293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // May need furthur discussion if Imaginglib need meta data 1630c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Do not skip metadata for manual capture or quadra CFA mode. 16313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 16323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Update Metadata 16353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (meta_buf != NULL) { 16363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t stream_id = frame->bufs[i]->stream_id; 16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *srcStream = 16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_pSrcChannel->getStreamByHandle(stream_id); 16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel metadata_buffer_t *pMetaData = 16403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (metadata_buffer_t *)meta_buf->buffer; 16413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((NULL != pMetaData) && (NULL != srcStream)) { 16423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel IF_META_AVAILABLE(cam_crop_data_t, crop, 16433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAM_INTF_META_CROP_DATA, pMetaData) { 16443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (MAX_NUM_STREAMS > crop->num_of_streams) { 16453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (int j = 0; j < MAX_NUM_STREAMS; j++) { 16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (crop->crop_info[j].stream_id == 16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcStream->getMyServerID()) { 16483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Store crop/roi information for offline reprocess 16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // in the reprocess stream slot 16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop->crop_info[crop->num_of_streams].crop = 16513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop->crop_info[j].crop; 16523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop->crop_info[crop->num_of_streams].roi_map = 16533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop->crop_info[j].roi_map; 16543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint8_t k = 0; k < mStreams.size(); k++) { 16553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (srcStream->getMyType() == 16563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[k]->getMyOriginalType()) { 16573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop->crop_info[crop->num_of_streams].stream_id = 16583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[k]->getMyServerID(); 16593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel crop->num_of_streams++; 16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No space to add reprocess stream crop/roi information"); 16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1671cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel } else { 1672cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel LOGE("Metadata NULL"); 16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1675295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel if (mParameter.getofflineRAW()) { 1676295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel //For offline RAW reprocessing, make sure cache is clean & invalidated 1677295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel frame->bufs[i]->cache_flags |= CPU_HAS_READ_WRITTEN; 1678295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel } 1679295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel //Do Cache ops before sending to reprocess 1680295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel if (frame->bufs[i] != NULL) { 1681295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel pStream->handleCacheOps(frame->bufs[i]); 1682295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel } 16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = doReprocessOffline (frame->bufs[i], meta_buf, pStream); 16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : doReprocess 16913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do a reprocess on the frame 16933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @frame : frame to be performed a reprocess 16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mParameter : camera parameters 16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pMetaStream: Metadata stream handle 16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @meta_buf_index : Metadata buffer index 16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocess(mm_camera_super_buf_t *frame, 17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraParametersIntf &mParameter, QCameraStream *pMetaStream, 17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t meta_buf_index) 17073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = 0; 17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams.size() < 1) { 17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No reprocess streams"); 17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -1; 17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (m_pSrcChannel == NULL) { 17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No source channel for reprocess"); 17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -1; 17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaStream == NULL) { 17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGW("Null Metadata buffer for processing"); 17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (uint32_t i = 0; i < frame->num_bufs; i++) { 17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel QCameraStream *pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id); 1724cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel if ((pStream != NULL) && 1725cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, pStream->getChannelHandle()))) { 17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mParameter.getofflineRAW() && !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)) 17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) 17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) { 17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW 17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA) 1733c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel && ((mParameter.getManualCaptureMode() 1734c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel < CAM_MANUAL_CAPTURE_TYPE_3) && (!mParameter.getQuadraCfa()))) 17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) { 17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Skip metadata for reprocess now because PP module cannot handle meta data 17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // May need furthur discussion if Imaginglib need meta data 1738c2ee3304e16253ceab19f9be91c5da84233940f3Thierry Strudel // Do not skip metadata for manual capture or quadra CFA mode. 17393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1742295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel //Do Cache ops before sending to reprocess 1743295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel if (frame->bufs[i] != NULL) { 1744295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel pStream->handleCacheOps(frame->bufs[i]); 1745295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel } 1746295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel 17473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_parm_buffer_t param; 17483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.buf_index = frame->bufs[i]->buf_idx; 17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.frame_idx = frame->bufs[i]->frame_idx; 175254dc9783295b20e33ec11e132d98a1b8efbf254cThierry Strudel param.reprocess.is_uv_subsampled = frame->bufs[i]->is_uv_subsampled; 17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pMetaStream != NULL) { 17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // we have meta data frame bundled, sent together with reprocess frame 17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_present = 1; 17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_stream_handle = pMetaStream->getMyServerID(); 17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_buf_index = meta_buf_index; 17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGI("Online reprocessing id = %d buf Id = %d meta index = %d type = %d", 17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.frame_idx, param.reprocess.buf_index, 17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.meta_buf_index, pStream->getMyOriginalType()); 17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = pStream->setParameter(param); 17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc != NO_ERROR) { 17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("stream setParameter for reprocess failed"); 17673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 17683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 17723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 17733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : doReprocess 17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: request to do a reprocess on the frame 17783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 17803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buf_fd : fd to the input buffer that needs reprocess 17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buffer : buffer pointer of actual buffer 17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buf_lenght : length of the input buffer 17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @ret_val : result of reprocess. 17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Example: Could be faceID in case of register face image. 17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int32_t type of status 17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraReprocessChannel::doReprocess(int buf_fd, void *buffer, 17913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t buf_length, int32_t &ret_val) 17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t rc = 0; 17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mStreams.size() < 1) { 17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("No reprocess streams"); 17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -1; 17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t buf_idx = 0; 18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mStreams.size(); i++) { 18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mStreams[i] != NULL) && 1802cca4d9c3be40fe18502f3237f7993b41175ef3a7Thierry Strudel (validate_handle(m_handle, mStreams[i]->getChannelHandle()))) { 18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel continue; 18043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_idx, -1, 18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_fd, buffer, buf_length); 18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc == NO_ERROR) { 18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cam_stream_parm_buffer_t param; 18113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 18123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel param.reprocess.buf_index = buf_idx; 18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rc = mStreams[i]->setParameter(param); 18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rc == NO_ERROR) { 18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret_val = param.reprocess.ret_val; 18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buf_idx, -1); 18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return rc; 18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace qcamera 1826