1742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang/* Copyright (c) 2012-2014, The Linux Foundataion. All rights reserved. 2625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 3625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* Redistribution and use in source and binary forms, with or without 4625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* modification, are permitted provided that the following conditions are 5625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* met: 6625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions of source code must retain the above copyright 7625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* notice, this list of conditions and the following disclaimer. 8625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Redistributions in binary form must reproduce the above 9625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* copyright notice, this list of conditions and the following 10625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* disclaimer in the documentation and/or other materials provided 11625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* with the distribution. 12625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* * Neither the name of The Linux Foundation nor the names of its 13625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* contributors may be used to endorse or promote products derived 14625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* from this software without specific prior written permission. 15625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 16625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang* 28625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang*/ 29625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 30625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#define LOG_TAG "QCamera3Channel" 3114dfc272241ba78c85a327da2872e71b3208f8c5Shuzhen Wang//#define LOG_NDEBUG 0 32625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 3366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <stdlib.h> 3466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <cstdlib> 3566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <stdio.h> 3666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#include <string.h> 37625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <hardware/camera3.h> 38e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang#include <system/camera_metadata.h> 39625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <gralloc_priv.h> 40625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Log.h> 41625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include <utils/Errors.h> 4288275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi#include <cutils/properties.h> 43625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang#include "QCamera3Channel.h" 44625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 45625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangusing namespace android; 46625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 47d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab#define MIN_STREAMING_BUFFER_NUM 7+11 489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 49625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangnamespace qcamera { 5066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurustatic const char ExifAsciiPrefix[] = 5166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 }; // "ASCII\0\0\0" 5266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajgurustatic const char ExifUndefinedPrefix[] = 5366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // "\0\0\0\0\0\0\0\0" 5466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 5566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#define GPS_PROCESSING_METHOD_SIZE 101 5666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#define EXIF_ASCII_PREFIX_SIZE 8 //(sizeof(ExifAsciiPrefix)) 5766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru#define FOCAL_LENGTH_DECIMAL_PRECISION 100 58625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 59625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 60625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3Channel 61625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 62625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constrcutor of QCamera3Channel 63625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 64625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 65625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cam_handle : camera handle 66625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cam_ops : ptr to camera ops table 67625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 68625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 69625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 70625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3Channel::QCamera3Channel(uint32_t cam_handle, 71625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_ops_t *cam_ops, 72e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang channel_cb_routine cb_routine, 73e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang cam_padding_info_t *paddingInfo, 74e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang void *userData) 75625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 76625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_camHandle = cam_handle; 77625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_camOps = cam_ops; 78625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_bIsActive = false; 79625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 80625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_handle = 0; 81625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_numStreams = 0; 82625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(mStreams, 0, sizeof(mStreams)); 83d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mUserData = userData; 84d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 85d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mStreamInfoBuf = NULL; 86d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mChannelCB = cb_routine; 87d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mPaddingInfo = paddingInfo; 88625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 89625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 90625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 91625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3Channel 92625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 93625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: default constrcutor of QCamera3Channel 94625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 95625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 96625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 97625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 98625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 99625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3Channel::QCamera3Channel() 100625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 101625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_camHandle = 0; 102625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_camOps = NULL; 103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_bIsActive = false; 104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_handle = 0; 106625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_numStreams = 0; 107625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang memset(mStreams, 0, sizeof(mStreams)); 108d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mUserData = NULL; 109d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang 110d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mStreamInfoBuf = NULL; 111d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mChannelCB = NULL; 112d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mPaddingInfo = NULL; 113625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 114625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 115625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 116625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3Channel 117625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 118625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera3Channel 119625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 120625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 121625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 122625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 123625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 124625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3Channel::~QCamera3Channel() 125625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 126e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (m_bIsActive) 127625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang stop(); 128625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 129625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (int i = 0; i < m_numStreams; i++) { 130625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mStreams[i] != NULL) { 131625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang delete mStreams[i]; 132625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mStreams[i] = 0; 133625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 134625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 13550e303f9fac7406547b13e3713162812e7cbfd34Shuzhen Wang if (m_handle) { 13650e303f9fac7406547b13e3713162812e7cbfd34Shuzhen Wang m_camOps->delete_channel(m_camHandle, m_handle); 13750e303f9fac7406547b13e3713162812e7cbfd34Shuzhen Wang ALOGE("%s: deleting channel %d", __func__, m_handle); 13850e303f9fac7406547b13e3713162812e7cbfd34Shuzhen Wang m_handle = 0; 13950e303f9fac7406547b13e3713162812e7cbfd34Shuzhen Wang } 140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_numStreams = 0; 141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 143625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 144625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : init 145625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 146625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: initialization of channel 147625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 148625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 149625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @attr : channel bundle attribute setting 150625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @dataCB : data notify callback 151625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userData: user data ptr 152625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 153625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 154625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 155625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 156625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 157625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3Channel::init(mm_camera_channel_attr_t *attr, 158e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mm_camera_buf_notify_t dataCB) 159625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 160625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_handle = m_camOps->add_channel(m_camHandle, 161625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang attr, 162625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang dataCB, 163f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab this); 164625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (m_handle == 0) { 165625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: Add channel failed", __func__); 166625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return UNKNOWN_ERROR; 167625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 168625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_ERROR; 169625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 170625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 171625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 172625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : addStream 173625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 174625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: add a stream into channel 175625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 176625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 177625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @allocator : stream related buffer allocator 178625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @streamInfoBuf : ptr to buf that constains stream info 179625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @minStreamBufNum: number of stream buffers needed 180625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @paddingInfo : padding information 181625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream_cb : stream data notify callback 182625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @userdata : user data ptr 183625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 184625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 185625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3Channel::addStream(cam_stream_type_t streamType, 189625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cam_format_t streamFormat, 190625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cam_dimension_t streamDim, 191e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint8_t minStreamBufNum) 192625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 193625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int32_t rc = NO_ERROR; 194f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 195f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (m_numStreams >= 1) { 196f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Only one stream per channel supported in v3 Hal", __func__); 197f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return BAD_VALUE; 198f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 199f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 200625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (m_numStreams >= MAX_STREAM_NUM_IN_BUNDLE) { 201625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: stream number (%d) exceeds max limit (%d)", 202625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang __func__, m_numStreams, MAX_STREAM_NUM_IN_BUNDLE); 203625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return BAD_VALUE; 204625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 205625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Stream *pStream = new QCamera3Stream(m_camHandle, 206625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_handle, 207625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_camOps, 208e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mPaddingInfo, 2099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang this); 210625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (pStream == NULL) { 211625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: No mem for Stream", __func__); 212625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NO_MEMORY; 213625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 214625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 2157ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pStream->init(streamType, streamFormat, streamDim, NULL, minStreamBufNum, 216e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang streamCbRoutine, this); 217625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc == 0) { 218625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mStreams[m_numStreams] = pStream; 219625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_numStreams++; 220625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 221625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang delete pStream; 222625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 224625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 225625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 226625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 227625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : start 228625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 229625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: start channel, which will start all streams belong to this channel 230625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 231625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 232625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 233625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 234625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 235625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 236625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 237625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3Channel::start() 238625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 239625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int32_t rc = NO_ERROR; 240625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 241625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (m_numStreams > 1) { 242625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: bundle not supported", __func__); 243625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 244625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 245625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (int i = 0; i < m_numStreams; i++) { 246625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mStreams[i] != NULL) { 247625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mStreams[i]->start(); 248625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 249625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 250625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = m_camOps->start_channel(m_camHandle, m_handle); 251625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 252625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (rc != NO_ERROR) { 253625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (int i = 0; i < m_numStreams; i++) { 254625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mStreams[i] != NULL) { 255625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mStreams[i]->stop(); 256625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 257625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 258625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 259625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_bIsActive = true; 260625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 261625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 262625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 263625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 264625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 265625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 266625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : stop 267625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 268625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: stop a channel, which will stop all streams belong to this channel 269625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 270625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 271625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 272625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 273625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 274625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 275625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 276625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3Channel::stop() 277625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 278625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int32_t rc = NO_ERROR; 279a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru if(!m_bIsActive) { 280a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru ALOGE("%s: Attempt to stop inactive channel",__func__); 281a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru return rc; 282a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru } 283a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru 284625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = m_camOps->stop_channel(m_camHandle, m_handle); 285625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 286625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (int i = 0; i < m_numStreams; i++) { 287625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mStreams[i] != NULL) { 288625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mStreams[i]->stop(); 289625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 290625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 291625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 292625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang m_bIsActive = false; 293625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 294625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 295625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 296625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 297625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : bufDone 298625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 299625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: return a stream buf back to kernel 300625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 301625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 302625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @recvd_frame : stream buf frame to be returned 303625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 304625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : int32_t type of status 305625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * NO_ERROR -- success 306625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * none-zero failure code 307625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 308625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3Channel::bufDone(mm_camera_super_buf_t *recvd_frame) 309625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 310625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int32_t rc = NO_ERROR; 311625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (int i = 0; i < recvd_frame->num_bufs; i++) { 312625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (recvd_frame->bufs[i] != NULL) { 313625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (int j = 0; j < m_numStreams; j++) { 314625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mStreams[j] != NULL && 315625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mStreams[j]->getMyHandle() == recvd_frame->bufs[i]->stream_id) { 316625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = mStreams[j]->bufDone(recvd_frame->bufs[i]->buf_idx); 317625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang break; // break loop j 318625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 319625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 320625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 321625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 322625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 323625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 324625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 325625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 326625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 32734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * FUNCTION : getStreamTypeMask 32834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * 32934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * DESCRIPTION: Get bit mask of all stream types in this channel 33034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * 33134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * PARAMETERS : None 33234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * 33334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy * RETURN : Bit mask of all stream types in this channel 33434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy *==========================================================================*/ 33534a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddyuint32_t QCamera3Channel::getStreamTypeMask() 33634a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy{ 33734a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy uint32_t mask = 0; 33834a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy for (int i = 0; i < m_numStreams; i++) { 33934a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy mask |= (0x1 << mStreams[i]->getMyType()); 34034a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy } 34134a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy return mask; 34234a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy} 34334a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy 34434a6e88cee59495adcf1437d027c105171738a07Nagesh Subba Reddy/*=========================================================================== 345cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang * FUNCTION : getStreamID 346cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang * 347cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang * DESCRIPTION: Get StreamID of requested stream type 348cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang * 349cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang * PARAMETERS : streamMask 350cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang * 351cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang * RETURN : Stream ID 352cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang *==========================================================================*/ 353cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wanguint32_t QCamera3Channel::getStreamID(uint32_t streamMask) 354cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang{ 355cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang uint32_t streamID = 0; 356cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang for (int i = 0; i < m_numStreams; i++) { 357cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang if (streamMask == (uint32_t )(0x1 << mStreams[i]->getMyType())) { 358cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang streamID = mStreams[i]->getMyServerID(); 359cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang break; 360cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang } 361cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang } 362cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang return streamID; 363cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang} 364cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang 365cc0a016e6051847dfe4ccfd015f38b9d94093c64Shuzhen Wang/*=========================================================================== 366c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * FUNCTION : getInternalFormatBuffer 367c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 368c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * DESCRIPTION: return buffer in the internal format structure 369c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 370c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * PARAMETERS : 371c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * @streamHandle : buffer handle 372c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 373c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * RETURN : stream object. NULL if not found 374c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang *==========================================================================*/ 375c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wangmm_camera_buf_def_t* QCamera3RegularChannel::getInternalFormatBuffer( 376c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang buffer_handle_t * buffer) 377c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang{ 378c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang int32_t index; 379c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(buffer == NULL) 380c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return NULL; 381c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang index = mMemory->getMatchBufIndex((void*)buffer); 382c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(index < 0) { 383c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: Could not find object among registered buffers",__func__); 384c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return NULL; 385c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 386c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return mStreams[0]->getInternalFormatBuffer(index); 387c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang} 388c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 389c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang/*=========================================================================== 390625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : getStreamByHandle 391625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 392625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: return stream object by stream handle 393625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 394625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 395625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @streamHandle : stream handle 396625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 397625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : stream object. NULL if not found 398625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 399625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3Stream *QCamera3Channel::getStreamByHandle(uint32_t streamHandle) 400625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 401625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang for (int i = 0; i < m_numStreams; i++) { 402625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mStreams[i] != NULL && mStreams[i]->getMyHandle() == streamHandle) { 403625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mStreams[i]; 404625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 405625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 406625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 407625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 408625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 409625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 4107ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getStreamByIndex 411625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 4127ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: return stream object by index 413625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 414625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 415625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @streamHandle : stream handle 416625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 417625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : stream object. NULL if not found 418625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 419625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3Stream *QCamera3Channel::getStreamByIndex(uint8_t index) 420625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 421625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (index < m_numStreams) { 422625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return mStreams[index]; 423625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 424625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return NULL; 425625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 426625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 427625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 428625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : streamCbRoutine 429625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 430625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: callback routine for stream 431625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 432625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 433625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @streamHandle : stream handle 434625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 435625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : stream object. NULL if not found 436625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 437625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3Channel::streamCbRoutine(mm_camera_super_buf_t *super_frame, 438625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Stream *stream, void *userdata) 439625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 440625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Channel *channel = (QCamera3Channel *)userdata; 441625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (channel == NULL) { 442625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: invalid channel pointer", __func__); 443625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 444625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 445625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel->streamCbRoutine(super_frame, stream); 446625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 447625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 448625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 449625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : QCamera3RegularChannel 450625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 451625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: constrcutor of QCamera3RegularChannel 452625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 453625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 454625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cam_handle : camera handle 455625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cam_ops : ptr to camera ops table 456625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @cb_routine : callback routine to frame aggregator 457625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @stream : camera3_stream_t structure 458625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 459625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 460625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 461625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3RegularChannel::QCamera3RegularChannel(uint32_t cam_handle, 462625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_ops_t *cam_ops, 463625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel_cb_routine cb_routine, 464e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang cam_padding_info_t *paddingInfo, 465e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang void *userData, 466625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *stream) : 467e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel(cam_handle, cam_ops, cb_routine, 468e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang paddingInfo, userData), 469625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCamera3Stream(stream), 4709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mNumBufs(0), 471625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mCamera3Buffers(NULL), 472c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mMemory(NULL), 473c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mWidth(stream->width), 474c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mHeight(stream->height) 475c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang{ 476c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang} 477c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 478c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang/*=========================================================================== 479c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * FUNCTION : QCamera3RegularChannel 480c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 481c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * DESCRIPTION: constrcutor of QCamera3RegularChannel 482c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 483c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * PARAMETERS : 484c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * @cam_handle : camera handle 485c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * @cam_ops : ptr to camera ops table 486c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * @cb_routine : callback routine to frame aggregator 487c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * @stream : camera3_stream_t structure 488c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * 489c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang * RETURN : none 490c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang *==========================================================================*/ 491c8d1059ae679132e7654708fdfca6ee221775187Shuzhen WangQCamera3RegularChannel::QCamera3RegularChannel(uint32_t cam_handle, 492c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_ops_t *cam_ops, 493c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang channel_cb_routine cb_routine, 494c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang cam_padding_info_t *paddingInfo, 495c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang void *userData, 496c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang camera3_stream_t *stream, 497c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t width, uint32_t height) : 498c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang QCamera3Channel(cam_handle, cam_ops, cb_routine, 499c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang paddingInfo, userData), 500c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCamera3Stream(stream), 501c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mNumBufs(0), 502c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mCamera3Buffers(NULL), 503c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mMemory(NULL), 504c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mWidth(width), 505c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mHeight(height) 506625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 507625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 508625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 509625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 510625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : ~QCamera3RegularChannel 511625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 512625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: destructor of QCamera3RegularChannel 513625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 514625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : none 515625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 516625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : none 517625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 518625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3RegularChannel::~QCamera3RegularChannel() 519625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 520e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (mCamera3Buffers) { 521e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang delete[] mCamera3Buffers; 522e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 523625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 524625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 52566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3RegularChannel::initialize() 52666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 52766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //TO DO 52866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return 0; 52966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 53066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 531625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 532625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : request 533625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 534625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: process a request from camera service. Stream on if ncessary. 535625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 536625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 537625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffer : buffer to be filled for this request 538625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 539625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 0 on a success start of capture 540625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -EINVAL on invalid input 541625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV on serious error 542625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 543e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint32_t QCamera3RegularChannel::request(buffer_handle_t *buffer, uint32_t frameNumber) 544625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 545e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang //FIX ME: Return buffer back in case of failures below. 546e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 547e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int32_t rc = NO_ERROR; 548e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int index; 549e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(!m_bIsActive) { 550e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGD("%s: First request on this channel starting stream",__func__); 551e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang start(); 552e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(rc != NO_ERROR) { 553e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Failed to start the stream on the request",__func__); 554e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 555e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 556e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } else { 557e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGV("%s: Request on an existing stream",__func__); 558e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 559e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 560e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(!mMemory) { 561e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: error, Gralloc Memory object not yet created for this stream",__func__); 562e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NO_MEMORY; 563e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 564e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 565e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang index = mMemory->getMatchBufIndex((void*)buffer); 566e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(index < 0) { 567e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Could not find object among registered buffers",__func__); 568e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return DEAD_OBJECT; 569e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 570e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 571e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = mStreams[0]->bufDone(index); 572e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(rc != NO_ERROR) { 573e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Failed to Q new buffer to stream",__func__); 574e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 575e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 576e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 577e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = mMemory->markFrameNumber(index, frameNumber); 578e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 579625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 580625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 581625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang/*=========================================================================== 582625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * FUNCTION : registerBuffers 583625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 584625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * DESCRIPTION: register streaming buffers to the channel object 585625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 586625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * PARAMETERS : 587625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @num_buffers : number of buffers to be registered 588625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * @buffers : buffer to be registered 589625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * 590625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * RETURN : 0 on a success start of capture 591625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -EINVAL on invalid input 592625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENOMEM on failure to register the buffer 593625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang * -ENODEV on serious error 594625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang *==========================================================================*/ 595625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3RegularChannel::registerBuffers(uint32_t num_buffers, buffer_handle_t **buffers) 596625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 597625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang int rc = 0; 598625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang struct private_handle_t *priv_handle = (struct private_handle_t *)(*buffers[0]); 599625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cam_stream_type_t streamType; 600625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cam_format_t streamFormat; 601625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang cam_dimension_t streamDim; 602625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 603e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = init(NULL, NULL); 604e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 605e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: init failed", __func__); 606e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 607e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 608e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 609625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (mCamera3Stream->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 610625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang if (priv_handle->flags & private_handle_t::PRIV_FLAGS_VIDEO_ENCODER) { 611625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamType = CAM_STREAM_TYPE_VIDEO; 612625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamFormat = CAM_FORMAT_YUV_420_NV12; 61333cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang } else if (priv_handle->flags & private_handle_t::PRIV_FLAGS_HW_TEXTURE) { 614625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamType = CAM_STREAM_TYPE_PREVIEW; 615625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang streamFormat = CAM_FORMAT_YUV_420_NV21; 616625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 617c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //TODO: Add a new flag in libgralloc for ZSL buffers, and its size needs 618c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang // to be properly aligned and padded. 619625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang ALOGE("%s: priv_handle->flags 0x%x not supported", 620625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang __func__, priv_handle->flags); 621c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang streamType = CAM_STREAM_TYPE_SNAPSHOT; 622c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang streamFormat = CAM_FORMAT_YUV_420_NV21; 623625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 6248867984d33ed870071109a4500402dddbc85c048Shuzhen Wang } else if(mCamera3Stream->format == HAL_PIXEL_FORMAT_YCbCr_420_888) { 625025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy streamType = CAM_STREAM_TYPE_CALLBACK; 6268867984d33ed870071109a4500402dddbc85c048Shuzhen Wang streamFormat = CAM_FORMAT_YUV_420_NV21; 627625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } else { 628625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO: Fail for other types of streams for now 6298867984d33ed870071109a4500402dddbc85c048Shuzhen Wang ALOGE("%s: format is not IMPLEMENTATION_DEFINED or flexible", __func__); 630625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 631625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang } 632625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 633e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang /* Bookkeep buffer set because they go out of scope after register call */ 6349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mNumBufs = num_buffers; 635e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCamera3Buffers = new buffer_handle_t*[num_buffers]; 636e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (mCamera3Buffers == NULL) { 637e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 638e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return -ENOMEM; 639e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 640e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang for (size_t i = 0; i < num_buffers; i++) 641e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mCamera3Buffers[i] = buffers[i]; 642625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 643c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang streamDim.width = mWidth; 644c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang streamDim.height = mHeight; 645c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 646625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang rc = QCamera3Channel::addStream(streamType, streamFormat, streamDim, 647e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang num_buffers); 648625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return rc; 649625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 650625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 6519de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangvoid QCamera3RegularChannel::streamCbRoutine( 6529de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mm_camera_super_buf_t *super_frame, 653625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Stream *stream) 654625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 655e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang //FIXME Q Buf back in case of error? 656e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint8_t frameIndex; 657e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang buffer_handle_t *resultBuffer; 658e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang int32_t resultFrameNumber; 659e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang camera3_stream_buffer_t result; 660e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 661e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(!super_frame) { 662e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Invalid Super buffer",__func__); 663e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 664e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 665e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 666e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(super_frame->num_bufs != 1) { 667e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Multiple streams are not supported",__func__); 668e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 669e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 670e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(super_frame->bufs[0] == NULL ) { 671e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Error, Super buffer frame does not contain valid buffer", 672e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang __func__); 673e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 674e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 675e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 676e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx; 677e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(frameIndex >= mNumBufs) { 678e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: Error, Invalid index for buffer",__func__); 679e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if(stream) { 680e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang stream->bufDone(frameIndex); 681e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 682e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return; 683e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 684e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 685e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ////Use below data to issue framework callback 686e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang resultBuffer = mCamera3Buffers[frameIndex]; 687e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang resultFrameNumber = mMemory->getFrameNumber(frameIndex); 688e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 689e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.stream = mCamera3Stream; 690e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.buffer = resultBuffer; 691e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.status = CAMERA3_BUFFER_STATUS_OK; 692e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.acquire_fence = -1; 693e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang result.release_fence = -1; 694e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 695e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mChannelCB(NULL, &result, resultFrameNumber, mUserData); 6967ee407aa1024789089aad411c372c79423699976Ajay Dudani free(super_frame); 697625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 698625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 699625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 700b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen WangQCamera3Memory* QCamera3RegularChannel::getStreamBufs(uint32_t /*len*/) 7019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 702e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (mNumBufs == 0 || mCamera3Buffers == NULL) { 703e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: buffers not registered yet", __func__); 704e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NULL; 705e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 706e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 7079de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory = new QCamera3GrallocMemory(); 7089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (mMemory == NULL) { 7099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return NULL; 7109de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7119de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 712e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (mMemory->registerBuffers(mNumBufs, mCamera3Buffers) < 0) { 7139de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMemory; 7149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory = NULL; 7159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return NULL; 7169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return mMemory; 7189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 7199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7209de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangvoid QCamera3RegularChannel::putStreamBufs() 7219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 7229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory->unregisterBuffers(); 7239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMemory; 7249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory = NULL; 7259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 7269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 727f060ebe7f00ea62a029df01482e32b1d57c3efe6Mansoor Aftabint QCamera3RegularChannel::kMaxBuffers = 7; 728625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 729625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3MetadataChannel::QCamera3MetadataChannel(uint32_t cam_handle, 730625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_ops_t *cam_ops, 731e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang channel_cb_routine cb_routine, 732e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang cam_padding_info_t *paddingInfo, 733e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang void *userData) : 734e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang QCamera3Channel(cam_handle, cam_ops, 735e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang cb_routine, paddingInfo, userData), 736e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang mMemory(NULL) 737625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 738625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 739625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 740625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3MetadataChannel::~QCamera3MetadataChannel() 741625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 742e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (m_bIsActive) 7439de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang stop(); 7449de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7459de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (mMemory) { 7469de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory->deallocate(); 7479de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMemory; 7489de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory = NULL; 7499de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 750625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 751625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 752625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3MetadataChannel::initialize() 753625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 7549de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int32_t rc; 7559de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang cam_dimension_t streamDim; 7569de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 7579de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (mMemory || m_numStreams > 0) { 7589de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: metadata channel already initialized", __func__); 7599de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return -EINVAL; 7609de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7619de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 762e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = init(NULL, NULL); 763e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (rc < 0) { 764e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: init failed", __func__); 765e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return rc; 766e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 767e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang 76833cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang streamDim.width = sizeof(metadata_buffer_t), 7699de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang streamDim.height = 1; 7709de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang rc = QCamera3Channel::addStream(CAM_STREAM_TYPE_METADATA, CAM_FORMAT_MAX, 771e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang streamDim, MIN_STREAMING_BUFFER_NUM); 7729de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 7739de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: addStream failed", __func__); 7749de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 7759de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return rc; 776625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 777625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 778b66f295ef24aea24873bcf80cee589835338e2a1Shuzhen Wangint32_t QCamera3MetadataChannel::request(buffer_handle_t * /*buffer*/, 779c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t /*frameNumber*/) 780625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 781e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang if (!m_bIsActive) { 7829de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return start(); 783e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 7849de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang else 7859de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return 0; 786625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 787625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 788e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wangint32_t QCamera3MetadataChannel::registerBuffers(uint32_t /*num_buffers*/, 789e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang buffer_handle_t ** /*buffers*/) 790625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 7919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang // no registerBuffers are supported for metadata channel 792625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return -EINVAL; 793625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 794625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 7959de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangvoid QCamera3MetadataChannel::streamCbRoutine( 7969de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mm_camera_super_buf_t *super_frame, 797c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang QCamera3Stream * /*stream*/) 798625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 799e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang uint32_t requestNumber = 0; 8009de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (super_frame == NULL || super_frame->num_bufs != 1) { 8019de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: super_frame is not valid", __func__); 8029de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return; 8039de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 8041c6fa865f97afe06b8b9d9520390a37dd86f55e1Tanmaya Godbole mChannelCB(super_frame, NULL, requestNumber, mUserData); 8059de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 8069de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 807e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen WangQCamera3Memory* QCamera3MetadataChannel::getStreamBufs(uint32_t len) 8089de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 8099de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc; 810744f5403bebb0e27140d16a5df7a341713c24a13Nagesh Subba Reddy if (len < sizeof(metadata_buffer_t)) { 811e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang ALOGE("%s: size doesn't match %d vs %d", __func__, 81233cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang len, sizeof(metadata_buffer_t)); 813e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang return NULL; 814e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang } 8159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory = new QCamera3HeapMemory(); 8169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (!mMemory) { 8179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: unable to create metadata memory", __func__); 8189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return NULL; 8199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 820e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang rc = mMemory->allocate(MIN_STREAMING_BUFFER_NUM, len, true); 8219de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 8229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: unable to allocate metadata memory", __func__); 8239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMemory; 8249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory = NULL; 8259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return NULL; 8269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 82733cb7276f6c4d2eda72253d11cd9242e1f82bf7dShuzhen Wang memset(mMemory->getPtr(0), 0, sizeof(metadata_buffer_t)); 8289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return mMemory; 8299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 8309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 8319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangvoid QCamera3MetadataChannel::putStreamBufs() 8329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 8339de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory->deallocate(); 8349de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mMemory; 8359de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mMemory = NULL; 836625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 837625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 83866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 83966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : jpegEvtHandle 84066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 84166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: Function registerd to mm-jpeg-interface to handle jpeg events. 84266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru Construct result payload and call mChannelCb to deliver buffer 84366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru to framework. 84466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 84566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 84666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @status : status of jpeg job 84766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @client_hdl: jpeg client handle 84866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @jobId : jpeg job Id 84966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @p_ouput : ptr to jpeg output result struct 85066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @userdata : user data ptr 85166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 85266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : none 85366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 85466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid QCamera3PicChannel::jpegEvtHandle(jpeg_job_status_t status, 85566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t /*client_hdl*/, 85666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t jobId, 85766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mm_jpeg_output_t *p_output, 85866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru void *userdata) 85966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 86066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru buffer_handle_t *resultBuffer; 86166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t resultFrameNumber; 86266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int resultStatus = CAMERA3_BUFFER_STATUS_OK; 86366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru camera3_stream_buffer_t result; 86466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru camera3_jpeg_blob_t jpegHeader; 86566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char* jpeg_eof = 0; 8660a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab int maxJpegSize; 86766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3PicChannel *obj = (QCamera3PicChannel *)userdata; 86866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (obj) { 86941da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab 87041da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab //Release any cached metabuffer information 87141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab if (obj->mMetaFrame != NULL && obj->m_pMetaChannel != NULL) { 87241da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab ((QCamera3MetadataChannel*)(obj->m_pMetaChannel))->bufDone(obj->mMetaFrame); 87341da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab obj->mMetaFrame = NULL; 87441da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab obj->m_pMetaChannel = NULL; 87541da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab } else { 87641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab ALOGE("%s: Meta frame was NULL", __func__); 87741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab } 87866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Construct payload for process_capture_result. Call mChannelCb 87966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 88066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru qcamera_jpeg_data_t *job = obj->m_postprocessor.findJpegJobByJobId(jobId); 88166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 88266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if ((job == NULL) || (status == JPEG_JOB_STATUS_ERROR)) { 88366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Error in jobId: (%d) with status: %d", __func__, jobId, status); 88466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru resultStatus = CAMERA3_BUFFER_STATUS_ERROR; 88566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 88666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 88766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Construct jpeg transient header of type camera3_jpeg_blob_t 88866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Append at the end of jpeg image of buf_filled_len size 88966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 89066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpegHeader.jpeg_blob_id = CAMERA3_JPEG_BLOB_ID; 89166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru jpegHeader.jpeg_size = p_output->buf_filled_len; 89266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 89366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 89466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char* jpeg_buf = (char *)p_output->buf_vaddr; 89566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 8960a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab if(obj->mJpegSettings->max_jpeg_size <= 0 || 8970a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab obj->mJpegSettings->max_jpeg_size > obj->mMemory->getSize(obj->mCurrentBufIndex)){ 898742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGW("%s:Max Jpeg size :%d is out of valid range setting to size of buffer", 8990a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab __func__, obj->mJpegSettings->max_jpeg_size); 9000a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab maxJpegSize = obj->mMemory->getSize(obj->mCurrentBufIndex); 9010a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } else { 9020a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab maxJpegSize = obj->mJpegSettings->max_jpeg_size; 903742f098783e5ecd6370dcf9ef7648e82f64181bbShuzhen Wang ALOGI("%s: Setting max jpeg size to %d",__func__, maxJpegSize); 9040a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab } 9050a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab jpeg_eof = &jpeg_buf[maxJpegSize-sizeof(jpegHeader)]; 90666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(jpeg_eof, &jpegHeader, sizeof(jpegHeader)); 9070a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab obj->mMemory->cleanInvalidateCache(obj->mCurrentBufIndex); 90866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 90966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ////Use below data to issue framework callback 910a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru resultBuffer = obj->mCamera3Buffers[obj->mCurrentBufIndex]; 911a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru resultFrameNumber = obj->mMemory->getFrameNumber(obj->mCurrentBufIndex); 91266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 91366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru result.stream = obj->mCamera3Stream; 91466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru result.buffer = resultBuffer; 91566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru result.status = resultStatus; 91666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru result.acquire_fence = -1; 91766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru result.release_fence = -1; 91866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 919c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGV("%s: Issue Callback", __func__); 92066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru obj->mChannelCB(NULL, &result, resultFrameNumber, obj->mUserData); 92166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 92266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // release internal data for jpeg job 92366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (job != NULL) { 92466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru obj->m_postprocessor.releaseJpegJobData(job); 92566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru free(job); 92666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 92766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return; 92866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // } 92966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 93066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Null userdata in jpeg callback", __func__); 93166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 93266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 93366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 934625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3PicChannel::QCamera3PicChannel(uint32_t cam_handle, 935625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang mm_camera_ops_t *cam_ops, 936625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang channel_cb_routine cb_routine, 937e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang cam_padding_info_t *paddingInfo, 938e6ab32d89cf169705236988f0f74309f914c88b7Shuzhen Wang void *userData, 939625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang camera3_stream_t *stream) : 940f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab QCamera3Channel(cam_handle, cam_ops, cb_routine, 941f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab paddingInfo, userData), 942c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan m_postprocessor(this), 94366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mCamera3Stream(stream), 944d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mNumBufs(0), 94566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mCamera3Buffers(NULL), 946d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mJpegSettings(NULL), 947d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang mCurrentBufIndex(-1), 94866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mMemory(NULL), 94941da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mYuvMemory(NULL), 95041da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mMetaFrame(NULL) 951625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 952f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab int32_t rc = m_postprocessor.init(jpegEvtHandle, this); 953f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (rc != 0) { 954f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("Init Postprocessor failed"); 955f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 956625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 957625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 958625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen WangQCamera3PicChannel::~QCamera3PicChannel() 959625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 960f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab int32_t rc = m_postprocessor.deinit(); 961f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (rc != 0) { 962f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("De-init Postprocessor failed"); 963f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 96466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (mCamera3Buffers) { 96566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru delete[] mCamera3Buffers; 96666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 967625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 968625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 96966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t QCamera3PicChannel::initialize() 970625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 971f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab int32_t rc = NO_ERROR; 972f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab cam_dimension_t streamDim; 973f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab cam_stream_type_t streamType; 974f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab cam_format_t streamFormat; 975f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mm_camera_channel_attr_t attr; 976f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 977f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 978f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST; 979f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab attr.look_back = 1; 980f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab attr.post_frame_skip = 1; 981f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab attr.water_mark = 1; 982f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab attr.max_unmatched_frames = 1; 983f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 984c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang rc = init(&attr, NULL); 985f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (rc < 0) { 986f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: init failed", __func__); 987f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return rc; 98866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 989f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 990025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy streamType = CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT; 991f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab streamFormat = CAM_FORMAT_YUV_420_NV21; 992f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab streamDim.width = mCamera3Stream->width; 993f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab streamDim.height = mCamera3Stream->height; 9940a686661965fcbbfabf2d5e3c2768c9582828226Mansoor Aftab 995221ef4d6a8613c5ffa33b5a7a8c36a4acb8605aeShuzhen Wang int num_buffers = 1; 996f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 997f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab rc = QCamera3Channel::addStream(streamType, streamFormat, streamDim, 998f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab num_buffers); 999f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 100066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 100166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 100266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1003c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wangint32_t QCamera3PicChannel::request(buffer_handle_t *buffer, 1004c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang uint32_t frameNumber, jpeg_settings_t* jpegSettings, 1005c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mm_camera_buf_def_t *pInputBuffer,QCamera3Channel* pInputChannel) 100666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 100766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //FIX ME: Return buffer back in case of failures below. 100866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 100966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t rc = NO_ERROR; 101066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int index; 101166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mJpegSettings = jpegSettings; 1012ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab // Picture stream has already been started before any request comes in 1013ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab if (!m_bIsActive) { 1014ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab ALOGE("%s: Picture stream should have been started before any request", 1015ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab __func__); 1016ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab return -EINVAL; 101766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 1018ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab if (pInputBuffer == NULL) 1019ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab mStreams[0]->bufDone(0); 102066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 102166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(!mMemory) { 1022c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(pInputBuffer) { 1023c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mMemory = new QCamera3GrallocMemory(); 1024c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (mMemory == NULL) { 1025c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return NO_MEMORY; 1026c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1027c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang 1028c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang //Registering Jpeg output buffer 1029c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if (mMemory->registerBuffers(mNumBufs, mCamera3Buffers) < 0) { 1030c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang delete mMemory; 1031c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mMemory = NULL; 1032c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return NO_MEMORY; 1033c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 1034c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } else { 1035c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGE("%s: error, Gralloc Memory object not yet created for this stream",__func__); 1036c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang return NO_MEMORY; 1037c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 103866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 103966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 104066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru index = mMemory->getMatchBufIndex((void*)buffer); 104166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(index < 0) { 104266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Could not find object among registered buffers",__func__); 104366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return DEAD_OBJECT; 104466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 104566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = mMemory->markFrameNumber(index, frameNumber); 104666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 104766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Start the postprocessor for jpeg encoding. Pass mMemory as destination buffer 1048a4f99c05471ae7d2b57f20b1178e0a8597596fb0Apurva Rajguru mCurrentBufIndex = index; 10497ee407aa1024789089aad411c372c79423699976Ajay Dudani 1050c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(pInputBuffer) { 1051d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_postprocessor.start(mMemory, index, pInputChannel); 1052d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab ALOGD("%s: Post-process started", __func__); 1053c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang ALOGD("%s: Issue call to reprocess", __func__); 1054c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang m_postprocessor.processAuxiliaryData(pInputBuffer,pInputChannel); 1055d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab } else { 1056d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab m_postprocessor.start(mMemory, index, this); 1057f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 105866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 1059625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1060625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1061f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab/*=========================================================================== 1062f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * FUNCTION : dataNotifyCB 1063f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * 1064f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * DESCRIPTION: Channel Level callback used for super buffer data notify. 1065f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * This function is registered with mm-camera-interface to handle 1066f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * data notify 1067f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * 1068f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * PARAMETERS : 1069f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * @recvd_frame : stream frame received 1070f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * userdata : user data ptr 1071f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * 1072f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab * RETURN : none 1073f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab *==========================================================================*/ 1074f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftabvoid QCamera3PicChannel::dataNotifyCB(mm_camera_super_buf_t *recvd_frame, 1075f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab void *userdata) 1076f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab{ 1077d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E\n", __func__); 1078f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab QCamera3PicChannel *channel = (QCamera3PicChannel *)userdata; 1079f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1080f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (channel == NULL) { 1081f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: invalid channel pointer", __func__); 1082f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return; 1083f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 1084f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1085f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if(channel->m_numStreams != 1) { 1086f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Error: Bug: This callback assumes one stream per channel",__func__); 1087f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return; 1088f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 1089f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1090f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1091f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if(channel->mStreams[0] == NULL) { 1092f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab ALOGE("%s: Error: Invalid Stream object",__func__); 1093f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return; 1094f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 1095f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1096f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab channel->QCamera3PicChannel::streamCbRoutine(recvd_frame, channel->mStreams[0]); 1097f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1098d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X\n", __func__); 1099f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return; 1100f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab} 1101f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1102f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1103625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangint32_t QCamera3PicChannel::registerBuffers(uint32_t num_buffers, 1104625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang buffer_handle_t **buffers) 1105625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 110666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int rc = 0; 110766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_stream_type_t streamType; 110866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru cam_format_t streamFormat; 110966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1110d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: E",__func__); 111165585b2d14faf1e7fa78560f8c9cd27d76c408abMansoor Aftab rc = QCamera3PicChannel::initialize(); 111265585b2d14faf1e7fa78560f8c9cd27d76c408abMansoor Aftab if (rc < 0) { 111365585b2d14faf1e7fa78560f8c9cd27d76c408abMansoor Aftab ALOGE("%s: init failed", __func__); 111465585b2d14faf1e7fa78560f8c9cd27d76c408abMansoor Aftab return rc; 111565585b2d14faf1e7fa78560f8c9cd27d76c408abMansoor Aftab } 111665585b2d14faf1e7fa78560f8c9cd27d76c408abMansoor Aftab 111766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (mCamera3Stream->format == HAL_PIXEL_FORMAT_BLOB) { 1118025ab8ca7a6d9228b3c8cc04a4f1741defe526edNagesh Subba Reddy streamType = CAM_STREAM_TYPE_NON_ZSL_SNAPSHOT; 111966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru streamFormat = CAM_FORMAT_YUV_420_NV21; 112066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 112166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //TODO: Fail for other types of streams for now 112266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: format is not BLOB", __func__); 112366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return -EINVAL; 112466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 112566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru /* Bookkeep buffer set because they go out of scope after register call */ 112666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mNumBufs = num_buffers; 112766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mCamera3Buffers = new buffer_handle_t*[num_buffers]; 112866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (mCamera3Buffers == NULL) { 112966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Failed to allocate buffer_handle_t*", __func__); 113066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return -ENOMEM; 113166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 113266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru for (size_t i = 0; i < num_buffers; i++) 113366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mCamera3Buffers[i] = buffers[i]; 113466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1135d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGV("%s: X",__func__); 113666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rc; 1137625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1138625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 1139625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wangvoid QCamera3PicChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame, 1140625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang QCamera3Stream *stream) 1141625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang{ 1142625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang //TODO 1143d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang //Used only for getting YUV. Jpeg callback will be sent back from channel 1144d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang //directly to HWI. Refer to func jpegEvtHandle 114566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 114666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Got the yuv callback. Calling yuv callback handler in PostProc 114766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint8_t frameIndex; 1148f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab mm_camera_super_buf_t* frame = NULL; 114966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(!super_frame) { 115066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Invalid Super buffer",__func__); 115166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return; 115266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 115366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 115466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(super_frame->num_bufs != 1) { 115566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Multiple streams are not supported",__func__); 115666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return; 115766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 115866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(super_frame->bufs[0] == NULL ) { 115966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Error, Super buffer frame does not contain valid buffer", 116066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru __func__); 116166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return; 116266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 116366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 116466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx; 116566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(frameIndex >= mNumBufs) { 116666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: Error, Invalid index for buffer",__func__); 116766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(stream) { 116866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru stream->bufDone(frameIndex); 116966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 117066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return; 117166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 117266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1173f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 1174f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if (frame == NULL) { 1175d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang ALOGE("%s: Error allocating memory to save received_frame structure.", 1176d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang __func__); 1177f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab if(stream) { 1178f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab stream->bufDone(frameIndex); 1179f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 1180f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab return; 1181f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab } 1182f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab *frame = *super_frame; 1183f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab 1184f2fc1625456303cb52ec068d25308229e4322d4cMansoor Aftab m_postprocessor.processData(frame); 11857ee407aa1024789089aad411c372c79423699976Ajay Dudani free(super_frame); 1186625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang return; 1187625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang} 1188625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang 11899de643761e1282fb5af14a9249618efa9d8ac8feShuzhen WangQCamera3Memory* QCamera3PicChannel::getStreamBufs(uint32_t len) 11909de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 11919de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang int rc = 0; 119266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 119366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (mNumBufs == 0 || mCamera3Buffers == NULL) { 119466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: buffers not registered yet", __func__); 119566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NULL; 119666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 119766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1198c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang if(mMemory) { 1199c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang delete mMemory; 1200c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang mMemory = NULL; 1201c8d1059ae679132e7654708fdfca6ee221775187Shuzhen Wang } 120266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mMemory = new QCamera3GrallocMemory(); 120366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (mMemory == NULL) { 120466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NULL; 120566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 120666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 120766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Registering Jpeg output buffer 120866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (mMemory->registerBuffers(mNumBufs, mCamera3Buffers) < 0) { 120966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru delete mMemory; 121066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mMemory = NULL; 121166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NULL; 121266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 121366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 12149de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mYuvMemory = new QCamera3HeapMemory(); 12159de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (!mYuvMemory) { 12169de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: unable to create metadata memory", __func__); 12179de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return NULL; 12189de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 12199de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 122066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Queue YUV buffers in the beginning mQueueAll = true 1221ca0c6f9e32946a98ee2534ef14928192fb1a453eMansoor Aftab rc = mYuvMemory->allocate(1, len, false); 12229de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang if (rc < 0) { 12239de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang ALOGE("%s: unable to allocate metadata memory", __func__); 12249de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mYuvMemory; 12259de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mYuvMemory = NULL; 12269de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return NULL; 12279de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang } 12289de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang return mYuvMemory; 12299de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 12309de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 12319de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wangvoid QCamera3PicChannel::putStreamBufs() 12329de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang{ 123366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mMemory->unregisterBuffers(); 123466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru delete mMemory; 123566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru mMemory = NULL; 123666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 12379de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mYuvMemory->deallocate(); 12389de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang delete mYuvMemory; 12399de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang mYuvMemory = NULL; 12409de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang} 12419de643761e1282fb5af14a9249618efa9d8ac8feShuzhen Wang 12427ee407aa1024789089aad411c372c79423699976Ajay Dudanibool QCamera3PicChannel::isRawSnapshot() 12437ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 12447ee407aa1024789089aad411c372c79423699976Ajay Dudani return !(mJpegSettings->is_jpeg_format); 12457ee407aa1024789089aad411c372c79423699976Ajay Dudani} 124666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 124766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getThumbnailSize 124866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 124966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get user set thumbnail size 125066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 125166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 125266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @dim : output of thumbnail dimension 125366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 125466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : none 125566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 125666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruvoid QCamera3PicChannel::getThumbnailSize(cam_dimension_t &dim) 125766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 125866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru dim = mJpegSettings->thumbnail_size; 125966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 126066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 126166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 126266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getJpegQuality 126366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 126466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get user set jpeg quality 126566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 126666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : none 126766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 126866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : jpeg quality setting 126966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 127066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint QCamera3PicChannel::getJpegQuality() 127166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 127266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int quality = mJpegSettings->jpeg_quality; 127366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (quality < 0) { 127466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru quality = 85; //set to default quality value 127566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 127666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return quality; 127766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 127866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 127966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 128066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getJpegRotation 128166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 128266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get rotation information to be passed into jpeg encoding 128366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 128466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : none 128566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 128666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : rotation information 128766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 128866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint QCamera3PicChannel::getJpegRotation() { 128966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int rotation = mJpegSettings->jpeg_orientation; 129066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rotation < 0) { 129166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rotation = 0; 129266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 129366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return rotation; 129466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 129566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 129641da374a8252b52dbf5f430602859095710b3cdeMansoor Aftabvoid QCamera3PicChannel::queueMetadata(mm_camera_super_buf_t *metadata_buf, 129741da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab QCamera3Channel *pMetaChannel, 129841da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab bool relinquish) 12997ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 130041da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab if(relinquish) 130141da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab mMetaFrame = metadata_buf; 130241da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab m_pMetaChannel = pMetaChannel; 13037ee407aa1024789089aad411c372c79423699976Ajay Dudani m_postprocessor.processPPMetadata(metadata_buf); 13047ee407aa1024789089aad411c372c79423699976Ajay Dudani} 130566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 130666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getRational 130766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 130866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: compose rational struct 130966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 131066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 131166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @rat : ptr to struct to store rational info 131266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @num :num of the rational 131366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @denom : denom of the rational 131466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 131566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 131666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 131766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 131866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 131966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getRational(rat_t *rat, int num, int denom) 132066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 132166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (NULL == rat) { 132266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: NULL rat input", __func__); 132366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 132466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 132566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rat->num = num; 132666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rat->denom = denom; 132766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 132866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 132966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 133066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 133166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : parseGPSCoordinate 133266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 133366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: parse GPS coordinate string 133466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 133566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 133666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @coord_str : [input] coordinate string 133766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @coord : [output] ptr to struct to store coordinate 133866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 133966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 134066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 134166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 134266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 134366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint parseGPSCoordinate(const char *coord_str, rat_t* coord) 134466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 134566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(coord == NULL) { 134666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: error, invalid argument coord == NULL", __func__); 134766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 134866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 134966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru float degF = atof(coord_str); 135066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (degF < 0) { 135166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru degF = -degF; 135266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 135366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru float minF = (degF - (int) degF) * 60; 135466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru float secF = (minF - (int) minF) * 60; 135566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 135666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru getRational(&coord[0], (int)degF, 1); 135766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru getRational(&coord[1], (int)minF, 1); 135866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru getRational(&coord[2], (int)(secF * 10000), 10000); 135966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 136066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 136166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 136266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 136366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifDateTime 136466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 136566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: query exif date time 136666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 136766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 136866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @dateTime : string to store exif date time 136966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @count : lenght of the dateTime string 137066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 137166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 137266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 137366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 137466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 137566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getExifDateTime(char *dateTime, uint32_t &count) 137666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 137766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //get time and date from system 137866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru time_t rawtime; 137966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru struct tm * timeinfo; 138066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru time(&rawtime); 138166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru timeinfo = localtime (&rawtime); 138266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //Write datetime according to EXIF Spec 138366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //"YYYY:MM:DD HH:MM:SS" (20 chars including \0) 138466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru snprintf(dateTime, 20, "%04d:%02d:%02d %02d:%02d:%02d", 138566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, 138666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru timeinfo->tm_mday, timeinfo->tm_hour, 138766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru timeinfo->tm_min, timeinfo->tm_sec); 138866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru count = 20; 138966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 139066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 139166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 139266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 139366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 139466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifFocalLength 139566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 139666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get exif focal lenght 139766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 139866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 139966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @focalLength : ptr to rational strcut to store focal lenght 140066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 140166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 140266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 140366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 140466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 140566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getExifFocalLength(rat_t *focalLength, float value) 140666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 140766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int focalLengthValue = 140866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (int)(value * FOCAL_LENGTH_DECIMAL_PRECISION); 140966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return getRational(focalLength, focalLengthValue, FOCAL_LENGTH_DECIMAL_PRECISION); 141066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 141166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 141266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 14130b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * FUNCTION : getExifExpTimeInfo 14140b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * 14150b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * DESCRIPTION: get exif exposure time information 14160b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * 14170b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * PARAMETERS : 14180b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * @expoTimeInfo : expousure time value 14190b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * RETURN : nt32_t type of status 14200b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * NO_ERROR -- success 14210b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi * none-zero failure code 14220b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi *==========================================================================*/ 14230b29a823918d0d5f60fc1cb00b143477b3adba91insup.choiint32_t getExifExpTimeInfo(rat_t *expoTimeInfo, int64_t value) 14240b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi{ 14250b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 14260b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi int cal_exposureTime; 14270b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi if (value != 0) 14280b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi cal_exposureTime = value; 14290b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi else 14300b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi cal_exposureTime = 60; 14310b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 14320b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi return getRational(expoTimeInfo, 1, cal_exposureTime); 14330b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi} 14340b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 14350b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi/*=========================================================================== 143666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifGpsProcessingMethod 143766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 143866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get GPS processing method 143966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 144066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 144166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @gpsProcessingMethod : string to store GPS process method 144266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @count : lenght of the string 144366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 144466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 144566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 144666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 144766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 144866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getExifGpsProcessingMethod(char *gpsProcessingMethod, 14499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang uint32_t &count, char* value) 145066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 14519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if(value != NULL) { 145266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memcpy(gpsProcessingMethod, ExifAsciiPrefix, EXIF_ASCII_PREFIX_SIZE); 145366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru count = EXIF_ASCII_PREFIX_SIZE; 14549a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang strncpy(gpsProcessingMethod + EXIF_ASCII_PREFIX_SIZE, value, strlen(value)); 14559a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang count += strlen(value); 145666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru gpsProcessingMethod[count++] = '\0'; // increase 1 for the last NULL char 145766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 145866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 145966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 146066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 146166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 146266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 146366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 146466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifLatitude 146566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 146666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get exif latitude 146766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 146866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 146966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @latitude : ptr to rational struct to store latitude info 147066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @ladRef : charater to indicate latitude reference 147166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 147266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 147366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 147466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 147566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 147666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getExifLatitude(rat_t *latitude, 147766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char *latRef, double value) 147866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 147966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char str[30]; 148066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru snprintf(str, sizeof(str), "%f", value); 148166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(str != NULL) { 148266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru parseGPSCoordinate(str, latitude); 148366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 148466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //set Latitude Ref 148566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru float latitudeValue = strtof(str, 0); 148666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(latitudeValue < 0.0f) { 148766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru latRef[0] = 'S'; 148866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 148966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru latRef[0] = 'N'; 149066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 149166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru latRef[1] = '\0'; 149266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 149366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru }else{ 149466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 149566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 149666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 149766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 149866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 149966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifLongitude 150066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 150166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get exif longitude 150266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 150366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 150466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @longitude : ptr to rational struct to store longitude info 150566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @lonRef : charater to indicate longitude reference 150666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 150766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 150866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 150966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 151066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 151166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getExifLongitude(rat_t *longitude, 151266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char *lonRef, double value) 151366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 151466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char str[30]; 151566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru snprintf(str, sizeof(str), "%f", value); 151666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(str != NULL) { 151766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru parseGPSCoordinate(str, longitude); 151866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 151966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru //set Longitude Ref 152066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru float longitudeValue = strtof(str, 0); 152166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(longitudeValue < 0.0f) { 152266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru lonRef[0] = 'W'; 152366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 152466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru lonRef[0] = 'E'; 152566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 152666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru lonRef[1] = '\0'; 152766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 152866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru }else{ 152966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 153066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 153166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 153266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 153366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 153466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifAltitude 153566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 153666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get exif altitude 153766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 153866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 153966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @altitude : ptr to rational struct to store altitude info 154066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @altRef : charater to indicate altitude reference 154166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 154266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 154366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 154466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 154566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 154666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getExifAltitude(rat_t *altitude, 154766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char *altRef, double value) 154866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 154966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char str[30]; 155066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru snprintf(str, sizeof(str), "%f", value); 155166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(str != NULL) { 155266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru double value = atof(str); 155366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *altRef = 0; 155466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(value < 0){ 155566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *altRef = 1; 155666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru value = -value; 155766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 155866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return getRational(altitude, value*1000, 1000); 155966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru }else{ 156066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 156166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 156266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 156366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 156466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 156566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifGpsDateTimeStamp 156666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 156766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get exif GPS date time stamp 156866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 156966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : 157066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @gpsDateStamp : GPS date time stamp string 157166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @bufLen : length of the string 157266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * @gpsTimeStamp : ptr to rational struct to store time stamp info 157366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 157466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : int32_t type of status 157566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * NO_ERROR -- success 157666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * none-zero failure code 157766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 157866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguruint32_t getExifGpsDateTimeStamp(char *gpsDateStamp, 1579d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang uint32_t bufLen, 1580d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang rat_t *gpsTimeStamp, int64_t value) 158166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 158266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char str[30]; 1583d5d5a90863708ac1cdbef25c41853b6f6f05d4e2Shuzhen Wang snprintf(str, sizeof(str), "%lld", value); 158466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(str != NULL) { 158566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru time_t unixTime = (time_t)atol(str); 158666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru struct tm *UTCTimestamp = gmtime(&unixTime); 158766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 158866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru strftime(gpsDateStamp, bufLen, "%Y:%m:%d", UTCTimestamp); 158966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 159066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru getRational(&gpsTimeStamp[0], UTCTimestamp->tm_hour, 1); 159166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru getRational(&gpsTimeStamp[1], UTCTimestamp->tm_min, 1); 159266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru getRational(&gpsTimeStamp[2], UTCTimestamp->tm_sec, 1); 159366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 159466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NO_ERROR; 159566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 159666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return BAD_VALUE; 159766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 159866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 159953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 160053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftabint32_t getExifExposureValue(srat_t* exposure_val, int32_t exposure_comp, 160153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab cam_rational_type_t step) 160253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab{ 160353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab exposure_val->num = exposure_comp * step.numerator; 160453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab exposure_val->denom = step.denominator; 160553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab return 0; 160653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab} 160766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru/*=========================================================================== 160866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * FUNCTION : getExifData 160966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 161066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * DESCRIPTION: get exif data to be passed into jpeg encoding 161166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 161266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * PARAMETERS : none 161366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * 161466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru * RETURN : exif data from user setting and GPS 161566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru *==========================================================================*/ 161666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva RajguruQCamera3Exif *QCamera3PicChannel::getExifData() 161766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru{ 161866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru QCamera3Exif *exif = new QCamera3Exif(); 161966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (exif == NULL) { 162066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: No memory for QCamera3Exif", __func__); 162166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return NULL; 162266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 162366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 162466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru int32_t rc = NO_ERROR; 162566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru uint32_t count = 0; 162666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 162766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru // add exif entries 162866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru char dateTime[20]; 162966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru memset(dateTime, 0, sizeof(dateTime)); 163066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru count = 20; 163166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getExifDateTime(dateTime, count); 163266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if(rc == NO_ERROR) { 163366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru exif->addEntry(EXIFTAGID_EXIF_DATE_TIME_ORIGINAL, 163466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru EXIF_ASCII, 163566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru count, 163666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (void *)dateTime); 1637513aa7f18cb506cca3c94a5911bf6e5cf822a3a1Eino-Ville Talvala exif->addEntry(EXIFTAGID_EXIF_DATE_TIME_DIGITIZED, 1638513aa7f18cb506cca3c94a5911bf6e5cf822a3a1Eino-Ville Talvala EXIF_ASCII, 1639513aa7f18cb506cca3c94a5911bf6e5cf822a3a1Eino-Ville Talvala count, 1640513aa7f18cb506cca3c94a5911bf6e5cf822a3a1Eino-Ville Talvala (void *)dateTime); 164166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 164266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: getExifDateTime failed", __func__); 164366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 164466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 164566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rat_t focalLength; 164666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru rc = getExifFocalLength(&focalLength, mJpegSettings->lens_focal_length); 164766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru if (rc == NO_ERROR) { 164866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru exif->addEntry(EXIFTAGID_FOCAL_LENGTH, 164966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru EXIF_RATIONAL, 165066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1, 165166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (void *)&(focalLength)); 165266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } else { 165366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru ALOGE("%s: getExifFocalLength failed", __func__); 165466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 165566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 16563fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang uint16_t isoSpeed = (uint16_t)mJpegSettings->sensor_sensitivity; 165766cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru exif->addEntry(EXIFTAGID_ISO_SPEED_RATING, 165866cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru EXIF_SHORT, 165966cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 1, 166066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru (void *)&(isoSpeed)); 16613fa5d84cc454e0a301fe868d2a9aec3bf631f35cShuzhen Wang 16620b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi rat_t sensorExpTime ; 16630b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi rc = getExifExpTimeInfo(&sensorExpTime, (int64_t)mJpegSettings->sensor_exposure_time); 16640b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi if (rc == NO_ERROR){ 16650b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi exif->addEntry(EXIFTAGID_EXPOSURE_TIME, 16660b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi EXIF_RATIONAL, 16670b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi 1, 16680b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi (void *)&(sensorExpTime)); 16690b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi } else { 1670c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang ALOGE("%s: getExifExpTimeInfo failed", __func__); 16710b29a823918d0d5f60fc1cb00b143477b3adba91insup.choi } 167266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 16739a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (strlen(mJpegSettings->gps_processing_method) > 0) { 16749a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang char gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE]; 16759a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang count = 0; 16769a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rc = getExifGpsProcessingMethod(gpsProcessingMethod, count, mJpegSettings->gps_processing_method); 16779a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if(rc == NO_ERROR) { 16789a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_PROCESSINGMETHOD, 16799a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_ASCII, 16809a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang count, 16819a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)gpsProcessingMethod); 16829a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 16839a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ALOGE("%s: getExifGpsProcessingMethod failed", __func__); 16849a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 168566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 168666cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 16879a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates[0]) { 16889a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rat_t latitude[3]; 16899a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang char latRef[2]; 16909a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rc = getExifLatitude(latitude, latRef, *(mJpegSettings->gps_coordinates[0])); 16919a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if(rc == NO_ERROR) { 16929a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_LATITUDE, 16939a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_RATIONAL, 16949a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 3, 16959a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)latitude); 16969a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_LATITUDE_REF, 16979a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_ASCII, 16989a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 2, 16999a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)latRef); 17009a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 17019a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ALOGE("%s: getExifLatitude failed", __func__); 17029a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 170366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 170466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 17059a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates[1]) { 17069a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rat_t longitude[3]; 17079a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang char lonRef[2]; 17089a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rc = getExifLongitude(longitude, lonRef, *(mJpegSettings->gps_coordinates[1])); 17099a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if(rc == NO_ERROR) { 17109a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_LONGITUDE, 17119a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_RATIONAL, 17129a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 3, 17139a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)longitude); 17149a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 17159a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_LONGITUDE_REF, 17169a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_ASCII, 17179a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 2, 17189a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)lonRef); 17199a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 17209a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ALOGE("%s: getExifLongitude failed", __func__); 17219a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 172266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 172366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 17249a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_coordinates[2]) { 17259a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rat_t altitude; 17269a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang char altRef; 17279a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rc = getExifAltitude(&altitude, &altRef, *(mJpegSettings->gps_coordinates[2])); 17289a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if(rc == NO_ERROR) { 17299a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_ALTITUDE, 17309a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_RATIONAL, 17319a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 1, 17329a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)&(altitude)); 17339a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 17349a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_ALTITUDE_REF, 17359a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_BYTE, 17369a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 1, 17379a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)&altRef); 17389a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 17399a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ALOGE("%s: getExifAltitude failed", __func__); 17409a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 17419a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 174266cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 17439a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if (mJpegSettings->gps_timestamp) { 17449a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang char gpsDateStamp[20]; 17459a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rat_t gpsTimeStamp[3]; 17469a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang rc = getExifGpsDateTimeStamp(gpsDateStamp, 20, gpsTimeStamp, *(mJpegSettings->gps_timestamp)); 17479a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang if(rc == NO_ERROR) { 17489a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_DATESTAMP, 17499a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_ASCII, 17509a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang strlen(gpsDateStamp) + 1, 17519a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)gpsDateStamp); 17529a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 17539a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang exif->addEntry(EXIFTAGID_GPS_TIMESTAMP, 17549a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang EXIF_RATIONAL, 17559a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang 3, 17569a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang (void *)gpsTimeStamp); 17579a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } else { 17589a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang ALOGE("%s: getExifGpsDataTimeStamp failed", __func__); 17599a351c81529b36fd8b6978ca21a27bdc56a01355Shuzhen Wang } 176066cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru } 176166cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 176253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab srat_t exposure_val; 176353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab rc = getExifExposureValue(&exposure_val, mJpegSettings->exposure_compensation, 176453074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab mJpegSettings->exposure_comp_step); 176553074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab if(rc == NO_ERROR) { 176653074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab exif->addEntry(EXIFTAGID_EXPOSURE_BIAS_VALUE, 176753074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab EXIF_SRATIONAL, 176853074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 1, 176953074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab (void *)(&exposure_val)); 177053074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } else { 177153074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab ALOGE("%s: getExifExposureValue failed ", __func__); 177253074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab } 177353074dcacf200e7252b5d064733b09d027d378e4Mansoor Aftab 177488275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi char value[PROPERTY_VALUE_MAX]; 177588275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi if (property_get("ro.product.manufacturer", value, "QCOM-AA") > 0) { 177688275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi exif->addEntry(EXIFTAGID_MAKE, 177788275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi EXIF_ASCII, 177888275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi strlen(value) + 1, 177988275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi (void *)value); 178088275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi } else { 178188275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi ALOGE("%s: getExifMaker failed", __func__); 178288275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi } 178388275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi 178488275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi if (property_get("ro.product.model", value, "QCAM-AA") > 0) { 178588275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi exif->addEntry(EXIFTAGID_MODEL, 178688275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi EXIF_ASCII, 178788275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi strlen(value) + 1, 178888275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi (void *)value); 178988275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi } else { 179088275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi ALOGE("%s: getExifModel failed", __func__); 179188275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi } 179288275babe9ee86e0ec3d99c754f135fd69566d3dSungmin Choi 179366cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru return exif; 179466cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru} 179566cadfdce2ea19f4707bf2a595b58bd36fbfdf3bApurva Rajguru 179690d91b45cca7f6a41c192dc800ec1d39fc255435Zhijun Heint QCamera3PicChannel::kMaxBuffers = 2; 17977ee407aa1024789089aad411c372c79423699976Ajay Dudani 17987ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 17997ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : QCamera3ReprocessChannel 18007ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18017ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: constructor of QCamera3ReprocessChannel 18027ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18037ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 18047ee407aa1024789089aad411c372c79423699976Ajay Dudani * @cam_handle : camera handle 18057ee407aa1024789089aad411c372c79423699976Ajay Dudani * @cam_ops : ptr to camera ops table 18067ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pp_mask : post-proccess feature mask 18077ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18087ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : none 18097ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 18107ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel::QCamera3ReprocessChannel(uint32_t cam_handle, 18117ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_ops_t *cam_ops, 18127ee407aa1024789089aad411c372c79423699976Ajay Dudani channel_cb_routine cb_routine, 18137ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_padding_info_t *paddingInfo, 18147ee407aa1024789089aad411c372c79423699976Ajay Dudani void *userData, void *ch_hdl) : 18157ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Channel(cam_handle, cam_ops, cb_routine, paddingInfo, userData), 1816c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan picChHandle(ch_hdl), 18177ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pSrcChannel(NULL), 18187ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pMetaChannel(NULL), 1819c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan mMemory(NULL) 18207ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 18217ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(mSrcStreamHandles, 0, sizeof(mSrcStreamHandles)); 18227ee407aa1024789089aad411c372c79423699976Ajay Dudani} 18237ee407aa1024789089aad411c372c79423699976Ajay Dudani 18247ee407aa1024789089aad411c372c79423699976Ajay Dudani 18257ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 18267ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : QCamera3ReprocessChannel 18277ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18287ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: constructor of QCamera3ReprocessChannel 18297ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18307ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 18317ee407aa1024789089aad411c372c79423699976Ajay Dudani * @cam_handle : camera handle 18327ee407aa1024789089aad411c372c79423699976Ajay Dudani * @cam_ops : ptr to camera ops table 18337ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pp_mask : post-proccess feature mask 18347ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18357ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : none 18367ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 18377ee407aa1024789089aad411c372c79423699976Ajay Dudaniint32_t QCamera3ReprocessChannel::initialize() 18387ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 18397ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = NO_ERROR; 18407ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_channel_attr_t attr; 18417ee407aa1024789089aad411c372c79423699976Ajay Dudani 18427ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(&attr, 0, sizeof(mm_camera_channel_attr_t)); 18437ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS; 18447ee407aa1024789089aad411c372c79423699976Ajay Dudani attr.max_unmatched_frames = 1; 18457ee407aa1024789089aad411c372c79423699976Ajay Dudani 18467ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = init(&attr, NULL); 18477ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc < 0) { 18487ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: init failed", __func__); 18497ee407aa1024789089aad411c372c79423699976Ajay Dudani } 18507ee407aa1024789089aad411c372c79423699976Ajay Dudani return rc; 18517ee407aa1024789089aad411c372c79423699976Ajay Dudani} 18527ee407aa1024789089aad411c372c79423699976Ajay Dudani 18537ee407aa1024789089aad411c372c79423699976Ajay Dudani 18547ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 18557ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : QCamera3ReprocessChannel 18567ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18577ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: constructor of QCamera3ReprocessChannel 18587ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18597ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 18607ee407aa1024789089aad411c372c79423699976Ajay Dudani * @cam_handle : camera handle 18617ee407aa1024789089aad411c372c79423699976Ajay Dudani * @cam_ops : ptr to camera ops table 18627ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pp_mask : post-proccess feature mask 18637ee407aa1024789089aad411c372c79423699976Ajay Dudani * 18647ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : none 18657ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 18667ee407aa1024789089aad411c372c79423699976Ajay Dudanivoid QCamera3ReprocessChannel::streamCbRoutine(mm_camera_super_buf_t *super_frame, 18677ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Stream *stream) 18687ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 18697ee407aa1024789089aad411c372c79423699976Ajay Dudani //Got the pproc data callback. Now send to jpeg encoding 18707ee407aa1024789089aad411c372c79423699976Ajay Dudani uint8_t frameIndex; 18717ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_super_buf_t* frame = NULL; 18727ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3PicChannel *obj = (QCamera3PicChannel *)picChHandle; 18737ee407aa1024789089aad411c372c79423699976Ajay Dudani 18747ee407aa1024789089aad411c372c79423699976Ajay Dudani if(!super_frame) { 18757ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: Invalid Super buffer",__func__); 18767ee407aa1024789089aad411c372c79423699976Ajay Dudani return; 18777ee407aa1024789089aad411c372c79423699976Ajay Dudani } 18787ee407aa1024789089aad411c372c79423699976Ajay Dudani 18797ee407aa1024789089aad411c372c79423699976Ajay Dudani if(super_frame->num_bufs != 1) { 18807ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: Multiple streams are not supported",__func__); 18817ee407aa1024789089aad411c372c79423699976Ajay Dudani return; 18827ee407aa1024789089aad411c372c79423699976Ajay Dudani } 18837ee407aa1024789089aad411c372c79423699976Ajay Dudani if(super_frame->bufs[0] == NULL ) { 18847ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: Error, Super buffer frame does not contain valid buffer", 18857ee407aa1024789089aad411c372c79423699976Ajay Dudani __func__); 18867ee407aa1024789089aad411c372c79423699976Ajay Dudani return; 18877ee407aa1024789089aad411c372c79423699976Ajay Dudani } 18887ee407aa1024789089aad411c372c79423699976Ajay Dudani 18897ee407aa1024789089aad411c372c79423699976Ajay Dudani frameIndex = (uint8_t)super_frame->bufs[0]->buf_idx; 18907ee407aa1024789089aad411c372c79423699976Ajay Dudani frame = (mm_camera_super_buf_t *)malloc(sizeof(mm_camera_super_buf_t)); 18917ee407aa1024789089aad411c372c79423699976Ajay Dudani if (frame == NULL) { 18927ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: Error allocating memory to save received_frame structure.", 18937ee407aa1024789089aad411c372c79423699976Ajay Dudani __func__); 18947ee407aa1024789089aad411c372c79423699976Ajay Dudani if(stream) { 18957ee407aa1024789089aad411c372c79423699976Ajay Dudani stream->bufDone(frameIndex); 18967ee407aa1024789089aad411c372c79423699976Ajay Dudani } 18977ee407aa1024789089aad411c372c79423699976Ajay Dudani return; 18987ee407aa1024789089aad411c372c79423699976Ajay Dudani } 18997ee407aa1024789089aad411c372c79423699976Ajay Dudani *frame = *super_frame; 19007ee407aa1024789089aad411c372c79423699976Ajay Dudani obj->m_postprocessor.processPPData(frame); 19017ee407aa1024789089aad411c372c79423699976Ajay Dudani return; 19027ee407aa1024789089aad411c372c79423699976Ajay Dudani} 19037ee407aa1024789089aad411c372c79423699976Ajay Dudani 19047ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 19057ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : QCamera3ReprocessChannel 19067ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19077ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: default constructor of QCamera3ReprocessChannel 19087ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19097ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 19107ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19117ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : none 19127ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 19137ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel::QCamera3ReprocessChannel() : 19147ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pSrcChannel(NULL), 191541da374a8252b52dbf5f430602859095710b3cdeMansoor Aftab m_pMetaChannel(NULL) 19167ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 19177ee407aa1024789089aad411c372c79423699976Ajay Dudani} 19187ee407aa1024789089aad411c372c79423699976Ajay Dudani 19197ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 19207ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : QCamera3ReprocessChannel 19217ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19227ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: register the buffers of the reprocess channel 19237ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19247ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 19257ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19267ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : none 19277ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 1928c232705a3fe88a15722efec36dba335e417b7febShuzhen Wangint32_t QCamera3ReprocessChannel::registerBuffers( 1929c232705a3fe88a15722efec36dba335e417b7febShuzhen Wang uint32_t /*num_buffers*/, buffer_handle_t ** /*buffers*/) 19307ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 19317ee407aa1024789089aad411c372c79423699976Ajay Dudani return 0; 19327ee407aa1024789089aad411c372c79423699976Ajay Dudani} 19337ee407aa1024789089aad411c372c79423699976Ajay Dudani 19347ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 19357ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getStreamBufs 19367ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19377ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: register the buffers of the reprocess channel 19387ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19397ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 19407ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19417ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : QCamera3Memory * 19427ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 19437ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3Memory* QCamera3ReprocessChannel::getStreamBufs(uint32_t len) 19447ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 19457ee407aa1024789089aad411c372c79423699976Ajay Dudani int rc = 0; 19467ee407aa1024789089aad411c372c79423699976Ajay Dudani 19477ee407aa1024789089aad411c372c79423699976Ajay Dudani mMemory = new QCamera3HeapMemory(); 19487ee407aa1024789089aad411c372c79423699976Ajay Dudani if (!mMemory) { 19497ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: unable to create reproc memory", __func__); 19507ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 19517ee407aa1024789089aad411c372c79423699976Ajay Dudani } 19527ee407aa1024789089aad411c372c79423699976Ajay Dudani 19537ee407aa1024789089aad411c372c79423699976Ajay Dudani //Queue YUV buffers in the beginning mQueueAll = true 19547ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = mMemory->allocate(2, len, true); 19557ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc < 0) { 19567ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: unable to allocate reproc memory", __func__); 19577ee407aa1024789089aad411c372c79423699976Ajay Dudani delete mMemory; 19587ee407aa1024789089aad411c372c79423699976Ajay Dudani mMemory = NULL; 19597ee407aa1024789089aad411c372c79423699976Ajay Dudani return NULL; 19607ee407aa1024789089aad411c372c79423699976Ajay Dudani } 19617ee407aa1024789089aad411c372c79423699976Ajay Dudani return mMemory; 19627ee407aa1024789089aad411c372c79423699976Ajay Dudani} 19637ee407aa1024789089aad411c372c79423699976Ajay Dudani 19647ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 19657ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getStreamBufs 19667ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19677ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: register the buffers of the reprocess channel 19687ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19697ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 19707ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19717ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : 19727ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 19737ee407aa1024789089aad411c372c79423699976Ajay Dudanivoid QCamera3ReprocessChannel::putStreamBufs() 19747ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 19757ee407aa1024789089aad411c372c79423699976Ajay Dudani mMemory->deallocate(); 19767ee407aa1024789089aad411c372c79423699976Ajay Dudani delete mMemory; 19777ee407aa1024789089aad411c372c79423699976Ajay Dudani mMemory = NULL; 19787ee407aa1024789089aad411c372c79423699976Ajay Dudani} 19797ee407aa1024789089aad411c372c79423699976Ajay Dudani 19807ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 19817ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : ~QCamera3ReprocessChannel 19827ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19837ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: destructor of QCamera3ReprocessChannel 19847ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19857ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : none 19867ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19877ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : none 19887ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 19897ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3ReprocessChannel::~QCamera3ReprocessChannel() 19907ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 19917ee407aa1024789089aad411c372c79423699976Ajay Dudani} 19927ee407aa1024789089aad411c372c79423699976Ajay Dudani 19937ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 19947ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : getStreamBySourceHandle 19957ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19967ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: find reprocess stream by its source stream handle 19977ee407aa1024789089aad411c372c79423699976Ajay Dudani * 19987ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 19997ee407aa1024789089aad411c372c79423699976Ajay Dudani * @srcHandle : source stream handle 20007ee407aa1024789089aad411c372c79423699976Ajay Dudani * 20017ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : ptr to reprocess stream if found. NULL if not found 20027ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 20037ee407aa1024789089aad411c372c79423699976Ajay DudaniQCamera3Stream * QCamera3ReprocessChannel::getStreamBySourceHandle(uint32_t srcHandle) 20047ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 20057ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Stream *pStream = NULL; 20067ee407aa1024789089aad411c372c79423699976Ajay Dudani 20077ee407aa1024789089aad411c372c79423699976Ajay Dudani for (int i = 0; i < m_numStreams; i++) { 20087ee407aa1024789089aad411c372c79423699976Ajay Dudani if (mSrcStreamHandles[i] == srcHandle) { 20097ee407aa1024789089aad411c372c79423699976Ajay Dudani pStream = mStreams[i]; 20107ee407aa1024789089aad411c372c79423699976Ajay Dudani break; 20117ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20127ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20137ee407aa1024789089aad411c372c79423699976Ajay Dudani return pStream; 20147ee407aa1024789089aad411c372c79423699976Ajay Dudani} 20157ee407aa1024789089aad411c372c79423699976Ajay Dudani 20167ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 2017d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * FUNCTION : metadataBufDone 2018d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * 2019d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * DESCRIPTION: buf done method for a metadata buffer 2020d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * 2021d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * PARAMETERS : 2022d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * @recvd_frame : received metadata frame 2023d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * 2024d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab * RETURN : 2025d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab *==========================================================================*/ 2026d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftabint32_t QCamera3ReprocessChannel::metadataBufDone(mm_camera_super_buf_t *recvd_frame) 2027d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab{ 2028d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab int32_t rc; 2029d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab rc = ((QCamera3MetadataChannel*)m_pMetaChannel)->bufDone(recvd_frame); 2030d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab free(recvd_frame); 2031d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab recvd_frame = NULL; 2032d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab return rc; 2033d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab} 2034d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab 2035d63e05e886cb66cbbd321c0f5441e17e66ba25daMansoor Aftab/*=========================================================================== 20367ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : doReprocess 20377ee407aa1024789089aad411c372c79423699976Ajay Dudani * 20387ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: request to do a reprocess on the frame 20397ee407aa1024789089aad411c372c79423699976Ajay Dudani * 20407ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 20417ee407aa1024789089aad411c372c79423699976Ajay Dudani * @frame : frame to be performed a reprocess 20427ee407aa1024789089aad411c372c79423699976Ajay Dudani * 20437ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : int32_t type of status 20447ee407aa1024789089aad411c372c79423699976Ajay Dudani * NO_ERROR -- success 20457ee407aa1024789089aad411c372c79423699976Ajay Dudani * none-zero failure code 20467ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 20477ee407aa1024789089aad411c372c79423699976Ajay Dudaniint32_t QCamera3ReprocessChannel::doReprocess(mm_camera_super_buf_t *frame, 20487ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_super_buf_t *meta_frame) 20497ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 20507ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = 0; 20517ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_numStreams < 1) { 20527ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: No reprocess stream is created", __func__); 20537ee407aa1024789089aad411c372c79423699976Ajay Dudani return -1; 20547ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20557ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_pSrcChannel == NULL) { 20567ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: No source channel for reprocess", __func__); 20577ee407aa1024789089aad411c372c79423699976Ajay Dudani return -1; 20587ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20597ee407aa1024789089aad411c372c79423699976Ajay Dudani for (int i = 0; i < frame->num_bufs; i++) { 20607ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Stream *pStream = getStreamBySourceHandle(frame->bufs[i]->stream_id); 20617ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pStream != NULL) { 20627ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_stream_parm_buffer_t param; 20637ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 20647ee407aa1024789089aad411c372c79423699976Ajay Dudani param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 20657ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.buf_index = frame->bufs[i]->buf_idx; 20667ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.frame_idx = frame->bufs[i]->frame_idx; 20677ee407aa1024789089aad411c372c79423699976Ajay Dudani if (meta_frame != NULL) { 20687ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.meta_present = 1; 20697ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.meta_stream_handle = m_pMetaChannel->mStreams[0]->getMyServerID(); 20707ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.meta_buf_index = meta_frame->bufs[0]->buf_idx; 20717ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20727ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pStream->setParameter(param); 20737ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc != NO_ERROR) { 20747ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: stream setParameter for reprocess failed", __func__); 20757ee407aa1024789089aad411c372c79423699976Ajay Dudani break; 20767ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20777ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20787ee407aa1024789089aad411c372c79423699976Ajay Dudani } 20797ee407aa1024789089aad411c372c79423699976Ajay Dudani return rc; 20807ee407aa1024789089aad411c372c79423699976Ajay Dudani} 20817ee407aa1024789089aad411c372c79423699976Ajay Dudani 20827ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 20837ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : doReprocess 20847ee407aa1024789089aad411c372c79423699976Ajay Dudani * 20857ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: request to do a reprocess on the frame 20867ee407aa1024789089aad411c372c79423699976Ajay Dudani * 20877ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 20887ee407aa1024789089aad411c372c79423699976Ajay Dudani * @buf_fd : fd to the input buffer that needs reprocess 20897ee407aa1024789089aad411c372c79423699976Ajay Dudani * @buf_lenght : length of the input buffer 20907ee407aa1024789089aad411c372c79423699976Ajay Dudani * @ret_val : result of reprocess. 20917ee407aa1024789089aad411c372c79423699976Ajay Dudani * Example: Could be faceID in case of register face image. 20927ee407aa1024789089aad411c372c79423699976Ajay Dudani * 20937ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : int32_t type of status 20947ee407aa1024789089aad411c372c79423699976Ajay Dudani * NO_ERROR -- success 20957ee407aa1024789089aad411c372c79423699976Ajay Dudani * none-zero failure code 20967ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 20977ee407aa1024789089aad411c372c79423699976Ajay Dudaniint32_t QCamera3ReprocessChannel::doReprocess(int buf_fd, 20987ee407aa1024789089aad411c372c79423699976Ajay Dudani uint32_t buf_length, 20997ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t &ret_val, 21007ee407aa1024789089aad411c372c79423699976Ajay Dudani mm_camera_super_buf_t *meta_frame) 21017ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 21027ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = 0; 21037ee407aa1024789089aad411c372c79423699976Ajay Dudani if (m_numStreams < 1) { 21047ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: No reprocess stream is created", __func__); 21057ee407aa1024789089aad411c372c79423699976Ajay Dudani return -1; 21067ee407aa1024789089aad411c372c79423699976Ajay Dudani } 21077ee407aa1024789089aad411c372c79423699976Ajay Dudani if (meta_frame == NULL) { 21087ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: Did not get corresponding metadata in time", __func__); 21097ee407aa1024789089aad411c372c79423699976Ajay Dudani return -1; 21107ee407aa1024789089aad411c372c79423699976Ajay Dudani } 21117ee407aa1024789089aad411c372c79423699976Ajay Dudani 21127ee407aa1024789089aad411c372c79423699976Ajay Dudani uint32_t buf_idx = 0; 21137ee407aa1024789089aad411c372c79423699976Ajay Dudani for (int i = 0; i < m_numStreams; i++) { 21147ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = mStreams[i]->mapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 21157ee407aa1024789089aad411c372c79423699976Ajay Dudani buf_idx, -1, 21167ee407aa1024789089aad411c372c79423699976Ajay Dudani buf_fd, buf_length); 21177ee407aa1024789089aad411c372c79423699976Ajay Dudani 21187ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc == NO_ERROR) { 21197ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_stream_parm_buffer_t param; 21207ee407aa1024789089aad411c372c79423699976Ajay Dudani memset(¶m, 0, sizeof(cam_stream_parm_buffer_t)); 21217ee407aa1024789089aad411c372c79423699976Ajay Dudani param.type = CAM_STREAM_PARAM_TYPE_DO_REPROCESS; 21227ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.buf_index = buf_idx; 21237ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.meta_present = 1; 21247ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.meta_stream_handle = m_pMetaChannel->mStreams[0]->getMyServerID(); 21257ee407aa1024789089aad411c372c79423699976Ajay Dudani param.reprocess.meta_buf_index = meta_frame->bufs[0]->buf_idx; 21267ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = mStreams[i]->setParameter(param); 21277ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc == NO_ERROR) { 21287ee407aa1024789089aad411c372c79423699976Ajay Dudani ret_val = param.reprocess.ret_val; 21297ee407aa1024789089aad411c372c79423699976Ajay Dudani } 21307ee407aa1024789089aad411c372c79423699976Ajay Dudani mStreams[i]->unmapBuf(CAM_MAPPING_BUF_TYPE_OFFLINE_INPUT_BUF, 21317ee407aa1024789089aad411c372c79423699976Ajay Dudani buf_idx, -1); 21327ee407aa1024789089aad411c372c79423699976Ajay Dudani } 21337ee407aa1024789089aad411c372c79423699976Ajay Dudani } 21347ee407aa1024789089aad411c372c79423699976Ajay Dudani return rc; 21357ee407aa1024789089aad411c372c79423699976Ajay Dudani} 21367ee407aa1024789089aad411c372c79423699976Ajay Dudani 21377ee407aa1024789089aad411c372c79423699976Ajay Dudani/*=========================================================================== 21387ee407aa1024789089aad411c372c79423699976Ajay Dudani * FUNCTION : addReprocStreamsFromSource 21397ee407aa1024789089aad411c372c79423699976Ajay Dudani * 21407ee407aa1024789089aad411c372c79423699976Ajay Dudani * DESCRIPTION: add reprocess streams from input source channel 21417ee407aa1024789089aad411c372c79423699976Ajay Dudani * 21427ee407aa1024789089aad411c372c79423699976Ajay Dudani * PARAMETERS : 21437ee407aa1024789089aad411c372c79423699976Ajay Dudani * @config : pp feature configuration 21447ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pSrcChannel : ptr to input source channel that needs reprocess 21457ee407aa1024789089aad411c372c79423699976Ajay Dudani * @pMetaChannel : ptr to metadata channel to get corresp. metadata 21467ee407aa1024789089aad411c372c79423699976Ajay Dudani * 21477ee407aa1024789089aad411c372c79423699976Ajay Dudani * RETURN : int32_t type of status 21487ee407aa1024789089aad411c372c79423699976Ajay Dudani * NO_ERROR -- success 21497ee407aa1024789089aad411c372c79423699976Ajay Dudani * none-zero failure code 21507ee407aa1024789089aad411c372c79423699976Ajay Dudani *==========================================================================*/ 21517ee407aa1024789089aad411c372c79423699976Ajay Dudaniint32_t QCamera3ReprocessChannel::addReprocStreamsFromSource(cam_pp_feature_config_t &config, 21527ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Channel *pSrcChannel, 21537ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Channel *pMetaChannel) 21547ee407aa1024789089aad411c372c79423699976Ajay Dudani{ 21557ee407aa1024789089aad411c372c79423699976Ajay Dudani int32_t rc = 0; 21567ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Stream *pSrcStream = pSrcChannel->getStreamByIndex(0); 21577ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pSrcStream == NULL) { 21587ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: source channel doesn't have a stream", __func__); 21597ee407aa1024789089aad411c372c79423699976Ajay Dudani return BAD_VALUE; 21607ee407aa1024789089aad411c372c79423699976Ajay Dudani } 21617ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_stream_reproc_config_t reprocess_config; 21627ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_dimension_t streamDim; 21637ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_stream_type_t streamType; 21647ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_format_t streamFormat; 21657ee407aa1024789089aad411c372c79423699976Ajay Dudani cam_frame_len_offset_t frameOffset; 21667ee407aa1024789089aad411c372c79423699976Ajay Dudani int num_buffers = 2; 21677ee407aa1024789089aad411c372c79423699976Ajay Dudani 21687ee407aa1024789089aad411c372c79423699976Ajay Dudani streamType = CAM_STREAM_TYPE_OFFLINE_PROC; 21697ee407aa1024789089aad411c372c79423699976Ajay Dudani pSrcStream->getFormat(streamFormat); 21707ee407aa1024789089aad411c372c79423699976Ajay Dudani pSrcStream->getFrameDimension(streamDim); 21717ee407aa1024789089aad411c372c79423699976Ajay Dudani pSrcStream->getFrameOffset(frameOffset); 21727ee407aa1024789089aad411c372c79423699976Ajay Dudani 21737ee407aa1024789089aad411c372c79423699976Ajay Dudani reprocess_config.pp_type = CAM_ONLINE_REPROCESS_TYPE; 21747ee407aa1024789089aad411c372c79423699976Ajay Dudani reprocess_config.online.input_stream_id = pSrcStream->getMyServerID(); 21757ee407aa1024789089aad411c372c79423699976Ajay Dudani reprocess_config.online.input_stream_type = pSrcStream->getMyType(); 21767ee407aa1024789089aad411c372c79423699976Ajay Dudani reprocess_config.pp_feature_config = config; 21777ee407aa1024789089aad411c372c79423699976Ajay Dudani 21787ee407aa1024789089aad411c372c79423699976Ajay Dudani mSrcStreamHandles[m_numStreams] = pSrcStream->getMyHandle(); 21797ee407aa1024789089aad411c372c79423699976Ajay Dudani 2180c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (reprocess_config.pp_feature_config.feature_mask & CAM_QCOM_FEATURE_ROTATION) { 2181c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan if (reprocess_config.pp_feature_config.rotation == ROTATE_90 || 2182c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan reprocess_config.pp_feature_config.rotation == ROTATE_270) { 2183c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan // rotated by 90 or 270, need to switch width and height 2184c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan int32_t temp = streamDim.height; 2185c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan streamDim.height = streamDim.width; 2186c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan streamDim.width = temp; 2187c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 2188c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan } 2189c6f7291ea07883e0b6a274319f7e5b01c4a01578Mekala Natarajan 21907ee407aa1024789089aad411c372c79423699976Ajay Dudani QCamera3Stream *pStream = new QCamera3Stream(m_camHandle, 21917ee407aa1024789089aad411c372c79423699976Ajay Dudani m_handle, 21927ee407aa1024789089aad411c372c79423699976Ajay Dudani m_camOps, 21937ee407aa1024789089aad411c372c79423699976Ajay Dudani mPaddingInfo, 21947ee407aa1024789089aad411c372c79423699976Ajay Dudani (QCamera3Channel*)this); 21957ee407aa1024789089aad411c372c79423699976Ajay Dudani if (pStream == NULL) { 21967ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: No mem for Stream", __func__); 21977ee407aa1024789089aad411c372c79423699976Ajay Dudani return NO_MEMORY; 21987ee407aa1024789089aad411c372c79423699976Ajay Dudani } 21997ee407aa1024789089aad411c372c79423699976Ajay Dudani 22007ee407aa1024789089aad411c372c79423699976Ajay Dudani rc = pStream->init(streamType, streamFormat, streamDim, &reprocess_config, 22017ee407aa1024789089aad411c372c79423699976Ajay Dudani num_buffers,QCamera3Channel::streamCbRoutine, this); 22027ee407aa1024789089aad411c372c79423699976Ajay Dudani 22037ee407aa1024789089aad411c372c79423699976Ajay Dudani 22047ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc == 0) { 22057ee407aa1024789089aad411c372c79423699976Ajay Dudani mStreams[m_numStreams] = pStream; 22067ee407aa1024789089aad411c372c79423699976Ajay Dudani m_numStreams++; 22077ee407aa1024789089aad411c372c79423699976Ajay Dudani } else { 22087ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: failed to create reprocess stream", __func__); 22097ee407aa1024789089aad411c372c79423699976Ajay Dudani delete pStream; 22107ee407aa1024789089aad411c372c79423699976Ajay Dudani } 22117ee407aa1024789089aad411c372c79423699976Ajay Dudani 22127ee407aa1024789089aad411c372c79423699976Ajay Dudani if (rc == NO_ERROR) { 22137ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pSrcChannel = pSrcChannel; 22147ee407aa1024789089aad411c372c79423699976Ajay Dudani m_pMetaChannel = pMetaChannel; 22157ee407aa1024789089aad411c372c79423699976Ajay Dudani } 22167ee407aa1024789089aad411c372c79423699976Ajay Dudani if(m_camOps->request_super_buf(m_camHandle,m_handle,1) < 0) { 22177ee407aa1024789089aad411c372c79423699976Ajay Dudani ALOGE("%s: Request for super buffer failed",__func__); 22187ee407aa1024789089aad411c372c79423699976Ajay Dudani } 22197ee407aa1024789089aad411c372c79423699976Ajay Dudani return rc; 22207ee407aa1024789089aad411c372c79423699976Ajay Dudani} 22217ee407aa1024789089aad411c372c79423699976Ajay Dudani 22227ee407aa1024789089aad411c372c79423699976Ajay Dudani 2223625515beb9c1347216a2d261930ceb0d85ba1c47Shuzhen Wang}; // namespace qcamera 2224