166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QCameraChannel" 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h> 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2HWI.h" 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" { 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinusing namespace android; 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera { 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraChannel 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constrcutor of QCameraChannel 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_handle : camera handle 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_ops : ptr to camera ops table 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraChannel::QCameraChannel(uint32_t cam_handle, 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_ops_t *cam_ops) 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_camHandle = cam_handle; 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_camOps = cam_ops; 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIsActive = false; 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bAllowDynBufAlloc = false; 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_handle = 0; 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraChannel 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constrcutor of QCameraChannel 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraChannel::QCameraChannel() 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_camHandle = 0; 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_camOps = NULL; 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIsActive = false; 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_handle = 0; 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraChannel 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraChannel 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraChannel::~QCameraChannel() 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bIsActive) { 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stop(); 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[i] != NULL) { 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_handle == mStreams[i]->getChannelHandle()) { 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete mStreams[i]; 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams.clear(); 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_camOps->delete_channel(m_camHandle, m_handle); 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_handle = 0; 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : deleteChannel 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deletes a camera channel 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraChannel::deleteChannel() 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_bIsActive) { 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stop(); 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && (m_handle == mStreams[i]->getChannelHandle())) { 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->deleteStream(); 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_camOps->delete_channel(m_camHandle, m_handle); 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : setStreamSyncCB 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: reg callback function to stream of stream type 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_type : Stream type for which callback needs to be registered. 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_cb : Callback function 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * non-zero failure code 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::setStreamSyncCB (cam_stream_type_t stream_type, 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb_routine stream_cb) 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = UNKNOWN_ERROR; 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && (stream_type == mStreams[i]->getMyType())) { 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[i]->setSyncDataCB(stream_cb); 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : init 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: initialization of channel 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @attr : channel bundle attribute setting 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @dataCB : data notify callback 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userData: user data ptr 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::init(mm_camera_channel_attr_t *attr, 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_notify_t dataCB, 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void *userData) 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_handle = m_camOps->add_channel(m_camHandle, 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin attr, 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin dataCB, 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin userData); 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_handle == 0) { 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Add channel failed"); 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return UNKNOWN_ERROR; 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_ERROR; 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addStream 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add a stream into channel 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @allocator : stream related buffer allocator 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamInfoBuf : ptr to buf that contains stream info 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @miscBuf : ptr to buf that contains misc buffers 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @minStreamBufNum: number of stream buffers needed 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @paddingInfo : padding information 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_cb : stream data notify callback 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @userdata : user data ptr 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @bDynAllocBuf : flag indicating if allow allocate buffers in 2 steps 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @online_rotation: rotation applied online 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::addStream(QCameraAllocator &allocator, 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *streamInfoBuf, QCameraHeapMemory *miscBuf, 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t minStreamBufNum, cam_padding_info_t *paddingInfo, 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb_routine stream_cb, void *userdata, bool bDynAllocBuf, 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool bDeffAlloc, cam_rotation_t online_rotation) 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams.size() >= MAX_STREAM_NUM_IN_BUNDLE) { 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("stream number (%zu) exceeds max limit (%d)", 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams.size(), MAX_STREAM_NUM_IN_BUNDLE); 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfoBuf != NULL) { 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->deallocate(); 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete streamInfoBuf; 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf = NULL; 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = new QCameraStream(allocator, 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_camHandle, m_handle, m_camOps, paddingInfo, bDeffAlloc, 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin online_rotation); 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream == NULL) { 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No mem for Stream"); 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfoBuf != NULL) { 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf->deallocate(); 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete streamInfoBuf; 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfoBuf = NULL; 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_MEMORY; 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->init(streamInfoBuf, miscBuf, minStreamBufNum, 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream_cb, userdata, bDynAllocBuf); 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == 0) { 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams.add(pStream); 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin delete pStream; 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : linkStream 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: link a stream into channel 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ch : Channel which the stream belongs to 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream : Stream which needs to be linked 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::linkStream(QCameraChannel *ch, QCameraStream *stream) 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((0 == m_handle) || (NULL == ch) || (NULL == stream)) { 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t handle = m_camOps->link_stream(m_camHandle, 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ch->getMyHandle(), 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream->getMyHandle(), 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_handle); 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (0 == handle) { 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Linking of stream failed"); 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = INVALID_OPERATION; 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams.add(stream); 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : start 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start channel, which will start all streams belong to this channel 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::start() 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams.size() > 1) { 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // there is more than one stream in the channel 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we need to notify mctl that all streams in this channel need to be bundled 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_bundle_config_t bundleInfo; 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&bundleInfo, 0, sizeof(bundleInfo)); 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_camOps->get_bundle_info(m_camHandle, m_handle, &bundleInfo); 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("get_bundle_info failed"); 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bundleInfo.num_of_streams > 1) { 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int i = 0; i < bundleInfo.num_of_streams; i++) { 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = getStreamByServerID(bundleInfo.stream_ids[i]); 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_OFFLINE_PROC))) { 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Skip metadata for reprocess now because PP module cannot handle meta data 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // May need furthur discussion if Imaginglib need meta data 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param; 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.type = CAM_STREAM_PARAM_TYPE_SET_BUNDLE_INFO; 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.bundleInfo = bundleInfo; 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->setParameter(param); 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("stream setParameter for set bundle failed"); 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle == mStreams[i]->getChannelHandle())) { 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->start(); 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_camOps->start_channel(m_camHandle, m_handle); 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle == mStreams[i]->getChannelHandle())) { 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->stop(); 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIsActive = true; 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[i] != NULL) { 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->cond_signal(); 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stop 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop a channel, which will stop all streams belong to this channel 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::stop() 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 375d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch size_t i = 0; 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!m_bIsActive) { 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NO_INIT; 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 381d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch while(i < mStreams.size()) { 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[i] != NULL) { 383d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch if (m_handle == mStreams[i]->getChannelHandle()) { 384d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mStreams[i]->stop(); 385d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch i++; 386d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } else { 387d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch // Remove linked stream from stream list 388d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch mStreams.removeAt(i); 389d59d4ae1e81b3b4f85c59b75636580830b3f0833Steve Pfetsch } 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_camOps->stop_channel(m_camHandle, m_handle); 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bIsActive = false; 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : bufDone 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return a stream buf back to kernel 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : stream buf frame to be returned 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame) 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < recvd_frame->num_bufs; i++) { 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (recvd_frame->bufs[i] != NULL) { 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t j = 0; j < mStreams.size(); j++) { 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[j] != NULL && 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[j]->getMyHandle() == recvd_frame->bufs[i]->stream_id) { 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx); 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; // break loop j 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : bufDone 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return specified buffer from super buffer to kernel 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @recvd_frame : stream buf frame to be returned 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @stream_id : stream ID of the buffer to be released 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame, uint32_t stream_id) 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t index; 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int32_t i = 0; i < (int32_t)recvd_frame->num_bufs; i++) { 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index = -1; 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((recvd_frame->bufs[i] != NULL) && 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (recvd_frame->bufs[i]->stream_id == stream_id)) { 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t j = 0; j < mStreams.size(); j++) { 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[j] != NULL) && 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mStreams[j]->getMyHandle() == stream_id)) { 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx); 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin index = i; 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; // break loop j 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((index >= 0) && (index < (int32_t)recvd_frame->num_bufs)) { 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int32_t j = index; j < (int32_t)(recvd_frame->num_bufs - 1); j++) { 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->bufs[j] = recvd_frame->bufs[j + 1]; 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin recvd_frame->num_bufs--; 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin i--; 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : processZoomDone 47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: process zoom done event 47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @previewWindoe : ptr to preview window ops table, needed to set preview 47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * crop information 47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @crop_info : crop info as a result of zoom operation 48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::processZoomDone(preview_stream_ops_t *previewWindow, 48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_crop_data_t &crop_info) 48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && 49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle == mStreams[i]->getChannelHandle())) { 49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[i]->processZoomDone(previewWindow, crop_info); 49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getStreamByHandle 50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by stream handle 50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @streamHandle : stream handle 50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : stream object. NULL if not found 50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 50866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream *QCameraChannel::getStreamByHandle(uint32_t streamHandle) 50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[i] != NULL && mStreams[i]->getMyHandle() == streamHandle) { 51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mStreams[i]; 51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getStreamByServerID 52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by stream server ID from daemon 52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @serverID : stream server ID 52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : stream object. NULL if not found 52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 52866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream *QCameraChannel::getStreamByServerID(uint32_t serverID) 52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[i] != NULL && mStreams[i]->getMyServerID() == serverID) { 53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mStreams[i]; 53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getStreamByIndex 54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return stream object by index of streams in the channel 54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @index : index of stream in the channel 54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : stream object. NULL if not found 54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 54866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream *QCameraChannel::getStreamByIndex(uint32_t index) 54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (index >= MAX_STREAM_NUM_IN_BUNDLE) { 55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (index < mStreams.size()) { 55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return mStreams[index]; 55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : UpdateStreamBasedParameters 56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: update any stream based settings from parameters 56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @param : reference to parameters object 56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraChannel::UpdateStreamBasedParameters(QCameraParametersIntf ¶m) 57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.isPreviewFlipChanged()) { 57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // try to find preview stream 57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && 57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle == mStreams[i]->getChannelHandle()) && 58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW))) ) { 58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param_buf; 58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m_buf, 0, sizeof(cam_stream_parm_buffer_t)); 58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP; 58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param_buf.flipInfo.flip_mask = 58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_PREVIEW); 58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[i]->setParameter(param_buf); 58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("set preview stream flip failed"); 59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.isVideoFlipChanged()) { 59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // try to find video stream 59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && 59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle == mStreams[i]->getChannelHandle()) && 59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO) || 60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_VIDEO))) ) { 60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param_buf; 60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m_buf, 0, sizeof(cam_stream_parm_buffer_t)); 60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP; 60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param_buf.flipInfo.flip_mask = 60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_VIDEO); 60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[i]->setParameter(param_buf); 60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("set video stream flip failed"); 60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 61366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.isSnapshotFlipChanged()) { 61466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // try to find snapshot/postview stream 61566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 61666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[i] != NULL && 61766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle == mStreams[i]->getChannelHandle()) && 61866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (mStreams[i]->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 61966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 62066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 62166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW) ) ) { 62266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param_buf; 62366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m_buf, 0, sizeof(cam_stream_parm_buffer_t)); 62466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param_buf.type = CAM_STREAM_PARAM_TYPE_SET_FLIP; 62566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param_buf.flipInfo.flip_mask = 62666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (uint32_t)param.getFlipMode(CAM_STREAM_TYPE_SNAPSHOT); 62766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[i]->setParameter(param_buf); 62866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 62966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("set snapshot stream flip failed"); 63066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 63166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 63266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 63366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 63466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 63566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 63666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 63766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 63866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraPicChannel 63966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 64066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraPicChannel 64166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 64266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 64366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_handle : camera handle 64466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_ops : ptr to camera ops table 64566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 64666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 64766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 64866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPicChannel::QCameraPicChannel(uint32_t cam_handle, 64966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_ops_t *cam_ops) : 65066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel(cam_handle, cam_ops) 65166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 65266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bAllowDynBufAlloc = true; 65366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 65466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 65566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 65666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraPicChannel 65766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 65866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCameraPicChannel 65966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 66066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 66166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 66266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 66366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 66466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPicChannel::QCameraPicChannel() 66566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 66666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_bAllowDynBufAlloc = true; 66766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 66866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 66966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 67066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraPicChannel 67166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 67266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraPicChannel 67366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 67466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 67566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 67666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 67766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 67866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraPicChannel::~QCameraPicChannel() 67966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 68066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 68166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 68266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 68366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : takePicture 68466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send request for queued snapshot frames 68666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 68766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 68866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buf : request buf info 68966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 69066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 69166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 69266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 69366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 69466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::takePicture (mm_camera_req_buf_t *buf) 69566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 69666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_camOps->request_super_buf(m_camHandle, m_handle, buf); 69766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 69866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 69966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 70066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 70166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cancelPicture 70266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 70366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel request for queued snapshot frames 70466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 70566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 70666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 70766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 70866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 70966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 71066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 71166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::cancelPicture() 71266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 71366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle); 71466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 71566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 71666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 71766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 71866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stopAdvancedCapture 71966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 72066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop advanced capture based on advanced capture type. 72166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 72266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 72366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @type : advanced capture type. 72466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 72566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 72666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 72766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 72866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 72966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::stopAdvancedCapture(mm_camera_advanced_capture_t type) 73066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 73166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_camOps->process_advanced_capture(m_camHandle, 73266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_handle, type, 0, NULL); 73366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 73466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 73566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 73666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 73766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : startAdvancedCapture 73866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 73966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: start advanced capture based on advanced capture type. 74066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 74166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 74266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @type : advanced capture type. 74366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @config: advance capture config 74466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 74566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 74666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 74766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 74866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 74966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::startAdvancedCapture(mm_camera_advanced_capture_t type, 75066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_capture_frame_config_t *config) 75166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 75266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = NO_ERROR; 75366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 75466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = m_camOps->process_advanced_capture(m_camHandle, m_handle, type, 75566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 1, config); 75666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 75766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 75866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 75966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 76066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* FUNCTION : flushSuperbuffer 76166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 76266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush the all superbuffer frames. 76366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 76466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 76566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame_idx : frame index of focused frame 76666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 76766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 76866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 76966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 77066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 77166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraPicChannel::flushSuperbuffer(uint32_t frame_idx) 77266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 77366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_camOps->flush_super_buf_queue(m_camHandle, m_handle, frame_idx); 77466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 77566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 77666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 77766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 77866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraVideoChannel 77966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraVideoChannel 78166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 78366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_handle : camera handle 78466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_ops : ptr to camera ops table 78566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 78666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 78766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 78866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraVideoChannel::QCameraVideoChannel(uint32_t cam_handle, 78966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_ops_t *cam_ops) : 79066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel(cam_handle, cam_ops) 79166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 79266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 79366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 79466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 79566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraVideoChannel 79666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 79766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCameraVideoChannel 79866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 79966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 80066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 80166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 80266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 80366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraVideoChannel::QCameraVideoChannel() 80466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 80566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 80666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 80766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 80866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraVideoChannel 80966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 81066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraVideoChannel 81166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 81266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 81366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 81466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 81566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 81666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraVideoChannel::~QCameraVideoChannel() 81766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 81866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 81966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 82066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 82166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : takePicture 82266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 82366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: send request for queued snapshot frames 82466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 82566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 82666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mm_camera_req_buf_t : request buf info 82766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 82866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 82966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 83066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 83166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 83266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraVideoChannel::takePicture(mm_camera_req_buf_t *buf) 83366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 83466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_camOps->request_super_buf(m_camHandle, m_handle, buf); 83566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 83666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 83766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 83866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 83966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : cancelPicture 84066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 84166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: cancel request for queued snapshot frames 84266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 84366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 84466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 84566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 84666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 84766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 84866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 84966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraVideoChannel::cancelPicture() 85066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 85166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle); 85266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 85366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 85466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 85566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 85666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : releaseFrame 85766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 85866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return video frame from app 85966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 86066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 86166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @opaque : ptr to video frame to be returned 86266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @isMetaData : if frame is a metadata or real frame 86366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 86466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 86566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 86666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 86766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 86866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraVideoChannel::releaseFrame(const void * opaque, bool isMetaData) 86966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 87066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pVideoStream = NULL; 87166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 87266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams[i] != NULL && mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO)) { 87366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pVideoStream = mStreams[i]; 87466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 87566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 87666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 87766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 87866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == pVideoStream) { 87966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No video stream in the channel"); 88066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 88166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 88266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 88366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = pVideoStream->bufDone(opaque, isMetaData); 88466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 88566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 88666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 88766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 88866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraReprocessChannel 88966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 89066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraReprocessChannel 89166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 89266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 89366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_handle : camera handle 89466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @cam_ops : ptr to camera ops table 89566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pp_mask : post-proccess feature mask 89666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 89766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 89866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 89966f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel::QCameraReprocessChannel(uint32_t cam_handle, 90066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_ops_t *cam_ops) : 90166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel(cam_handle, cam_ops), 90266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pSrcChannel(NULL), 90366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPassCount(0) 90466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 90566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles)); 90666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 90766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 90866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 90966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraReprocessChannel 91066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 91166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCameraReprocessChannel 91266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 91366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 91466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 91566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 91666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 91766f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel::QCameraReprocessChannel() : 91866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pSrcChannel(NULL), 91966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mPassCount(0) 92066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 92166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 92266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 92366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 92466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraReprocessChannel 92566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 92666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: destructor of QCameraReprocessChannel 92766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 92866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 92966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 93066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : none 93166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 93266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraReprocessChannel::~QCameraReprocessChannel() 93366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 93466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 93566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 93666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 93766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : addReprocStreamsFromSource 93866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 93966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: add reprocess streams from input source channel 94066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 94166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 94266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @allocator : stream related buffer allocator 94366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @featureConfig : pp feature configuration 94466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pSrcChannel : ptr to input source channel that needs reprocess 94566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @minStreamBufNum: number of stream buffers needed 94666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @burstNum : number of burst captures needed 94766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @paddingInfo : padding information 94866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @param : reference to parameters 94966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @contStream : continous streaming mode or burst 95066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @offline : configure for offline reprocessing 95166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 95266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 95366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 95466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 95566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 95666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::addReprocStreamsFromSource( 95766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraAllocator& allocator, cam_pp_feature_config_t &featureConfig, 95866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraChannel *pSrcChannel, uint8_t minStreamBufNum, uint8_t burstNum, 95966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_padding_info_t *paddingInfo, QCameraParametersIntf ¶m, bool contStream, 96066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool offline) 96166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 96266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 96366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 96466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *pStreamInfoBuf = NULL; 96566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraHeapMemory *pMiscBuf = NULL; 96666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_info_t *streamInfo = NULL; 96766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_padding_info_t padding; 96866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 96966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles)); 97066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == paddingInfo) { 97166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 97266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 97366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding = *paddingInfo; 97466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Use maximum padding so that the buffer 97566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //can be rotated 97666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding.width_padding = MAX(padding.width_padding, padding.height_padding); 97766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding.height_padding = padding.width_padding; 97866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding.offset_info.offset_x = 0; 97966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin padding.offset_info.offset_y = 0; 98066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 98166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGD("num of src stream = %d", pSrcChannel->getNumOfStreams()); 98266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 98366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < pSrcChannel->getNumOfStreams(); i++) { 98466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_pp_feature_config_t pp_featuremask = featureConfig; 98566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = pSrcChannel->getStreamByIndex(i); 98666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream != NULL) { 98766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.getofflineRAW() && !((pStream->isTypeOf(CAM_STREAM_TYPE_RAW)) 98866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW)) 98966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) 99066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)))) { 99166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW 99266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 99366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 99466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 99566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_RAW) 99666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (!param.getofflineRAW())) { 99766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Skip raw for reprocess now because PP module cannot handle 99866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // meta data&raw. May need furthur discussion if Imaginglib need meta data 99966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 100066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 100266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (((pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) 100366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !(param.getManualCaptureMode() >= 100466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_MANUAL_CAPTURE_TYPE_3)) 100566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) { 100666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Skip metadata 100766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 100866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 100966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 101066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW) || 101166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 101266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_PREVIEW) || 101366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) { 101466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t feature_mask = featureConfig.feature_mask; 101566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 101666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // skip thumbnail reprocessing if not needed 101766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!param.needThumbnailReprocess(&feature_mask)) { 101866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 101966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 102066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // CAC, SHARPNESS, FLIP and WNR would have been already applied - 102166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // on preview/postview stream in realtime. 102266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // So, need not apply again. 102366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin feature_mask &= ~(CAM_QCOM_FEATURE_DENOISE2D | 102466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_CAC | 102566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_SHARPNESS | 102666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_FLIP | 102766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_RAW_PROCESSING); 102866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!feature_mask) { 102966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Skip thumbnail stream reprocessing since no other 103066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //reprocessing is enabled. 103166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 103266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 103566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 103666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_featuremask.feature_mask = 0; 103766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pp_featuremask.feature_mask |= CAM_QCOM_FEATURE_METADATA_PROCESSING; 103866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 103966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 104066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC); 104166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStreamInfoBuf == NULL) { 104266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("no mem for stream info buf"); 104366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = NO_MEMORY; 104466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 104566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 104666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 104766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo = (cam_stream_info_t *)pStreamInfoBuf->getPtr(0); 104866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(streamInfo, 0, sizeof(cam_stream_info_t)); 104966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC; 105066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Enable CPP high performance mode to put it in turbo frequency mode for 105166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // burst/longshot/HDR snapshot cases 105266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->perf_mode = CAM_PERF_HIGH_PERFORMANCE; 105366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.getofflineRAW() && pStream->isTypeOf(CAM_STREAM_TYPE_RAW)) { 105466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->fmt = CAM_FORMAT_YUV_420_NV21; 105566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 105666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->getFormat(streamInfo->fmt); 105766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 105866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 105966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_POSTVIEW) || 106066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->isTypeOf(CAM_STREAM_TYPE_PREVIEW)) { 106166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.getThumbnailSize(&(streamInfo->dim.width), &(streamInfo->dim.height)); 106266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 106366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((param.isPostProcScaling()) && 106466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pp_featuremask.feature_mask & CAM_QCOM_FEATURE_SCALE)) { 106566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = param.getStreamDimension(CAM_STREAM_TYPE_OFFLINE_PROC, 106666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->dim); 106766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else if ((param.getofflineRAW()) && 106866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (pStream->isTypeOf(CAM_STREAM_TYPE_RAW))) { 106966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.getStreamDimension(CAM_STREAM_TYPE_SNAPSHOT,streamInfo->dim); 107066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 107166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->getFrameDimension(streamInfo->dim); 107266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 107366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 107466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 107566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( contStream ) { 107666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS; 107766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->num_of_burst = 0; 107866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 107966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 108066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->num_of_burst = burstNum; 108166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 108266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->num_bufs = minStreamBufNum; 108366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 108466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_reproc_config_t rp_cfg; 108566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&rp_cfg, 0, sizeof(cam_stream_reproc_config_t)); 108666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (offline) { 108766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_frame_len_offset_t offset; 108866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(&offset, 0, sizeof(cam_frame_len_offset_t)); 108966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 109066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rp_cfg.pp_type = CAM_OFFLINE_REPROCESS_TYPE; 109166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFormat(rp_cfg.offline.input_fmt); 109266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameDimension(rp_cfg.offline.input_dim); 109366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getFrameOffset(offset); 109466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rp_cfg.offline.input_buf_planes.plane_info = offset; 109566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rp_cfg.offline.input_type = pStream->getMyOriginalType(); 109666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //For input metadata + input buffer 109766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rp_cfg.offline.num_of_bufs = 2; 109866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 109966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rp_cfg.pp_type = CAM_ONLINE_REPROCESS_TYPE; 110066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rp_cfg.online.input_stream_id = pStream->getMyServerID(); 110166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rp_cfg.online.input_stream_type = pStream->getMyOriginalType(); 110266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 110366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.getStreamRotation(streamInfo->stream_type, 110466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->pp_config, streamInfo->dim); 110566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config = rp_cfg; 110666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config = pp_featuremask; 110766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 110866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!(pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) 110966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) 111066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || pStream->isTypeOf(CAM_STREAM_TYPE_RAW) 111166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW))) { 111266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // CAC, SHARPNESS, FLIP and WNR would have been already applied - 111366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // on preview/postview stream in realtime. Need not apply again. 111466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask &= 111566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ~CAM_QCOM_FEATURE_CAC; 111666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask &= 111766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ~CAM_QCOM_FEATURE_SHARPNESS; 111866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask &= 111966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ~CAM_QCOM_FEATURE_FLIP; 112066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Don't do WNR for thumbnail 112166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask &= 112266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ~CAM_QCOM_FEATURE_DENOISE2D; 112366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask &= 112466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ~CAM_QCOM_FEATURE_CDS; 112566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask &= 112666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ~CAM_QCOM_FEATURE_DSDN; 112766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //No need of RAW processing for other than RAW streams 112866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask &= 112966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ~CAM_QCOM_FEATURE_RAW_PROCESSING; 113066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 113166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (param.isHDREnabled() 113266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && !param.isHDRThumbnailProcessNeeded()){ 113366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask 113466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin &= ~CAM_QCOM_FEATURE_HDR; 113566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 113666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 113766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 113866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_type_t type = CAM_STREAM_TYPE_DEFAULT; 113966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (offline) { 114066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin type = streamInfo->reprocess_config.offline.input_type; 114166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 114266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin type = streamInfo->reprocess_config.online.input_stream_type; 114366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 114466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (type == CAM_STREAM_TYPE_SNAPSHOT) { 114566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int flipMode = param.getFlipMode(type); 114666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (flipMode > 0) { 114766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.feature_mask |= 114866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_QCOM_FEATURE_FLIP; 114966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.flip = (uint32_t)flipMode; 115066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 115166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 115266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 115366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((streamInfo->reprocess_config.pp_feature_config.feature_mask 115466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin & CAM_QCOM_FEATURE_SCALE) 115566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && param.isReprocScaleEnabled() 115666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && param.isUnderReprocScaling()) { 115766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //we only Scale Snapshot frame 115866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT)) { 115966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->dim.width = 116066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.scale_param.output_width; 116166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->dim.height = 116266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.scale_param.output_height; 116366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("stream width=%d, height=%d.", 116566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->dim.width, streamInfo->dim.height); 116666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 116766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 116866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // save source stream handler 116966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mSrcStreamHandles[mStreams.size()] = pStream->getMyHandle(); 117066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 117166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pMiscBuf = allocator.allocateMiscBuf(streamInfo); 117266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 117366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGH("Configure Reprocessing: stream = %d, res = %dX%d, fmt = %d, type = %d", 117466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream->getMyOriginalType(), streamInfo->dim.width, 117566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->dim.height, streamInfo->fmt, type); 117666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 117766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // add reprocess stream 117866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (streamInfo->reprocess_config.pp_feature_config.feature_mask 117966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin & CAM_QCOM_FEATURE_ROTATION) { 118066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStream(allocator, pStreamInfoBuf, pMiscBuf, 118166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum, &padding, NULL, NULL, false, false, 118266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin streamInfo->reprocess_config.pp_feature_config.rotation); 118366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 118466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = addStream(allocator, pStreamInfoBuf, pMiscBuf, 118566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin minStreamBufNum, &padding, NULL, NULL, false, false); 118666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 118766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 118866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("add reprocess stream failed, ret = %d", rc); 118966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 119066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 119166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 119266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 119366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 119466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 119566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pSrcChannel = pSrcChannel; 119666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 119766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 119866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 119966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 120066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 120166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : getStreamBySrouceHandle 120266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 120366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: find reprocess stream by its source stream handle 120466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 120566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 120666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @srcHandle : source stream handle 120766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 120866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : ptr to reprocess stream if found. NULL if not found 120966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 121066f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraStream * QCameraReprocessChannel::getStreamBySrouceHandle(uint32_t srcHandle) 121166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 121266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 121366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 121466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 121566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mSrcStreamHandles[i] == srcHandle) { 121666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = mStreams[i]; 121766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 121866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 121966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 122066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 122166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return pStream; 122266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 122366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 122466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 122566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : stop 122666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 122766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: stop channel and unmap offline buffers 122866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 122966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none 123066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 123166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 123266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 123366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 123466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 123566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::stop() 123666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 123766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = QCameraChannel::stop(); 123866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 123966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mOfflineBuffers.empty()) { 124066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *stream = NULL; 124166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin List<OfflineBuffer>::iterator it = mOfflineBuffers.begin(); 124266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int error = NO_ERROR; 124366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for( ; it != mOfflineBuffers.end(); it++) { 124466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin stream = (*it).stream; 124566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != stream) { 124666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin error = stream->unmapBuf((*it).type, 124766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (*it).index, 124866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin -1); 124966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != error) { 125066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error during offline buffer unmap %d", 125166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin error); 125266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 125366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 125466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 125566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOfflineBuffers.clear(); 125666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 125766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 125866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 125966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 126066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 126166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : doReprocessOffline 126266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do offline reprocess on the frame 126466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 126566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 126666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : frame to be performed a reprocess 126766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @meta_buf : Metadata buffer for reprocessing 126866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pStream : Actual reprocess stream 126966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 127066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 127166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 127266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 127366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 127466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_buf_def_t *frame, 127566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *meta_buf, QCameraStream *pStream) 127666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 127766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 127866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin OfflineBuffer mappedBuffer; 127966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t buf_index = 0; 128066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t meta_buf_index = 0; 128166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 128266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((frame == NULL) || (meta_buf == NULL)) { 128366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid Input Paramters"); 128466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return INVALID_OPERATION; 128566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 128666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 128766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream == NULL) { 128866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = getStreamBySrouceHandle(frame->stream_id); 128966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pStream == NULL) { 129066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Input validation failed."); 129166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return INVALID_OPERATION; 129266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 129366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 129466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 129566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (!mOfflineBuffers.empty()) { 129666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin List<OfflineBuffer>::iterator it = mOfflineBuffers.begin(); 129766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for( ; it != mOfflineBuffers.end(); it++) { 129866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_index = (buf_index < ((*it).index)) ? ((*it).index) : buf_index; 129966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 130066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_index += 1; 130166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 130266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 130366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf_index = buf_index; 130466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_buf != NULL) { 130566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF, 130666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf_index, 130766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin -1, 130866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf->fd, 130966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin meta_buf->frame_len); 131066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc ) { 131166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error during metadata buffer mapping"); 131266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 131366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 131466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 131566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 131666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mappedBuffer.index = meta_buf_index; 131766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mappedBuffer.stream = pStream; 131866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_META_BUF; 131966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOfflineBuffers.push_back(mappedBuffer); 132066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_index += 1; 132166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 132266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 132366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 132466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_index, 132566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin -1, 132666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->fd, 132766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin frame->frame_len); 132866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NO_ERROR != rc ) { 132966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Error during reprocess input buffer mapping"); 133066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = -1; 133166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 133266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 133366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mappedBuffer.index = buf_index; 133466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mappedBuffer.stream = pStream; 133566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mappedBuffer.type = CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF; 133666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mOfflineBuffers.push_back(mappedBuffer); 133766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 133866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param; 133966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 134066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 134166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 134266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.buf_index = buf_index; 134366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.frame_idx = frame->frame_idx; 134466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 134566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_buf != NULL) { 134666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.meta_present = 1; 134766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.meta_buf_index = meta_buf_index; 134866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 134966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Offline reprocessing id = %d buf Id = %d meta index = %d type = %d", 135166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.frame_idx, param.reprocess.buf_index, 135266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.meta_buf_index, pStream->getMyOriginalType()); 135366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 135466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->setParameter(param); 135566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 135666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("stream setParameter for reprocess failed"); 135766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 135866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 135966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 136066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 136166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 136266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 136366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : doReprocessOffline 136466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 136566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do offline reprocess on the frame 136666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 136766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 136866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : frame to be performed a reprocess 136966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @meta_buf : Metadata buffer for reprocessing 137066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mParameter : camera parameters 137166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 137266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 137366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 137466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 137566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 137666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocessOffline(mm_camera_super_buf_t *frame, 137766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mm_camera_buf_def_t *meta_buf, QCameraParametersIntf &mParameter) 137866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 137966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 138066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = NULL; 138166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 138266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams.size() < 1) { 138366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No reprocess streams"); 138466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 138566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 138666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_pSrcChannel == NULL) { 138766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No source channel for reprocess"); 138866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 138966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 139066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (frame == NULL) { 139266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("Invalid source frame"); 139366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return BAD_VALUE; 139466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 139566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 139666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 139766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id); 139866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream != NULL) && 139966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle == pStream->getChannelHandle())) { 140066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameter.getofflineRAW() && 140166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)) 140266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) { 140366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 140466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 140566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 140666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA) 140766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (mParameter.getManualCaptureMode() 140866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin < CAM_MANUAL_CAPTURE_TYPE_3)) 140966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) { 141066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Skip metadata for reprocess now because PP module cannot handle meta data 141166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // May need furthur discussion if Imaginglib need meta data 141266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 141366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 141466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 141566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Update Metadata 141666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (meta_buf != NULL) { 141766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t stream_id = frame->bufs[i]->stream_id; 141866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *srcStream = 141966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_pSrcChannel->getStreamByHandle(stream_id); 142066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin metadata_buffer_t *pMetaData = 142166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (metadata_buffer_t *)meta_buf->buffer; 142266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((NULL != pMetaData) && (NULL != srcStream)) { 142366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin IF_META_AVAILABLE(cam_crop_data_t, crop, 142466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin CAM_INTF_META_CROP_DATA, pMetaData) { 142566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (MAX_NUM_STREAMS > crop->num_of_streams) { 142666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (int j = 0; j < MAX_NUM_STREAMS; j++) { 142766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (crop->crop_info[j].stream_id == 142866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin srcStream->getMyServerID()) { 142966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Store crop/roi information for offline reprocess 143066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // in the reprocess stream slot 143166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop->crop_info[crop->num_of_streams].crop = 143266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop->crop_info[j].crop; 143366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop->crop_info[crop->num_of_streams].roi_map = 143466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop->crop_info[j].roi_map; 143566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint8_t k = 0; k < mStreams.size(); k++) { 143666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (srcStream->getMyType() == 143766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[k]->getMyOriginalType()) { 143866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop->crop_info[crop->num_of_streams].stream_id = 143966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[k]->getMyServerID(); 144066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 144166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 144266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 144366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin crop->num_of_streams++; 144466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 144566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 144666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 144766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 144866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No space to add reprocess stream crop/roi information"); 144966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 145466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = doReprocessOffline (frame->bufs[i], meta_buf, pStream); 145566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 145766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 145866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 145966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 146066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 146166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : doReprocess 146266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do a reprocess on the frame 146466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 146566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 146666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @frame : frame to be performed a reprocess 146766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @mParameter : camera parameters 146866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @pMetaStream: Metadata stream handle 146966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @meta_buf_index : Metadata buffer index 147066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 147166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 147266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 147366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 147466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 147566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocess(mm_camera_super_buf_t *frame, 147666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraParametersIntf &mParameter, QCameraStream *pMetaStream, 147766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint8_t meta_buf_index) 147866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 147966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 148066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams.size() < 1) { 148166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No reprocess streams"); 148266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 148366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 148466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_pSrcChannel == NULL) { 148566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No source channel for reprocess"); 148666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 148766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 148866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 148966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaStream == NULL) { 149066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGW("Null Metadata buffer for processing"); 149166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 149266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 149366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (uint32_t i = 0; i < frame->num_bufs; i++) { 149466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin QCameraStream *pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id); 149566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream != NULL) && (m_handle == pStream->getChannelHandle())) { 149666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mParameter.getofflineRAW() && !((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_RAW)) 149766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_POSTVIEW)) 149866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA)))) { 149966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin //Skip all the stream other than RAW and POSTVIEW incase of offline of RAW 150066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 150166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 150266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((pStream->isOrignalTypeOf(CAM_STREAM_TYPE_METADATA) 150366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin && (mParameter.getManualCaptureMode() 150466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin < CAM_MANUAL_CAPTURE_TYPE_3)) 150566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin || (pStream->isTypeOf(CAM_STREAM_TYPE_ANALYSIS))) { 150666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // Skip metadata for reprocess now because PP module cannot handle meta data 150766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // May need furthur discussion if Imaginglib need meta data 150866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 150966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 151066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 151166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param; 151266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 151366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 151466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.buf_index = frame->bufs[i]->buf_idx; 151566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.frame_idx = frame->bufs[i]->frame_idx; 151666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pMetaStream != NULL) { 151766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin // we have meta data frame bundled, sent together with reprocess frame 151866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.meta_present = 1; 151966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.meta_stream_handle = pMetaStream->getMyServerID(); 152066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.meta_buf_index = meta_buf_index; 152166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 152266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 152366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGI("Online reprocessing id = %d buf Id = %d meta index = %d type = %d", 152466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.frame_idx, param.reprocess.buf_index, 152566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.meta_buf_index, pStream->getMyOriginalType()); 152666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 152766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = pStream->setParameter(param); 152866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc != NO_ERROR) { 152966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("stream setParameter for reprocess failed"); 153066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin break; 153166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 153466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 153566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 153666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 153766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 153866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : doReprocess 153966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 154066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: request to do a reprocess on the frame 154166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 154266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 154366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buf_fd : fd to the input buffer that needs reprocess 154466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @buf_lenght : length of the input buffer 154566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @ret_val : result of reprocess. 154666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Example: Could be faceID in case of register face image. 154766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 154866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : int32_t type of status 154966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * NO_ERROR -- success 155066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * none-zero failure code 155166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 155266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint32_t QCameraReprocessChannel::doReprocess(int buf_fd, 155366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin size_t buf_length, int32_t &ret_val) 155466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 155566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin int32_t rc = 0; 155666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (mStreams.size() < 1) { 155766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No reprocess streams"); 155866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return -1; 155966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 156166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin uint32_t buf_idx = 0; 156266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin for (size_t i = 0; i < mStreams.size(); i++) { 156366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ((mStreams[i] != NULL) && 156466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (m_handle != mStreams[i]->getChannelHandle())) { 156566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin continue; 156666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 156766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 156866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_idx, -1, 156966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_fd, buf_length); 157066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 157166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 157266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_stream_parm_buffer_t param; 157366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 157466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 157566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin param.reprocess.buf_index = buf_idx; 157666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = mStreams[i]->setParameter(param); 157766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (rc == NO_ERROR) { 157866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin ret_val = param.reprocess.ret_val; 157966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 158066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 158166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin buf_idx, -1); 158266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 158366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 158466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 158566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 158666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 158766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 1588