16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* Redistribution and use in source and binary forms, with or without 46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* modification, are permitted provided that the following conditions are 56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* met: 66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions of source code must retain the above copyright 76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* notice, this list of conditions and the following disclaimer. 86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions in binary form must reproduce the above 96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* copyright notice, this list of conditions and the following 106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* disclaimer in the documentation and/or other materials provided 116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* with the distribution. 126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Neither the name of The Linux Foundation nor the names of its 136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* contributors may be used to endorse or promote products derived 146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* from this software without specific prior written permission. 156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*/ 296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define LOG_TAG "QCameraChannel" 316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/Errors.h> 336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraParameters.h" 346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h" 356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraChannel.h" 366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevusing namespace android; 386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera { 406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraChannel 436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constrcutor of QCameraChannel 456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_handle : camera handle 486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_ops : ptr to camera ops table 496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel::QCameraChannel(uint32_t cam_handle, 536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_ops_t *cam_ops) 546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_camHandle = cam_handle; 566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_camOps = cam_ops; 576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bIsActive = false; 586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_handle = 0; 606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_numStreams = 0; 616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(mStreams, 0, sizeof(mStreams)); 626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraChannel 666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constrcutor of QCameraChannel 686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel::QCameraChannel() 746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_camHandle = 0; 766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_camOps = NULL; 776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bIsActive = false; 786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_handle = 0; 806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_numStreams = 0; 816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(mStreams, 0, sizeof(mStreams)); 826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCameraChannel 866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraChannel 886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel::~QCameraChannel() 946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_bIsActive) { 966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stop(); 976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[i] != NULL) { 1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete mStreams[i]; 1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStreams[i] = 0; 1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_numStreams = 0; 1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_camOps->delete_channel(m_camHandle, m_handle); 1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_handle = 0; 1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : init 1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: initialization of channel 1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @attr : channel bundle attribute setting 1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @dataCB : data notify callback 1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @userData: user data ptr 1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::init(mm_camera_channel_attr_t *attr, 1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_buf_notify_t dataCB, 1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *userData) 1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_handle = m_camOps->add_channel(m_camHandle, 1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev attr, 1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev dataCB, 1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev userData); 1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_handle == 0) { 1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: Add channel failed", __func__); 1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return UNKNOWN_ERROR; 1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addStream 1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a stream into channel 1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @allocator : stream related buffer allocator 1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @streamInfoBuf : ptr to buf that constains stream info 1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @minStreamBufNum: number of stream buffers needed 1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @paddingInfo : padding information 1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @stream_cb : stream data notify callback 1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @userdata : user data ptr 1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::addStream(QCameraAllocator &allocator, 1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraHeapMemory *streamInfoBuf, 1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t minStreamBufNum, 1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_padding_info_t *paddingInfo, 1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stream_cb_routine stream_cb, 1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void *userdata) 1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_numStreams >= MAX_STREAM_NUM_IN_BUNDLE) { 1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: stream number (%d) exceeds max limit (%d)", 1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __func__, m_numStreams, MAX_STREAM_NUM_IN_BUNDLE); 1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pStream = new QCameraStream(allocator, 1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_camHandle, 1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_handle, 1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_camOps, 1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev paddingInfo); 1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream == NULL) { 1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No mem for Stream", __func__); 1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_MEMORY; 1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pStream->init(streamInfoBuf, minStreamBufNum, stream_cb, userdata); 1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == 0) { 1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStreams[m_numStreams] = pStream; 1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_numStreams++; 1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev delete pStream; 1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : start 1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start channel, which will start all streams belong to this channel 1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 19472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * PARAMETERS : None 1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 20072594c0844ef2066190ecaddf73c9207a983ad90Muhua Liint32_t QCameraChannel::start() 2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_numStreams > 1) { 2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // there is more than one stream in the channel 2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // we need to notify mctl that all streams in this channel need to be bundled 2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_bundle_config_t bundleInfo; 2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(&bundleInfo, 0, sizeof(bundleInfo)); 2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = m_camOps->get_bundle_info(m_camHandle, m_handle, &bundleInfo); 2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: get_bundle_info failed", __func__); 2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (bundleInfo.num_of_streams > 1) { 21572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li for (int i = 0; i < bundleInfo.num_of_streams; i++) { 21672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li QCameraStream *pStream = getStreamByServerID(bundleInfo.stream_ids[i]); 21772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li if (pStream != NULL) { 21872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 21972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li // Skip metadata for reprocess now because PP module cannot handle meta data 22072594c0844ef2066190ecaddf73c9207a983ad90Muhua Li // May need furthur discussion if Imaginglib need meta data 22172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li continue; 22272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li } 22372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li 22472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li cam_stream_parm_buffer_t param; 22572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 22672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li param.type = CAM_STREAM_PARAM_TYPE_SET_BUNDLE_INFO; 22772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li param.bundleInfo = bundleInfo; 22872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li rc = pStream->setParameter(param); 22972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li if (rc != NO_ERROR) { 23072594c0844ef2066190ecaddf73c9207a983ad90Muhua Li ALOGE("%s: stream setParameter for set bundle failed", __func__); 23172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li return rc; 23272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li } 23372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li } 2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[i] != NULL) { 2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStreams[i]->start(); 2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = m_camOps->start_channel(m_camHandle, m_handle); 2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[i] != NULL) { 2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStreams[i]->stop(); 2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bIsActive = true; 2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stop 2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop a channel, which will stop all streams belong to this channel 2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::stop() 2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = m_camOps->stop_channel(m_camHandle, m_handle); 2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[i] != NULL) { 2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStreams[i]->stop(); 2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_bIsActive = false; 2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : bufDone 2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return a stream buf back to kernel 2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @recvd_frame : stream buf frame to be returned 2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::bufDone(mm_camera_super_buf_t *recvd_frame) 2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < recvd_frame->num_bufs; i++) { 3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (recvd_frame->bufs[i] != NULL) { 3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int j = 0; j < m_numStreams; j++) { 3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[j] != NULL && 3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStreams[j]->getMyHandle() == recvd_frame->bufs[i]->stream_id) { 3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx); 3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; // break loop j 3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : processZoomDone 3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process zoom done event 3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @previewWindoe : ptr to preview window ops table, needed to set preview 3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * crop information 3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @crop_info : crop info as a result of zoom operation 3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraChannel::processZoomDone(preview_stream_ops_t *previewWindow, 3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_crop_data_t &crop_info) 3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = NO_ERROR; 3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[i] != NULL) { 3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mStreams[i]->processZoomDone(previewWindow, crop_info); 3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getStreamByHandle 3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return stream object by stream handle 3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @streamHandle : stream handle 3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : stream object. NULL if not found 3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStream *QCameraChannel::getStreamByHandle(uint32_t streamHandle) 3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[i] != NULL && mStreams[i]->getMyHandle() == streamHandle) { 3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mStreams[i]; 3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 36172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * FUNCTION : getStreamByServerID 3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * DESCRIPTION: return stream object by stream server ID from daemon 3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 36672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * @serverID : stream server ID 36772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * 36872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * RETURN : stream object. NULL if not found 36972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li *==========================================================================*/ 37072594c0844ef2066190ecaddf73c9207a983ad90Muhua LiQCameraStream *QCameraChannel::getStreamByServerID(uint32_t serverID) 37172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li{ 37272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li for (int i = 0; i < m_numStreams; i++) { 37372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li if (mStreams[i] != NULL && mStreams[i]->getMyServerID() == serverID) { 37472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li return mStreams[i]; 37572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li } 37672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li } 37772594c0844ef2066190ecaddf73c9207a983ad90Muhua Li return NULL; 37872594c0844ef2066190ecaddf73c9207a983ad90Muhua Li} 37972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li 38072594c0844ef2066190ecaddf73c9207a983ad90Muhua Li/*=========================================================================== 38172594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * FUNCTION : getStreamByIndex 38272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * 38372594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * DESCRIPTION: return stream object by index of streams in the channel 38472594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * 38572594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * PARAMETERS : 38672594c0844ef2066190ecaddf73c9207a983ad90Muhua Li * @index : index of stream in the channel 3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : stream object. NULL if not found 3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStream *QCameraChannel::getStreamByIndex(uint8_t index) 3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (index < m_numStreams) { 3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return mStreams[index]; 3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NULL; 3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraPicChannel 4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraPicChannel 4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_handle : camera handle 4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_ops : ptr to camera ops table 4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPicChannel::QCameraPicChannel(uint32_t cam_handle, 4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_ops_t *cam_ops) : 4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel(cam_handle, cam_ops) 4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraPicChannel 4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constructor of QCameraPicChannel 4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPicChannel::QCameraPicChannel() 4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCameraPicChannel 4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraPicChannel 4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraPicChannel::~QCameraPicChannel() 4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : takePicture 4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send request for queued snapshot frames 4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @num_of_snapshot : number of snapshot frames requested 4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPicChannel::takePicture(uint8_t num_of_snapshot) 4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = m_camOps->request_super_buf(m_camHandle, 4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_handle, 4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev num_of_snapshot); 4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : cancelPicture 4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel request for queued snapshot frames 4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraPicChannel::cancelPicture() 4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = m_camOps->cancel_super_buf_request(m_camHandle, m_handle); 4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraVideoChannel 4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraVideoChannel 4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_handle : camera handle 4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_ops : ptr to camera ops table 4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraVideoChannel::QCameraVideoChannel(uint32_t cam_handle, 4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_ops_t *cam_ops) : 4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel(cam_handle, cam_ops) 4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraVideoChannel 4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constructor of QCameraVideoChannel 4996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraVideoChannel::QCameraVideoChannel() 5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCameraVideoChannel 5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraVideoChannel 5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraVideoChannel::~QCameraVideoChannel() 5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : releaseFrame 5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return video frame from app 5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @opaque : ptr to video frame to be returned 5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @isMetaData : if frame is a metadata or real frame 5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraVideoChannel::releaseFrame(const void * opaque, bool isMetaData) 5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pVideoStream = NULL; 5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mStreams[i] != NULL && mStreams[i]->isTypeOf(CAM_STREAM_TYPE_VIDEO)) { 5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pVideoStream = mStreams[i]; 5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == pVideoStream) { 5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No video stream in the channel", __func__); 5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = pVideoStream->bufDone(opaque, isMetaData); 5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraReprocessChannel 5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraReprocessChannel 5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_handle : camera handle 5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @cam_ops : ptr to camera ops table 5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pp_mask : post-proccess feature mask 5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel::QCameraReprocessChannel(uint32_t cam_handle, 5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mm_camera_ops_t *cam_ops) : 5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel(cam_handle, cam_ops), 5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pSrcChannel(NULL) 5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles)); 5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraReprocessChannel 5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constructor of QCameraReprocessChannel 5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel::QCameraReprocessChannel() : 5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pSrcChannel(NULL) 5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCameraReprocessChannel 5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCameraReprocessChannel 5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none 5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : none 5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel::~QCameraReprocessChannel() 5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : addReprocStreamsFromSource 6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add reprocess streams from input source channel 6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @allocator : stream related buffer allocator 6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @config : pp feature configuration 6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pSrcChannel : ptr to input source channel that needs reprocess 6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @minStreamBufNum: number of stream buffers needed 6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @paddingInfo : padding information 6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraReprocessChannel::addReprocStreamsFromSource(QCameraAllocator& allocator, 6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_pp_feature_config_t &config, 6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraChannel *pSrcChannel, 6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t minStreamBufNum, 6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_padding_info_t *paddingInfo) 6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pStream = NULL; 6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraHeapMemory *pStreamInfoBuf = NULL; 6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_stream_info_t *streamInfo = NULL; 6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles)); 6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < pSrcChannel->getNumOfStreams(); i++) { 6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStream = pSrcChannel->getStreamByIndex(i); 6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream != NULL) { 6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Skip metadata for reprocess now because PP module cannot handle meta data 6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // May need furthur discussion if Imaginglib need meta data 6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev continue; 6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStreamInfoBuf = allocator.allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC); 6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStreamInfoBuf == NULL) { 6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: no mem for stream info buf", __func__); 6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = NO_MEMORY; 6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo = (cam_stream_info_t *)pStreamInfoBuf->getPtr(0); 6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(streamInfo, 0, sizeof(cam_stream_info_t)); 6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC; 6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pStream->getFormat(streamInfo->fmt); 6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pStream->getFrameDimension(streamInfo->dim); 6509fc8e6ba592de8575c9f9901260b74b0ce84fa0cMuhua Li streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST; 6519fc8e6ba592de8575c9f9901260b74b0ce84fa0cMuhua Li streamInfo->num_of_burst = minStreamBufNum; 6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->reprocess_config.pp_type = CAM_ONLINE_REPROCESS_TYPE; 6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->reprocess_config.online.input_stream_id = pStream->getMyServerID(); 6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->reprocess_config.online.input_stream_type = pStream->getMyType(); 6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev streamInfo->reprocess_config.pp_feature_config = config; 6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 658744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (!(pStream->isTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 659025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy pStream->isTypeOf(CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT) || 660025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy pStream->isOrignalTypeOf(CAM_STREAM_TYPE_SNAPSHOT) || 661025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy pStream->isOrignalTypeOf(CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT))) { 662744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy streamInfo->reprocess_config.pp_feature_config.feature_mask &= ~CAM_QCOM_FEATURE_CAC; 663744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } 664744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (streamInfo->reprocess_config.pp_feature_config.feature_mask & CAM_QCOM_FEATURE_ROTATION) { 665744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (streamInfo->reprocess_config.pp_feature_config.rotation == ROTATE_90 || 666744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy streamInfo->reprocess_config.pp_feature_config.rotation == ROTATE_270) { 667744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy // rotated by 90 or 270, need to switch width and height 668744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy int32_t temp = streamInfo->dim.height; 669744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy streamInfo->dim.height = streamInfo->dim.width; 670744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy streamInfo->dim.width = temp; 671744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } 672744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy } 673744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy 6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // save source stream handler 6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mSrcStreamHandles[m_numStreams] = pStream->getMyHandle(); 6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // add reprocess stream 6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = addStream(allocator, 6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStreamInfoBuf, minStreamBufNum, 6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev paddingInfo, 6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev NULL, NULL); 6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: add reprocess stream failed, ret = %d", __func__, rc); 6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_pSrcChannel = pSrcChannel; 6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getStreamBySrouceHandle 6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: find reprocess stream by its source stream handle 6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @srcHandle : source stream handle 7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : ptr to reprocess stream if found. NULL if not found 7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraStream * QCameraReprocessChannel::getStreamBySrouceHandle(uint32_t srcHandle) 7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pStream = NULL; 7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mSrcStreamHandles[i] == srcHandle) { 7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pStream = mStreams[i]; 7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return pStream; 7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : doReprocess 7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: request to do a reprocess on the frame 7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @frame : frame to be performed a reprocess 7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraReprocessChannel::doReprocess(mm_camera_super_buf_t *frame) 7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_numStreams < 1) { 7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No reprocess stream is created", __func__); 7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return -1; 7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_pSrcChannel == NULL) { 7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No source channel for reprocess", __func__); 7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return -1; 7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // find meta data stream and index of meta data frame in the superbuf 7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pMetaStream = NULL; 7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t meta_buf_index = 0; 7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < frame->num_bufs; i++) { 7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pStream = m_pSrcChannel->getStreamByHandle(frame->bufs[i]->stream_id); 7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream != NULL) { 7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev meta_buf_index = frame->bufs[i]->buf_idx; 7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pMetaStream = pStream; 7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < frame->num_bufs; i++) { 7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev QCameraStream *pStream = getStreamBySrouceHandle(frame->bufs[i]->stream_id); 7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream != NULL) { 7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pStream->isTypeOf(CAM_STREAM_TYPE_METADATA)) { 7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // Skip metadata for reprocess now because PP module cannot handle meta data 7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // May need furthur discussion if Imaginglib need meta data 7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev continue; 7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_stream_parm_buffer_t param; 7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.reprocess.buf_index = frame->bufs[i]->buf_idx; 7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.reprocess.frame_idx = frame->bufs[i]->frame_idx; 7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pMetaStream != NULL) { 7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev // we have meta data frame bundled, sent together with reprocess frame 7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.reprocess.meta_present = 1; 7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.reprocess.meta_stream_handle = pMetaStream->getMyServerID(); 7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.reprocess.meta_buf_index = meta_buf_index; 7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = pStream->setParameter(param); 7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc != NO_ERROR) { 7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: stream setParameter for reprocess failed", __func__); 7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : doReprocess 7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: request to do a reprocess on the frame 7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @buf_fd : fd to the input buffer that needs reprocess 7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @buf_lenght : length of the input buffer 7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ret_val : result of reprocess. 7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Example: Could be faceID in case of register face image. 7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : int32_t type of status 7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCameraReprocessChannel::doReprocess(int buf_fd, 8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t buf_length, 8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t &ret_val) 8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t rc = 0; 8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_numStreams < 1) { 8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No reprocess stream is created", __func__); 8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return -1; 8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint32_t buf_idx = 0; 8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for (int i = 0; i < m_numStreams; i++) { 8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev buf_idx, -1, 8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev buf_fd, buf_length); 8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_stream_parm_buffer_t param; 8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev param.reprocess.buf_index = buf_idx; 8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev rc = mStreams[i]->setParameter(param); 8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (rc == NO_ERROR) { 8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret_val = param.reprocess.ret_val; 8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev buf_idx, -1); 8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return rc; 8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera 835