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(&param, 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(&param, 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