QCamera3HWI.cpp revision c02fc0b9ad5b7b2eb050e6e78e9c068564e06f43
1/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
2*
3* Redistribution and use in source and binary forms, with or without
4* modification, are permitted provided that the following conditions are
5* met:
6*     * Redistributions of source code must retain the above copyright
7*       notice, this list of conditions and the following disclaimer.
8*     * Redistributions in binary form must reproduce the above
9*       copyright notice, this list of conditions and the following
10*       disclaimer in the documentation and/or other materials provided
11*       with the distribution.
12*     * Neither the name of The Linux Foundation nor the names of its
13*       contributors may be used to endorse or promote products derived
14*       from this software without specific prior written permission.
15*
16* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*
28*/
29
30#define LOG_TAG "QCamera3HWI"
31
32#include <cutils/properties.h>
33#include <hardware/camera3.h>
34#include <camera/CameraMetadata.h>
35#include <stdlib.h>
36#include <utils/Log.h>
37#include <utils/Errors.h>
38#include <ui/Fence.h>
39#include <gralloc_priv.h>
40#include "QCamera3HWI.h"
41#include "QCamera3Mem.h"
42#include "QCamera3Channel.h"
43#include "QCamera3PostProc.h"
44
45using namespace android;
46
47namespace qcamera {
48#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
49cam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
50parm_buffer_t *prevSettings;
51const camera_metadata_t *gStaticMetadata[MM_CAMERA_MAX_NUM_SENSORS];
52
53pthread_mutex_t QCamera3HardwareInterface::mCameraSessionLock =
54    PTHREAD_MUTEX_INITIALIZER;
55unsigned int QCamera3HardwareInterface::mCameraSessionActive = 0;
56
57const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
58    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
59    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
60    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
61    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
62    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
63    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
64    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
65    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
66    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
67};
68
69const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
70    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
71    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
72    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
73    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
74    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
75    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
76    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
77    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
78    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
79};
80
81const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
82    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
83    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
84    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
85    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
86    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
87    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
88    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
89    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
90    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
91    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
92    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
93    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
94    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
95    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
96    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
97};
98
99const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
100    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
101    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
102    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
103    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
104    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
105    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
106};
107
108const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
109    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
110    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
111    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
112    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
113};
114
115const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AE_FLASH_MODE_MAP[] = {
116    { ANDROID_CONTROL_AE_MODE_OFF,                  CAM_FLASH_MODE_OFF },
117    { ANDROID_CONTROL_AE_MODE_ON,                   CAM_FLASH_MODE_OFF },
118    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH,        CAM_FLASH_MODE_AUTO},
119    { ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH,      CAM_FLASH_MODE_ON  },
120    { ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE, CAM_FLASH_MODE_AUTO}
121};
122
123const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
124    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
125    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_SINGLE },
126    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH }
127};
128
129const int32_t available_thumbnail_sizes[] = {512, 288, 480, 288, 256, 154, 432, 288,
130                                             320, 240, 176, 144, 0, 0};
131
132camera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
133    initialize:                         QCamera3HardwareInterface::initialize,
134    configure_streams:                  QCamera3HardwareInterface::configure_streams,
135    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
136    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
137    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
138    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
139    dump:                               QCamera3HardwareInterface::dump,
140};
141
142
143/*===========================================================================
144 * FUNCTION   : QCamera3HardwareInterface
145 *
146 * DESCRIPTION: constructor of QCamera3HardwareInterface
147 *
148 * PARAMETERS :
149 *   @cameraId  : camera ID
150 *
151 * RETURN     : none
152 *==========================================================================*/
153QCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
154    : mCameraId(cameraId),
155      mCameraHandle(NULL),
156      mCameraOpened(false),
157      mCameraInitialized(false),
158      mCallbackOps(NULL),
159      mInputStream(NULL),
160      mMetadataChannel(NULL),
161      mPictureChannel(NULL),
162      mFirstRequest(false),
163      mParamHeap(NULL),
164      mParameters(NULL),
165      mJpegSettings(NULL),
166      mIsZslMode(false),
167      m_pPowerModule(NULL)
168{
169    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
170    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
171    mCameraDevice.common.close = close_camera_device;
172    mCameraDevice.ops = &mCameraOps;
173    mCameraDevice.priv = this;
174    gCamCapability[cameraId]->version = CAM_HAL_V3;
175    // TODO: hardcode for now until mctl add support for min_num_pp_bufs
176    //TBD - To see if this hardcoding is needed. Check by printing if this is filled by mctl to 3
177    gCamCapability[cameraId]->min_num_pp_bufs = 3;
178
179    pthread_cond_init(&mRequestCond, NULL);
180    mPendingRequest = 0;
181    mCurrentRequestId = -1;
182    pthread_mutex_init(&mMutex, NULL);
183
184    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
185        mDefaultMetadata[i] = NULL;
186
187#ifdef HAS_MULTIMEDIA_HINTS
188    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
189        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
190    }
191#endif
192}
193
194/*===========================================================================
195 * FUNCTION   : ~QCamera3HardwareInterface
196 *
197 * DESCRIPTION: destructor of QCamera3HardwareInterface
198 *
199 * PARAMETERS : none
200 *
201 * RETURN     : none
202 *==========================================================================*/
203QCamera3HardwareInterface::~QCamera3HardwareInterface()
204{
205    ALOGV("%s: E", __func__);
206    /* We need to stop all streams before deleting any stream */
207    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
208        it != mStreamInfo.end(); it++) {
209        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
210        if (channel)
211           channel->stop();
212    }
213    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
214        it != mStreamInfo.end(); it++) {
215        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
216        if (channel)
217            delete channel;
218        free (*it);
219    }
220
221    mPictureChannel = NULL;
222
223    if (mJpegSettings != NULL) {
224        free(mJpegSettings);
225        mJpegSettings = NULL;
226    }
227
228    /* Clean up all channels */
229    if (mCameraInitialized) {
230        if (mMetadataChannel) {
231            mMetadataChannel->stop();
232            delete mMetadataChannel;
233            mMetadataChannel = NULL;
234        }
235        deinitParameters();
236    }
237
238    if (mCameraOpened)
239        closeCamera();
240
241    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
242        if (mDefaultMetadata[i])
243            free_camera_metadata(mDefaultMetadata[i]);
244
245    pthread_cond_destroy(&mRequestCond);
246
247    pthread_mutex_destroy(&mMutex);
248    ALOGV("%s: X", __func__);
249}
250
251/*===========================================================================
252 * FUNCTION   : openCamera
253 *
254 * DESCRIPTION: open camera
255 *
256 * PARAMETERS :
257 *   @hw_device  : double ptr for camera device struct
258 *
259 * RETURN     : int32_t type of status
260 *              NO_ERROR  -- success
261 *              none-zero failure code
262 *==========================================================================*/
263int QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
264{
265    int rc = 0;
266    pthread_mutex_lock(&mCameraSessionLock);
267    if (mCameraSessionActive) {
268        ALOGE("%s: multiple simultaneous camera instance not supported", __func__);
269        pthread_mutex_unlock(&mCameraSessionLock);
270        return -EUSERS;
271    }
272
273    if (mCameraOpened) {
274        *hw_device = NULL;
275        return PERMISSION_DENIED;
276    }
277
278    rc = openCamera();
279    if (rc == 0) {
280        *hw_device = &mCameraDevice.common;
281        mCameraSessionActive = 1;
282    } else
283        *hw_device = NULL;
284
285#ifdef HAS_MULTIMEDIA_HINTS
286    if (rc == 0) {
287        if (m_pPowerModule) {
288            if (m_pPowerModule->powerHint) {
289                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
290                        (void *)"state=1");
291            }
292        }
293    }
294#endif
295    pthread_mutex_unlock(&mCameraSessionLock);
296    return rc;
297}
298
299/*===========================================================================
300 * FUNCTION   : openCamera
301 *
302 * DESCRIPTION: open camera
303 *
304 * PARAMETERS : none
305 *
306 * RETURN     : int32_t type of status
307 *              NO_ERROR  -- success
308 *              none-zero failure code
309 *==========================================================================*/
310int QCamera3HardwareInterface::openCamera()
311{
312    if (mCameraHandle) {
313        ALOGE("Failure: Camera already opened");
314        return ALREADY_EXISTS;
315    }
316    mCameraHandle = camera_open(mCameraId);
317    if (!mCameraHandle) {
318        ALOGE("camera_open failed.");
319        return UNKNOWN_ERROR;
320    }
321
322    mCameraOpened = true;
323
324    return NO_ERROR;
325}
326
327/*===========================================================================
328 * FUNCTION   : closeCamera
329 *
330 * DESCRIPTION: close camera
331 *
332 * PARAMETERS : none
333 *
334 * RETURN     : int32_t type of status
335 *              NO_ERROR  -- success
336 *              none-zero failure code
337 *==========================================================================*/
338int QCamera3HardwareInterface::closeCamera()
339{
340    int rc = NO_ERROR;
341
342    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
343    mCameraHandle = NULL;
344    mCameraOpened = false;
345
346#ifdef HAS_MULTIMEDIA_HINTS
347    if (rc == NO_ERROR) {
348        if (m_pPowerModule) {
349            if (m_pPowerModule->powerHint) {
350                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE,
351                        (void *)"state=0");
352            }
353        }
354    }
355#endif
356
357    return rc;
358}
359
360/*===========================================================================
361 * FUNCTION   : initialize
362 *
363 * DESCRIPTION: Initialize frameworks callback functions
364 *
365 * PARAMETERS :
366 *   @callback_ops : callback function to frameworks
367 *
368 * RETURN     :
369 *
370 *==========================================================================*/
371int QCamera3HardwareInterface::initialize(
372        const struct camera3_callback_ops *callback_ops)
373{
374    int rc;
375
376    pthread_mutex_lock(&mMutex);
377
378    rc = initParameters();
379    if (rc < 0) {
380        ALOGE("%s: initParamters failed %d", __func__, rc);
381       goto err1;
382    }
383
384    mCallbackOps = callback_ops;
385
386    pthread_mutex_unlock(&mMutex);
387    mCameraInitialized = true;
388    return 0;
389
390err1:
391    pthread_mutex_unlock(&mMutex);
392    return rc;
393}
394
395/*===========================================================================
396 * FUNCTION   : configureStreams
397 *
398 * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
399 *              and output streams.
400 *
401 * PARAMETERS :
402 *   @stream_list : streams to be configured
403 *
404 * RETURN     :
405 *
406 *==========================================================================*/
407int QCamera3HardwareInterface::configureStreams(
408        camera3_stream_configuration_t *streamList)
409{
410    int rc = 0;
411    // Sanity check stream_list
412    if (streamList == NULL) {
413        ALOGE("%s: NULL stream configuration", __func__);
414        return BAD_VALUE;
415    }
416
417    if (streamList->streams == NULL) {
418        ALOGE("%s: NULL stream list", __func__);
419        return BAD_VALUE;
420    }
421
422    if (streamList->num_streams < 1) {
423        ALOGE("%s: Bad number of streams requested: %d", __func__,
424                streamList->num_streams);
425        return BAD_VALUE;
426    }
427
428    camera3_stream_t *inputStream = NULL;
429    camera3_stream_t *jpegStream = NULL;
430    /* first invalidate all the steams in the mStreamList
431     * if they appear again, they will be validated */
432    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
433            it != mStreamInfo.end(); it++) {
434        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
435        channel->stop();
436        (*it)->status = INVALID;
437    }
438
439    if (mMetadataChannel) {
440        /* If content of mStreamInfo is not 0, there is metadata stream */
441        mMetadataChannel->stop();
442    }
443    // Acquire Mutex after stoping all the channels
444    pthread_mutex_lock(&mMutex);
445    for (size_t i = 0; i < streamList->num_streams; i++) {
446        camera3_stream_t *newStream = streamList->streams[i];
447        ALOGD("%s: newStream type = %d, stream format = %d stream size : %d x %d",
448                __func__, newStream->stream_type, newStream->format,
449                 newStream->width, newStream->height);
450        //if the stream is in the mStreamList validate it
451        bool stream_exists = false;
452        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
453                it != mStreamInfo.end(); it++) {
454            if ((*it)->stream == newStream) {
455                QCamera3Channel *channel =
456                    (QCamera3Channel*)(*it)->stream->priv;
457                stream_exists = true;
458                (*it)->status = RECONFIGURE;
459                /*delete the channel object associated with the stream because
460                  we need to reconfigure*/
461                delete channel;
462                (*it)->stream->priv = NULL;
463            }
464        }
465        if (!stream_exists) {
466            //new stream
467            stream_info_t* stream_info;
468            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
469            stream_info->stream = newStream;
470            stream_info->status = VALID;
471            stream_info->registered = 0;
472            mStreamInfo.push_back(stream_info);
473        }
474        if (newStream->stream_type == CAMERA3_STREAM_INPUT
475                || newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL ) {
476            if (inputStream != NULL) {
477                ALOGE("%s: Multiple input streams requested!", __func__);
478                pthread_mutex_unlock(&mMutex);
479                return BAD_VALUE;
480            }
481            inputStream = newStream;
482        }
483        if (newStream->format == HAL_PIXEL_FORMAT_BLOB) {
484            jpegStream = newStream;
485        }
486    }
487    mInputStream = inputStream;
488
489    /*clean up invalid streams*/
490    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
491            it != mStreamInfo.end();) {
492        if(((*it)->status) == INVALID){
493            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
494            delete channel;
495            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
496            free(*it);
497            it = mStreamInfo.erase(it);
498        } else {
499            it++;
500        }
501    }
502
503    if (mMetadataChannel) {
504        delete mMetadataChannel;
505        mMetadataChannel = NULL;
506    }
507
508    //Create metadata channel and initialize it
509    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
510                    mCameraHandle->ops, captureResultCb,
511                    &gCamCapability[mCameraId]->padding_info, this);
512    if (mMetadataChannel == NULL) {
513        ALOGE("%s: failed to allocate metadata channel", __func__);
514        rc = -ENOMEM;
515        pthread_mutex_unlock(&mMutex);
516        return rc;
517    }
518    rc = mMetadataChannel->initialize();
519    if (rc < 0) {
520        ALOGE("%s: metadata channel initialization failed", __func__);
521        delete mMetadataChannel;
522        mMetadataChannel = NULL;
523        pthread_mutex_unlock(&mMutex);
524        return rc;
525    }
526
527    /* Allocate channel objects for the requested streams */
528    for (size_t i = 0; i < streamList->num_streams; i++) {
529        camera3_stream_t *newStream = streamList->streams[i];
530        if (newStream->priv == NULL) {
531            //New stream, construct channel
532            switch (newStream->stream_type) {
533            case CAMERA3_STREAM_INPUT:
534                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
535                break;
536            case CAMERA3_STREAM_BIDIRECTIONAL:
537                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
538                    GRALLOC_USAGE_HW_CAMERA_WRITE;
539                break;
540            case CAMERA3_STREAM_OUTPUT:
541                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
542                break;
543            default:
544                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
545                break;
546            }
547
548            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
549                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
550                QCamera3Channel *channel;
551                switch (newStream->format) {
552                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
553                case HAL_PIXEL_FORMAT_YCbCr_420_888:
554                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
555                    if (newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL &&
556                        jpegStream) {
557                        uint32_t width = jpegStream->width;
558                        uint32_t height = jpegStream->height;
559                        mIsZslMode = true;
560                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
561                            mCameraHandle->ops, captureResultCb,
562                            &gCamCapability[mCameraId]->padding_info, this, newStream,
563                            width, height);
564                    } else
565                        channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
566                            mCameraHandle->ops, captureResultCb,
567                            &gCamCapability[mCameraId]->padding_info, this, newStream);
568                    if (channel == NULL) {
569                        ALOGE("%s: allocation of channel failed", __func__);
570                        pthread_mutex_unlock(&mMutex);
571                        return -ENOMEM;
572                    }
573
574                    newStream->priv = channel;
575                    break;
576                case HAL_PIXEL_FORMAT_BLOB:
577                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
578                    mPictureChannel = new QCamera3PicChannel(mCameraHandle->camera_handle,
579                            mCameraHandle->ops, captureResultCb,
580                            &gCamCapability[mCameraId]->padding_info, this, newStream);
581                    if (mPictureChannel == NULL) {
582                        ALOGE("%s: allocation of channel failed", __func__);
583                        pthread_mutex_unlock(&mMutex);
584                        return -ENOMEM;
585                    }
586                    newStream->priv = (QCamera3Channel*)mPictureChannel;
587                    break;
588
589                //TODO: Add support for app consumed format?
590                default:
591                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
592                    break;
593                }
594            }
595        } else {
596            // Channel already exists for this stream
597            // Do nothing for now
598        }
599    }
600    /*For the streams to be reconfigured we need to register the buffers
601      since the framework wont*/
602    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
603            it != mStreamInfo.end(); it++) {
604        if ((*it)->status == RECONFIGURE) {
605            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
606            /*only register buffers for streams that have already been
607              registered*/
608            if ((*it)->registered) {
609                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
610                        (*it)->buffer_set.buffers);
611                if (rc != NO_ERROR) {
612                    ALOGE("%s: Failed to register the buffers of old stream,\
613                            rc = %d", __func__, rc);
614                }
615                ALOGV("%s: channel %p has %d buffers",
616                        __func__, channel, (*it)->buffer_set.num_buffers);
617            }
618        }
619
620        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
621        if (index == NAME_NOT_FOUND) {
622            mPendingBuffersMap.add((*it)->stream, 0);
623        } else {
624            mPendingBuffersMap.editValueAt(index) = 0;
625        }
626    }
627
628    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
629    mPendingRequestsList.clear();
630
631    //settings/parameters don't carry over for new configureStreams
632    memset(mParameters, 0, sizeof(parm_buffer_t));
633    mFirstRequest = true;
634
635    pthread_mutex_unlock(&mMutex);
636    return rc;
637}
638
639/*===========================================================================
640 * FUNCTION   : validateCaptureRequest
641 *
642 * DESCRIPTION: validate a capture request from camera service
643 *
644 * PARAMETERS :
645 *   @request : request from framework to process
646 *
647 * RETURN     :
648 *
649 *==========================================================================*/
650int QCamera3HardwareInterface::validateCaptureRequest(
651                    camera3_capture_request_t *request)
652{
653    ssize_t idx = 0;
654    const camera3_stream_buffer_t *b;
655    CameraMetadata meta;
656
657    /* Sanity check the request */
658    if (request == NULL) {
659        ALOGE("%s: NULL capture request", __func__);
660        return BAD_VALUE;
661    }
662
663    uint32_t frameNumber = request->frame_number;
664    if (request->input_buffer != NULL &&
665            request->input_buffer->stream != mInputStream) {
666        ALOGE("%s: Request %d: Input buffer not from input stream!",
667                __FUNCTION__, frameNumber);
668        return BAD_VALUE;
669    }
670    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
671        ALOGE("%s: Request %d: No output buffers provided!",
672                __FUNCTION__, frameNumber);
673        return BAD_VALUE;
674    }
675    if (request->input_buffer != NULL) {
676        b = request->input_buffer;
677        QCamera3Channel *channel =
678            static_cast<QCamera3Channel*>(b->stream->priv);
679        if (channel == NULL) {
680            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
681                    __func__, frameNumber, idx);
682            return BAD_VALUE;
683        }
684        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
685            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
686                    __func__, frameNumber, idx);
687            return BAD_VALUE;
688        }
689        if (b->release_fence != -1) {
690            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
691                    __func__, frameNumber, idx);
692            return BAD_VALUE;
693        }
694        if (b->buffer == NULL) {
695            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
696                    __func__, frameNumber, idx);
697            return BAD_VALUE;
698        }
699    }
700
701    // Validate all buffers
702    b = request->output_buffers;
703    do {
704        QCamera3Channel *channel =
705                static_cast<QCamera3Channel*>(b->stream->priv);
706        if (channel == NULL) {
707            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
708                    __func__, frameNumber, idx);
709            return BAD_VALUE;
710        }
711        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
712            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
713                    __func__, frameNumber, idx);
714            return BAD_VALUE;
715        }
716        if (b->release_fence != -1) {
717            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
718                    __func__, frameNumber, idx);
719            return BAD_VALUE;
720        }
721        if (b->buffer == NULL) {
722            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
723                    __func__, frameNumber, idx);
724            return BAD_VALUE;
725        }
726        idx++;
727        b = request->output_buffers + idx;
728    } while (idx < (ssize_t)request->num_output_buffers);
729
730    return NO_ERROR;
731}
732
733/*===========================================================================
734 * FUNCTION   : registerStreamBuffers
735 *
736 * DESCRIPTION: Register buffers for a given stream with the HAL device.
737 *
738 * PARAMETERS :
739 *   @stream_list : streams to be configured
740 *
741 * RETURN     :
742 *
743 *==========================================================================*/
744int QCamera3HardwareInterface::registerStreamBuffers(
745        const camera3_stream_buffer_set_t *buffer_set)
746{
747    int rc = 0;
748
749    pthread_mutex_lock(&mMutex);
750
751    if (buffer_set == NULL) {
752        ALOGE("%s: Invalid buffer_set parameter.", __func__);
753        pthread_mutex_unlock(&mMutex);
754        return -EINVAL;
755    }
756    if (buffer_set->stream == NULL) {
757        ALOGE("%s: Invalid stream parameter.", __func__);
758        pthread_mutex_unlock(&mMutex);
759        return -EINVAL;
760    }
761    if (buffer_set->num_buffers < 1) {
762        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
763        pthread_mutex_unlock(&mMutex);
764        return -EINVAL;
765    }
766    if (buffer_set->buffers == NULL) {
767        ALOGE("%s: Invalid buffers parameter.", __func__);
768        pthread_mutex_unlock(&mMutex);
769        return -EINVAL;
770    }
771
772    camera3_stream_t *stream = buffer_set->stream;
773    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
774
775    //set the buffer_set in the mStreamInfo array
776    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
777            it != mStreamInfo.end(); it++) {
778        if ((*it)->stream == stream) {
779            uint32_t numBuffers = buffer_set->num_buffers;
780            (*it)->buffer_set.stream = buffer_set->stream;
781            (*it)->buffer_set.num_buffers = numBuffers;
782            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
783            if ((*it)->buffer_set.buffers == NULL) {
784                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
785                pthread_mutex_unlock(&mMutex);
786                return -ENOMEM;
787            }
788            for (size_t j = 0; j < numBuffers; j++){
789                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
790            }
791            (*it)->registered = 1;
792        }
793    }
794    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
795    if (rc < 0) {
796        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
797        pthread_mutex_unlock(&mMutex);
798        return -ENODEV;
799    }
800
801    pthread_mutex_unlock(&mMutex);
802    return NO_ERROR;
803}
804
805/*===========================================================================
806 * FUNCTION   : processCaptureRequest
807 *
808 * DESCRIPTION: process a capture request from camera service
809 *
810 * PARAMETERS :
811 *   @request : request from framework to process
812 *
813 * RETURN     :
814 *
815 *==========================================================================*/
816int QCamera3HardwareInterface::processCaptureRequest(
817                    camera3_capture_request_t *request)
818{
819    int rc = NO_ERROR;
820    int32_t request_id;
821    CameraMetadata meta;
822
823    pthread_mutex_lock(&mMutex);
824
825    rc = validateCaptureRequest(request);
826    if (rc != NO_ERROR) {
827        ALOGE("%s: incoming request is not valid", __func__);
828        pthread_mutex_unlock(&mMutex);
829        return rc;
830    }
831
832    uint32_t frameNumber = request->frame_number;
833    uint32_t streamTypeMask = 0;
834
835    meta = request->settings;
836    if (meta.exists(ANDROID_REQUEST_ID)) {
837        request_id = meta.find(ANDROID_REQUEST_ID).data.i32[0];
838        mCurrentRequestId = request_id;
839        ALOGV("%s: Received request with id: %d",__func__, request_id);
840    } else if (mFirstRequest || mCurrentRequestId == -1){
841        ALOGE("%s: Unable to find request id field, \
842                & no previous id available", __func__);
843        return NAME_NOT_FOUND;
844    } else {
845        ALOGV("%s: Re-using old request id", __func__);
846        request_id = mCurrentRequestId;
847    }
848
849    ALOGV("%s: %d, num_output_buffers = %d input_buffer = %p frame_number = %d",
850                                    __func__, __LINE__,
851                                    request->num_output_buffers,
852                                    request->input_buffer,
853                                    frameNumber);
854    // Acquire all request buffers first
855    int blob_request = 0;
856    for (size_t i = 0; i < request->num_output_buffers; i++) {
857        const camera3_stream_buffer_t& output = request->output_buffers[i];
858        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
859        sp<Fence> acquireFence = new Fence(output.acquire_fence);
860
861        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
862        //Call function to store local copy of jpeg data for encode params.
863            blob_request = 1;
864            rc = getJpegSettings(request->settings);
865            if (rc < 0) {
866                ALOGE("%s: failed to get jpeg parameters", __func__);
867                pthread_mutex_unlock(&mMutex);
868                return rc;
869            }
870        }
871
872        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
873        if (rc != OK) {
874            ALOGE("%s: fence wait failed %d", __func__, rc);
875            pthread_mutex_unlock(&mMutex);
876            return rc;
877        }
878        streamTypeMask |= channel->getStreamTypeMask();
879    }
880
881    rc = setFrameParameters(request->frame_number, request->settings, streamTypeMask);
882    if (rc < 0) {
883        ALOGE("%s: fail to set frame parameters", __func__);
884        pthread_mutex_unlock(&mMutex);
885        return rc;
886    }
887
888    /* Update pending request list and pending buffers map */
889    PendingRequestInfo pendingRequest;
890    pendingRequest.frame_number = frameNumber;
891    pendingRequest.num_buffers = request->num_output_buffers;
892    pendingRequest.request_id = request_id;
893    pendingRequest.blob_request = blob_request;
894
895    for (size_t i = 0; i < request->num_output_buffers; i++) {
896        RequestedBufferInfo requestedBuf;
897        requestedBuf.stream = request->output_buffers[i].stream;
898        requestedBuf.buffer = NULL;
899        pendingRequest.buffers.push_back(requestedBuf);
900
901        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
902    }
903    mPendingRequestsList.push_back(pendingRequest);
904
905    // Notify metadata channel we receive a request
906    mMetadataChannel->request(NULL, frameNumber);
907
908    // Call request on other streams
909    for (size_t i = 0; i < request->num_output_buffers; i++) {
910        const camera3_stream_buffer_t& output = request->output_buffers[i];
911        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
912        mm_camera_buf_def_t *pInputBuffer = NULL;
913
914        if (channel == NULL) {
915            ALOGE("%s: invalid channel pointer for stream", __func__);
916            continue;
917        }
918
919        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
920            QCamera3RegularChannel* inputChannel = NULL;
921            if(request->input_buffer != NULL){
922
923                //Try to get the internal format
924                inputChannel = (QCamera3RegularChannel*)
925                    request->input_buffer->stream->priv;
926                if(inputChannel == NULL ){
927                    ALOGE("%s: failed to get input channel handle", __func__);
928                } else {
929                    pInputBuffer =
930                        inputChannel->getInternalFormatBuffer(
931                                request->input_buffer->buffer);
932                    ALOGD("%s: Input buffer dump",__func__);
933                    ALOGD("Stream id: %d", pInputBuffer->stream_id);
934                    ALOGD("streamtype:%d", pInputBuffer->stream_type);
935                    ALOGD("frame len:%d", pInputBuffer->frame_len);
936                }
937            }
938            rc = channel->request(output.buffer, frameNumber, mJpegSettings,
939                            pInputBuffer,(QCamera3Channel*)inputChannel);
940        } else {
941            ALOGV("%s: %d, request with buffer %p, frame_number %d", __func__,
942                __LINE__, output.buffer, frameNumber);
943            rc = channel->request(output.buffer, frameNumber);
944        }
945        if (rc < 0)
946            ALOGE("%s: request failed", __func__);
947    }
948
949    mFirstRequest = false;
950
951    //Block on conditional variable
952    mPendingRequest = 1;
953    while (mPendingRequest == 1) {
954        pthread_cond_wait(&mRequestCond, &mMutex);
955    }
956
957    pthread_mutex_unlock(&mMutex);
958    return rc;
959}
960
961/*===========================================================================
962 * FUNCTION   : getMetadataVendorTagOps
963 *
964 * DESCRIPTION:
965 *
966 * PARAMETERS :
967 *
968 *
969 * RETURN     :
970 *==========================================================================*/
971void QCamera3HardwareInterface::getMetadataVendorTagOps(
972                    vendor_tag_query_ops_t* /*ops*/)
973{
974    /* Enable locks when we eventually add Vendor Tags */
975    /*
976    pthread_mutex_lock(&mMutex);
977
978    pthread_mutex_unlock(&mMutex);
979    */
980    return;
981}
982
983/*===========================================================================
984 * FUNCTION   : dump
985 *
986 * DESCRIPTION:
987 *
988 * PARAMETERS :
989 *
990 *
991 * RETURN     :
992 *==========================================================================*/
993void QCamera3HardwareInterface::dump(int /*fd*/)
994{
995    /*Enable lock when we implement this function*/
996    /*
997    pthread_mutex_lock(&mMutex);
998
999    pthread_mutex_unlock(&mMutex);
1000    */
1001    return;
1002}
1003
1004
1005/*===========================================================================
1006 * FUNCTION   : captureResultCb
1007 *
1008 * DESCRIPTION: Callback handler for all capture result
1009 *              (streams, as well as metadata)
1010 *
1011 * PARAMETERS :
1012 *   @metadata : metadata information
1013 *   @buffer   : actual gralloc buffer to be returned to frameworks.
1014 *               NULL if metadata.
1015 *
1016 * RETURN     : NONE
1017 *==========================================================================*/
1018void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
1019                camera3_stream_buffer_t *buffer, uint32_t frame_number)
1020{
1021    pthread_mutex_lock(&mMutex);
1022
1023    if (metadata_buf) {
1024        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
1025        int32_t frame_number_valid = *(int32_t *)
1026            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
1027        uint32_t pending_requests = *(uint32_t *)POINTER_OF(
1028            CAM_INTF_META_PENDING_REQUESTS, metadata);
1029        uint32_t frame_number = *(uint32_t *)
1030            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
1031        const struct timeval *tv = (const struct timeval *)
1032            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
1033        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
1034            tv->tv_usec * NSEC_PER_USEC;
1035        bool frame_number_exists = FALSE;
1036
1037        if (!frame_number_valid) {
1038            ALOGV("%s: Not a valid frame number, used as SOF only", __func__);
1039            mMetadataChannel->bufDone(metadata_buf);
1040            free(metadata_buf);
1041            goto done_metadata;
1042        }
1043        ALOGV("%s: valid frame_number = %d, capture_time = %lld", __func__,
1044                frame_number, capture_time);
1045
1046        // Go through the pending requests info and send shutter/results to frameworks
1047        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1048                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
1049            camera3_capture_result_t result;
1050            camera3_notify_msg_t notify_msg;
1051            ALOGV("%s: frame_number in the list is %d", __func__, i->frame_number);
1052            frame_number_exists = TRUE; // This frame number exists in Pending list
1053            // Flush out all entries with less or equal frame numbers.
1054
1055            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
1056            //Right now it's the same as metadata timestamp
1057
1058            //TODO: When there is metadata drop, how do we derive the timestamp of
1059            //dropped frames? For now, we fake the dropped timestamp by substracting
1060            //from the reported timestamp
1061            nsecs_t current_capture_time = capture_time -
1062                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
1063
1064            // Send shutter notify to frameworks
1065            notify_msg.type = CAMERA3_MSG_SHUTTER;
1066            notify_msg.message.shutter.frame_number = i->frame_number;
1067            notify_msg.message.shutter.timestamp = current_capture_time;
1068            mCallbackOps->notify(mCallbackOps, &notify_msg);
1069            ALOGV("%s: notify frame_number = %d, capture_time = %lld", __func__,
1070                    i->frame_number, capture_time);
1071
1072            // Send empty metadata with already filled buffers for dropped metadata
1073            // and send valid metadata with already filled buffers for current metadata
1074            if (i->frame_number < frame_number) {
1075                CameraMetadata dummyMetadata;
1076                dummyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
1077                        &current_capture_time, 1);
1078                dummyMetadata.update(ANDROID_REQUEST_ID,
1079                        &(i->request_id), 1);
1080                result.result = dummyMetadata.release();
1081            } else {
1082                result.result = translateCbMetadataToResultMetadata(metadata,
1083                        current_capture_time, i->request_id);
1084                if (i->blob_request && needReprocess()) {
1085                   //If it is a blob request then send the metadata to the picture channel
1086                   mPictureChannel->queueMetadata(metadata_buf);
1087
1088                } else {
1089                   // Return metadata buffer
1090                   mMetadataChannel->bufDone(metadata_buf);
1091                   free(metadata_buf);
1092                }
1093            }
1094            if (!result.result) {
1095                ALOGE("%s: metadata is NULL", __func__);
1096            }
1097            result.frame_number = i->frame_number;
1098            result.num_output_buffers = 0;
1099            result.output_buffers = NULL;
1100            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1101                    j != i->buffers.end(); j++) {
1102                if (j->buffer) {
1103                    result.num_output_buffers++;
1104                }
1105            }
1106
1107            if (result.num_output_buffers > 0) {
1108                camera3_stream_buffer_t *result_buffers =
1109                    new camera3_stream_buffer_t[result.num_output_buffers];
1110                if (!result_buffers) {
1111                    ALOGE("%s: Fatal error: out of memory", __func__);
1112                }
1113                size_t result_buffers_idx = 0;
1114                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1115                        j != i->buffers.end(); j++) {
1116                    if (j->buffer) {
1117                        result_buffers[result_buffers_idx++] = *(j->buffer);
1118                        free(j->buffer);
1119                        j->buffer = NULL;
1120                        mPendingBuffersMap.editValueFor(j->stream)--;
1121                    }
1122                }
1123                result.output_buffers = result_buffers;
1124
1125                mCallbackOps->process_capture_result(mCallbackOps, &result);
1126                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1127                        __func__, result.frame_number, current_capture_time);
1128                free_camera_metadata((camera_metadata_t *)result.result);
1129                delete[] result_buffers;
1130            } else {
1131                mCallbackOps->process_capture_result(mCallbackOps, &result);
1132                ALOGV("%s: meta frame_number = %d, capture_time = %lld",
1133                        __func__, result.frame_number, current_capture_time);
1134                free_camera_metadata((camera_metadata_t *)result.result);
1135            }
1136            // erase the element from the list
1137            i = mPendingRequestsList.erase(i);
1138        }
1139        if (!frame_number_exists) {
1140            ALOGD("%s: Frame number# %d not in the Pending Request list", __func__,
1141                    frame_number);
1142            // Race condition where in Metadata Frame# is valid but its not in Pending list
1143            mMetadataChannel->bufDone(metadata_buf);
1144            free(metadata_buf);
1145        }
1146
1147done_metadata:
1148        bool max_buffers_dequeued = false;
1149        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
1150            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
1151            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
1152            if (queued_buffers == stream->max_buffers) {
1153                max_buffers_dequeued = true;
1154                break;
1155            }
1156        }
1157        if (!max_buffers_dequeued && !pending_requests) {
1158            // Unblock process_capture_request
1159            mPendingRequest = 0;
1160            pthread_cond_signal(&mRequestCond);
1161        }
1162    } else {
1163        // If the frame number doesn't exist in the pending request list,
1164        // directly send the buffer to the frameworks, and update pending buffers map
1165        // Otherwise, book-keep the buffer.
1166        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1167        while (i != mPendingRequestsList.end() && i->frame_number != frame_number){
1168            i++;
1169        }
1170        if (i == mPendingRequestsList.end()) {
1171            // Verify all pending requests frame_numbers are greater
1172            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1173                    j != mPendingRequestsList.end(); j++) {
1174                if (j->frame_number < frame_number) {
1175                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
1176                            __func__, j->frame_number, frame_number);
1177                }
1178            }
1179            camera3_capture_result_t result;
1180            result.result = NULL;
1181            result.frame_number = frame_number;
1182            result.num_output_buffers = 1;
1183            result.output_buffers = buffer;
1184            ALOGV("%s: result frame_number = %d, buffer = %p",
1185                    __func__, frame_number, buffer);
1186            mPendingBuffersMap.editValueFor(buffer->stream)--;
1187            mCallbackOps->process_capture_result(mCallbackOps, &result);
1188        } else {
1189            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1190                    j != i->buffers.end(); j++) {
1191                if (j->stream == buffer->stream) {
1192                    if (j->buffer != NULL) {
1193                        ALOGE("%s: Error: buffer is already set", __func__);
1194                    } else {
1195                        j->buffer = (camera3_stream_buffer_t *)malloc(
1196                                sizeof(camera3_stream_buffer_t));
1197                        *(j->buffer) = *buffer;
1198                        ALOGV("%s: cache buffer %p at result frame_number %d",
1199                                __func__, buffer, frame_number);
1200                    }
1201                }
1202            }
1203        }
1204    }
1205    pthread_mutex_unlock(&mMutex);
1206    return;
1207}
1208
1209/*===========================================================================
1210 * FUNCTION   : translateCbMetadataToResultMetadata
1211 *
1212 * DESCRIPTION:
1213 *
1214 * PARAMETERS :
1215 *   @metadata : metadata information from callback
1216 *
1217 * RETURN     : camera_metadata_t*
1218 *              metadata in a format specified by fwk
1219 *==========================================================================*/
1220camera_metadata_t*
1221QCamera3HardwareInterface::translateCbMetadataToResultMetadata
1222                                (metadata_buffer_t *metadata, nsecs_t timestamp,
1223                                 int32_t request_id)
1224{
1225    CameraMetadata camMetadata;
1226    camera_metadata_t* resultMetadata;
1227
1228    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
1229    camMetadata.update(ANDROID_REQUEST_ID, &request_id, 1);
1230
1231    /*CAM_INTF_META_HISTOGRAM - TODO*/
1232    /*cam_hist_stats_t  *histogram =
1233      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
1234      metadata);*/
1235
1236    /*face detection*/
1237    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
1238        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
1239    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
1240    int32_t faceIds[numFaces];
1241    uint8_t faceScores[numFaces];
1242    int32_t faceRectangles[numFaces * 4];
1243    int32_t faceLandmarks[numFaces * 6];
1244    int j = 0, k = 0;
1245    for (int i = 0; i < numFaces; i++) {
1246        faceIds[i] = faceDetectionInfo->faces[i].face_id;
1247        faceScores[i] = faceDetectionInfo->faces[i].score;
1248        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
1249                faceRectangles+j, -1);
1250        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
1251        j+= 4;
1252        k+= 6;
1253    }
1254    if (numFaces > 0) {
1255        camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
1256        camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
1257        camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
1258            faceRectangles, numFaces*4);
1259        camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
1260            faceLandmarks, numFaces*6);
1261    }
1262
1263    uint8_t  *color_correct_mode =
1264        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
1265    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
1266
1267    int32_t  *ae_precapture_id =
1268        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
1269    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
1270
1271    /*aec regions*/
1272    cam_area_t  *hAeRegions =
1273        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
1274    int32_t aeRegions[5];
1275    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
1276    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
1277    if(mIsZslMode) {
1278        uint8_t ae_state = ANDROID_CONTROL_AE_STATE_CONVERGED;
1279        camMetadata.update(ANDROID_CONTROL_AE_STATE, &ae_state, 1);
1280    } else {
1281        uint8_t *ae_state =
1282            (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
1283        camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
1284    }
1285    uint8_t  *focusMode =
1286        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
1287    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
1288
1289    /*af regions*/
1290    cam_area_t  *hAfRegions =
1291        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
1292    int32_t afRegions[5];
1293    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
1294    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
1295
1296    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
1297    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
1298
1299    int32_t  *afTriggerId =
1300        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
1301    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
1302
1303    uint8_t  *whiteBalance =
1304        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
1305    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
1306
1307    /*awb regions*/
1308    cam_area_t  *hAwbRegions =
1309        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
1310    int32_t awbRegions[5];
1311    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
1312    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
1313
1314    uint8_t  *whiteBalanceState =
1315        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
1316    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
1317
1318    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
1319    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
1320
1321    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE_MODE, metadata);
1322    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
1323
1324    uint8_t  *flashPower =
1325        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
1326    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
1327
1328    int64_t  *flashFiringTime =
1329        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
1330    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
1331
1332    /*int32_t  *ledMode =
1333      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
1334      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
1335
1336    uint8_t  *flashState =
1337        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
1338    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
1339
1340    uint8_t  *hotPixelMode =
1341        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
1342    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
1343
1344    float  *lensAperture =
1345        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
1346    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
1347
1348    float  *filterDensity =
1349        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
1350    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
1351
1352    float  *focalLength =
1353        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
1354    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
1355
1356    float  *focusDistance =
1357        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
1358    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
1359
1360    float  *focusRange =
1361        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
1362    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
1363
1364    uint8_t  *opticalStab =
1365        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
1366    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
1367
1368    /*int32_t  *focusState =
1369      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
1370      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
1371
1372    uint8_t  *noiseRedMode =
1373        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
1374    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
1375
1376    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
1377
1378    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
1379        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
1380    int32_t scalerCropRegion[4];
1381    scalerCropRegion[0] = hScalerCropRegion->left;
1382    scalerCropRegion[1] = hScalerCropRegion->top;
1383    scalerCropRegion[2] = hScalerCropRegion->width;
1384    scalerCropRegion[3] = hScalerCropRegion->height;
1385    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 4);
1386
1387    int64_t  *sensorExpTime =
1388        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
1389    mMetadataResponse.exposure_time = *sensorExpTime;
1390    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
1391
1392
1393    int64_t  *sensorFameDuration =
1394        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
1395    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
1396
1397    int32_t  *sensorSensitivity =
1398        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
1399    mMetadataResponse.iso_speed = *sensorSensitivity;
1400    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
1401
1402    uint8_t  *shadingMode =
1403        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
1404    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
1405
1406    uint8_t  *faceDetectMode =
1407        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
1408    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
1409
1410    uint8_t  *histogramMode =
1411        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
1412    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
1413
1414    uint8_t  *sharpnessMapMode =
1415        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
1416    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
1417            sharpnessMapMode, 1);
1418
1419    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
1420    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
1421        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
1422    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
1423            (int32_t*)sharpnessMap->sharpness,
1424            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
1425
1426    cam_lens_shading_map_t *lensShadingMap = (cam_lens_shading_map_t *)
1427        POINTER_OF(CAM_INTF_META_LENS_SHADING_MAP, metadata);
1428    int map_height = gCamCapability[mCameraId]->lens_shading_map_size.height;
1429    int map_width  = gCamCapability[mCameraId]->lens_shading_map_size.width;
1430    camMetadata.update(ANDROID_STATISTICS_LENS_SHADING_MAP,
1431                       (float*)lensShadingMap->lens_shading,
1432                       4*map_width*map_height);
1433
1434    cam_color_correct_gains_t *colorCorrectionGains = (cam_color_correct_gains_t*)
1435        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_GAINS, metadata);
1436    camMetadata.update(ANDROID_COLOR_CORRECTION_GAINS, colorCorrectionGains->gains, 4);
1437
1438    cam_color_correct_matrix_t *colorCorrectionMatrix = (cam_color_correct_matrix_t*)
1439        POINTER_OF(CAM_INTF_META_COLOR_CORRECT_TRANSFORM, metadata);
1440    camMetadata.update(ANDROID_COLOR_CORRECTION_TRANSFORM,
1441                       (camera_metadata_rational_t*)colorCorrectionMatrix->transform_matrix, 3*3);
1442
1443    cam_color_correct_gains_t *predColorCorrectionGains = (cam_color_correct_gains_t*)
1444        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_GAINS, metadata);
1445    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_GAINS,
1446                       predColorCorrectionGains->gains, 4);
1447
1448    cam_color_correct_matrix_t *predColorCorrectionMatrix = (cam_color_correct_matrix_t*)
1449        POINTER_OF(CAM_INTF_META_PRED_COLOR_CORRECT_TRANSFORM, metadata);
1450    camMetadata.update(ANDROID_STATISTICS_PREDICTED_COLOR_TRANSFORM,
1451                       (camera_metadata_rational_t*)predColorCorrectionMatrix->transform_matrix, 3*3);
1452
1453    uint8_t *blackLevelLock = (uint8_t*)
1454        POINTER_OF(CAM_INTF_META_BLACK_LEVEL_LOCK, metadata);
1455    camMetadata.update(ANDROID_BLACK_LEVEL_LOCK, blackLevelLock, 1);
1456
1457    uint8_t *sceneFlicker = (uint8_t*)
1458        POINTER_OF(CAM_INTF_META_SCENE_FLICKER, metadata);
1459    camMetadata.update(ANDROID_STATISTICS_SCENE_FLICKER, sceneFlicker, 1);
1460
1461
1462    resultMetadata = camMetadata.release();
1463    return resultMetadata;
1464}
1465
1466/*===========================================================================
1467 * FUNCTION   : convertToRegions
1468 *
1469 * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
1470 *
1471 * PARAMETERS :
1472 *   @rect   : cam_rect_t struct to convert
1473 *   @region : int32_t destination array
1474 *   @weight : if we are converting from cam_area_t, weight is valid
1475 *             else weight = -1
1476 *
1477 *==========================================================================*/
1478void QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
1479    region[0] = rect.left;
1480    region[1] = rect.top;
1481    region[2] = rect.left + rect.width;
1482    region[3] = rect.top + rect.height;
1483    if (weight > -1) {
1484        region[4] = weight;
1485    }
1486}
1487
1488/*===========================================================================
1489 * FUNCTION   : convertFromRegions
1490 *
1491 * DESCRIPTION: helper method to convert from array to cam_rect_t
1492 *
1493 * PARAMETERS :
1494 *   @rect   : cam_rect_t struct to convert
1495 *   @region : int32_t destination array
1496 *   @weight : if we are converting from cam_area_t, weight is valid
1497 *             else weight = -1
1498 *
1499 *==========================================================================*/
1500void QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
1501                                                   const camera_metadata_t *settings,
1502                                                   uint32_t tag){
1503    CameraMetadata frame_settings;
1504    frame_settings = settings;
1505    int32_t x_min = frame_settings.find(tag).data.i32[0];
1506    int32_t y_min = frame_settings.find(tag).data.i32[1];
1507    int32_t x_max = frame_settings.find(tag).data.i32[2];
1508    int32_t y_max = frame_settings.find(tag).data.i32[3];
1509    roi->weight = frame_settings.find(tag).data.i32[4];
1510    roi->rect.left = x_min;
1511    roi->rect.top = y_min;
1512    roi->rect.width = x_max - x_min;
1513    roi->rect.height = y_max - y_min;
1514}
1515
1516/*===========================================================================
1517 * FUNCTION   : resetIfNeededROI
1518 *
1519 * DESCRIPTION: helper method to reset the roi if it is greater than scaler
1520 *              crop region
1521 *
1522 * PARAMETERS :
1523 *   @roi       : cam_area_t struct to resize
1524 *   @scalerCropRegion : cam_crop_region_t region to compare against
1525 *
1526 *
1527 *==========================================================================*/
1528bool QCamera3HardwareInterface::resetIfNeededROI(cam_area_t* roi,
1529                                                 const cam_crop_region_t* scalerCropRegion)
1530{
1531    int32_t roi_x_max = roi->rect.width + roi->rect.left;
1532    int32_t roi_y_max = roi->rect.height + roi->rect.top;
1533    int32_t crop_x_max = scalerCropRegion->width + scalerCropRegion->top;
1534    int32_t crop_y_max = scalerCropRegion->height + scalerCropRegion->left;
1535    if ((roi_x_max < scalerCropRegion->left) ||
1536        (roi_y_max < scalerCropRegion->top)  ||
1537        (roi->rect.left > crop_x_max) ||
1538        (roi->rect.top > crop_y_max)){
1539        return false;
1540    }
1541    if (roi->rect.left < scalerCropRegion->left) {
1542        roi->rect.left = scalerCropRegion->left;
1543    }
1544    if (roi->rect.top < scalerCropRegion->top) {
1545        roi->rect.top = scalerCropRegion->top;
1546    }
1547    if (roi_x_max > crop_x_max) {
1548        roi_x_max = crop_x_max;
1549    }
1550    if (roi_y_max > crop_y_max) {
1551        roi_y_max = crop_y_max;
1552    }
1553    roi->rect.width = roi_x_max - roi->rect.left;
1554    roi->rect.height = roi_y_max - roi->rect.top;
1555    return true;
1556}
1557
1558/*===========================================================================
1559 * FUNCTION   : convertLandmarks
1560 *
1561 * DESCRIPTION: helper method to extract the landmarks from face detection info
1562 *
1563 * PARAMETERS :
1564 *   @face   : cam_rect_t struct to convert
1565 *   @landmarks : int32_t destination array
1566 *
1567 *
1568 *==========================================================================*/
1569void QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
1570{
1571    landmarks[0] = face.left_eye_center.x;
1572    landmarks[1] = face.left_eye_center.y;
1573    landmarks[2] = face.right_eye_center.y;
1574    landmarks[3] = face.right_eye_center.y;
1575    landmarks[4] = face.mouth_center.x;
1576    landmarks[5] = face.mouth_center.y;
1577}
1578
1579#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1580/*===========================================================================
1581 * FUNCTION   : initCapabilities
1582 *
1583 * DESCRIPTION: initialize camera capabilities in static data struct
1584 *
1585 * PARAMETERS :
1586 *   @cameraId  : camera Id
1587 *
1588 * RETURN     : int32_t type of status
1589 *              NO_ERROR  -- success
1590 *              none-zero failure code
1591 *==========================================================================*/
1592int QCamera3HardwareInterface::initCapabilities(int cameraId)
1593{
1594    int rc = 0;
1595    mm_camera_vtbl_t *cameraHandle = NULL;
1596    QCamera3HeapMemory *capabilityHeap = NULL;
1597
1598    cameraHandle = camera_open(cameraId);
1599    if (!cameraHandle) {
1600        ALOGE("%s: camera_open failed", __func__);
1601        rc = -1;
1602        goto open_failed;
1603    }
1604
1605    capabilityHeap = new QCamera3HeapMemory();
1606    if (capabilityHeap == NULL) {
1607        ALOGE("%s: creation of capabilityHeap failed", __func__);
1608        goto heap_creation_failed;
1609    }
1610    /* Allocate memory for capability buffer */
1611    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1612    if(rc != OK) {
1613        ALOGE("%s: No memory for cappability", __func__);
1614        goto allocate_failed;
1615    }
1616
1617    /* Map memory for capability buffer */
1618    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1619    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1620                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1621                                capabilityHeap->getFd(0),
1622                                sizeof(cam_capability_t));
1623    if(rc < 0) {
1624        ALOGE("%s: failed to map capability buffer", __func__);
1625        goto map_failed;
1626    }
1627
1628    /* Query Capability */
1629    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1630    if(rc < 0) {
1631        ALOGE("%s: failed to query capability",__func__);
1632        goto query_failed;
1633    }
1634    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1635    if (!gCamCapability[cameraId]) {
1636        ALOGE("%s: out of memory", __func__);
1637        goto query_failed;
1638    }
1639    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1640                                        sizeof(cam_capability_t));
1641    rc = 0;
1642
1643query_failed:
1644    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1645                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1646map_failed:
1647    capabilityHeap->deallocate();
1648allocate_failed:
1649    delete capabilityHeap;
1650heap_creation_failed:
1651    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1652    cameraHandle = NULL;
1653open_failed:
1654    return rc;
1655}
1656
1657/*===========================================================================
1658 * FUNCTION   : initParameters
1659 *
1660 * DESCRIPTION: initialize camera parameters
1661 *
1662 * PARAMETERS :
1663 *
1664 * RETURN     : int32_t type of status
1665 *              NO_ERROR  -- success
1666 *              none-zero failure code
1667 *==========================================================================*/
1668int QCamera3HardwareInterface::initParameters()
1669{
1670    int rc = 0;
1671
1672    //Allocate Set Param Buffer
1673    mParamHeap = new QCamera3HeapMemory();
1674    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1675    if(rc != OK) {
1676        rc = NO_MEMORY;
1677        ALOGE("Failed to allocate SETPARM Heap memory");
1678        delete mParamHeap;
1679        mParamHeap = NULL;
1680        return rc;
1681    }
1682
1683    //Map memory for parameters buffer
1684    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1685            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1686            mParamHeap->getFd(0),
1687            sizeof(parm_buffer_t));
1688    if(rc < 0) {
1689        ALOGE("%s:failed to map SETPARM buffer",__func__);
1690        rc = FAILED_TRANSACTION;
1691        mParamHeap->deallocate();
1692        delete mParamHeap;
1693        mParamHeap = NULL;
1694        return rc;
1695    }
1696
1697    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1698    return rc;
1699}
1700
1701/*===========================================================================
1702 * FUNCTION   : deinitParameters
1703 *
1704 * DESCRIPTION: de-initialize camera parameters
1705 *
1706 * PARAMETERS :
1707 *
1708 * RETURN     : NONE
1709 *==========================================================================*/
1710void QCamera3HardwareInterface::deinitParameters()
1711{
1712    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
1713            CAM_MAPPING_BUF_TYPE_PARM_BUF);
1714
1715    mParamHeap->deallocate();
1716    delete mParamHeap;
1717    mParamHeap = NULL;
1718
1719    mParameters = NULL;
1720}
1721
1722/*===========================================================================
1723 * FUNCTION   : calcMaxJpegSize
1724 *
1725 * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
1726 *
1727 * PARAMETERS :
1728 *
1729 * RETURN     : max_jpeg_size
1730 *==========================================================================*/
1731int QCamera3HardwareInterface::calcMaxJpegSize()
1732{
1733    int32_t max_jpeg_size = 0;
1734    int temp_width, temp_height;
1735    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
1736        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
1737        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
1738        if (temp_width * temp_height > max_jpeg_size ) {
1739            max_jpeg_size = temp_width * temp_height;
1740        }
1741    }
1742    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
1743    return max_jpeg_size;
1744}
1745
1746/*===========================================================================
1747 * FUNCTION   : initStaticMetadata
1748 *
1749 * DESCRIPTION: initialize the static metadata
1750 *
1751 * PARAMETERS :
1752 *   @cameraId  : camera Id
1753 *
1754 * RETURN     : int32_t type of status
1755 *              0  -- success
1756 *              non-zero failure code
1757 *==========================================================================*/
1758int QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1759{
1760    int rc = 0;
1761    CameraMetadata staticInfo;
1762
1763    /* android.info: hardware level */
1764    uint8_t supportedHardwareLevel = ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED;
1765    staticInfo.update(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
1766        &supportedHardwareLevel, 1);
1767
1768    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1769    /*HAL 3 only*/
1770    /*staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
1771                    &gCamCapability[cameraId]->min_focus_distance, 1); */
1772
1773    /*hard coded for now but this should come from sensor*/
1774    float min_focus_distance;
1775    if(facingBack){
1776        min_focus_distance = 10;
1777    } else {
1778        min_focus_distance = 0;
1779    }
1780    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
1781                    &min_focus_distance, 1);
1782
1783    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1784                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1785
1786    /*should be using focal lengths but sensor doesn't provide that info now*/
1787    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1788                      &gCamCapability[cameraId]->focal_length,
1789                      1);
1790
1791    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1792                      gCamCapability[cameraId]->apertures,
1793                      gCamCapability[cameraId]->apertures_count);
1794
1795    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1796                gCamCapability[cameraId]->filter_densities,
1797                gCamCapability[cameraId]->filter_densities_count);
1798
1799
1800    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1801                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1802                      gCamCapability[cameraId]->optical_stab_modes_count);
1803
1804    staticInfo.update(ANDROID_LENS_POSITION,
1805                      gCamCapability[cameraId]->lens_position,
1806                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
1807
1808    int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
1809                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
1810    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
1811                      lens_shading_map_size,
1812                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1813
1814    int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
1815                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
1816    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
1817            geo_correction_map_size,
1818            sizeof(geo_correction_map_size)/sizeof(int32_t));
1819
1820    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
1821                       gCamCapability[cameraId]->geo_correction_map,
1822                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
1823
1824    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
1825            gCamCapability[cameraId]->sensor_physical_size, 2);
1826
1827    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
1828            gCamCapability[cameraId]->exposure_time_range, 2);
1829
1830    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
1831            &gCamCapability[cameraId]->max_frame_duration, 1);
1832
1833    camera_metadata_rational baseGainFactor = {
1834            gCamCapability[cameraId]->base_gain_factor.numerator,
1835            gCamCapability[cameraId]->base_gain_factor.denominator};
1836    staticInfo.update(ANDROID_SENSOR_BASE_GAIN_FACTOR,
1837            &baseGainFactor, 1);
1838
1839    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1840                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
1841
1842    int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
1843                                               gCamCapability[cameraId]->pixel_array_size.height};
1844    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
1845                      pixel_array_size, 2);
1846
1847    int32_t active_array_size[] = {0, 0,
1848                                                gCamCapability[cameraId]->active_array_size.width,
1849                                                gCamCapability[cameraId]->active_array_size.height};
1850    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
1851                      active_array_size, 4);
1852
1853    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
1854            &gCamCapability[cameraId]->white_level, 1);
1855
1856    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
1857            gCamCapability[cameraId]->black_level_pattern, 4);
1858
1859    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
1860                      &gCamCapability[cameraId]->flash_charge_duration, 1);
1861
1862    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
1863                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
1864
1865    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1866                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1867    /*hardcode 0 for now*/
1868    int32_t max_face_count = 0;
1869    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1870                      &max_face_count, 1);
1871
1872    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
1873                      &gCamCapability[cameraId]->histogram_size, 1);
1874
1875    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
1876            &gCamCapability[cameraId]->max_histogram_count, 1);
1877
1878    int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
1879                                                gCamCapability[cameraId]->sharpness_map_size.height};
1880
1881    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
1882            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
1883
1884    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
1885            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
1886
1887
1888    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
1889                      &gCamCapability[cameraId]->raw_min_duration,
1890                       1);
1891
1892    int32_t scalar_formats[] = {HAL_PIXEL_FORMAT_YCbCr_420_888,
1893                                                HAL_PIXEL_FORMAT_BLOB};
1894    int scalar_formats_count = sizeof(scalar_formats)/sizeof(int32_t);
1895    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1896                      scalar_formats,
1897                      scalar_formats_count);
1898
1899    int32_t available_processed_sizes[CAM_FORMAT_MAX * 2];
1900    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1901              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1902              available_processed_sizes);
1903    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1904                available_processed_sizes,
1905                (gCamCapability[cameraId]->picture_sizes_tbl_cnt) * 2);
1906
1907    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_MIN_DURATIONS,
1908                      &gCamCapability[cameraId]->jpeg_min_duration[0],
1909                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
1910
1911    int32_t available_fps_ranges[MAX_SIZES_CNT * 2];
1912    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
1913                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
1914                 available_fps_ranges);
1915    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1916            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1917
1918    camera_metadata_rational exposureCompensationStep = {
1919            gCamCapability[cameraId]->exp_compensation_step.numerator,
1920            gCamCapability[cameraId]->exp_compensation_step.denominator};
1921    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1922                      &exposureCompensationStep, 1);
1923
1924    /*TO DO*/
1925    uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1926    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1927                      availableVstabModes, sizeof(availableVstabModes));
1928
1929    /*HAL 1 and HAL 3 common*/
1930    float maxZoom = 4;
1931    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1932            &maxZoom, 1);
1933
1934    int32_t max3aRegions[] = {/*AE*/ 1,/*AWB*/ 0,/*AF*/ 1};
1935    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1936            max3aRegions, 3);
1937
1938    uint8_t availableFaceDetectModes[] = {
1939            ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1940    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1941                      availableFaceDetectModes,
1942                      sizeof(availableFaceDetectModes));
1943
1944    int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
1945                                                        gCamCapability[cameraId]->exposure_compensation_max};
1946    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
1947            exposureCompensationRange,
1948            sizeof(exposureCompensationRange)/sizeof(int32_t));
1949
1950    uint8_t lensFacing = (facingBack) ?
1951            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
1952    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1953
1954    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1955                available_processed_sizes,
1956                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1957
1958    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
1959                      available_thumbnail_sizes,
1960                      sizeof(available_thumbnail_sizes)/sizeof(int32_t));
1961
1962    int32_t max_jpeg_size = 0;
1963    int temp_width, temp_height;
1964    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
1965        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
1966        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
1967        if (temp_width * temp_height > max_jpeg_size ) {
1968            max_jpeg_size = temp_width * temp_height;
1969        }
1970    }
1971    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
1972    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
1973                      &max_jpeg_size, 1);
1974
1975    uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
1976    int32_t size = 0;
1977    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
1978        int val = lookupFwkName(EFFECT_MODES_MAP,
1979                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
1980                                   gCamCapability[cameraId]->supported_effects[i]);
1981        if (val != NAME_NOT_FOUND) {
1982            avail_effects[size] = (uint8_t)val;
1983            size++;
1984        }
1985    }
1986    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1987                      avail_effects,
1988                      size);
1989
1990    uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1991    uint8_t supported_indexes[CAM_SCENE_MODE_MAX];
1992    int32_t supported_scene_modes_cnt = 0;
1993    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
1994        int val = lookupFwkName(SCENE_MODES_MAP,
1995                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
1996                                gCamCapability[cameraId]->supported_scene_modes[i]);
1997        if (val != NAME_NOT_FOUND) {
1998            avail_scene_modes[supported_scene_modes_cnt] = (uint8_t)val;
1999            supported_indexes[supported_scene_modes_cnt] = i;
2000            supported_scene_modes_cnt++;
2001        }
2002    }
2003
2004    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
2005                      avail_scene_modes,
2006                      supported_scene_modes_cnt);
2007
2008    uint8_t scene_mode_overrides[CAM_SCENE_MODE_MAX * 3];
2009    makeOverridesList(gCamCapability[cameraId]->scene_mode_overrides,
2010                      supported_scene_modes_cnt,
2011                      scene_mode_overrides,
2012                      supported_indexes,
2013                      cameraId);
2014    staticInfo.update(ANDROID_CONTROL_SCENE_MODE_OVERRIDES,
2015                      scene_mode_overrides,
2016                      supported_scene_modes_cnt*3);
2017
2018    uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
2019    size = 0;
2020    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
2021        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
2022                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
2023                                 gCamCapability[cameraId]->supported_antibandings[i]);
2024        if (val != NAME_NOT_FOUND) {
2025            avail_antibanding_modes[size] = (uint8_t)val;
2026            size++;
2027        }
2028
2029    }
2030    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
2031                      avail_antibanding_modes,
2032                      size);
2033
2034    uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
2035    size = 0;
2036    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
2037        int val = lookupFwkName(FOCUS_MODES_MAP,
2038                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
2039                                gCamCapability[cameraId]->supported_focus_modes[i]);
2040        if (val != NAME_NOT_FOUND) {
2041            avail_af_modes[size] = (uint8_t)val;
2042            size++;
2043        }
2044    }
2045    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
2046                      avail_af_modes,
2047                      size);
2048
2049    uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
2050    size = 0;
2051    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
2052        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
2053                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
2054                                    gCamCapability[cameraId]->supported_white_balances[i]);
2055        if (val != NAME_NOT_FOUND) {
2056            avail_awb_modes[size] = (uint8_t)val;
2057            size++;
2058        }
2059    }
2060    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
2061                      avail_awb_modes,
2062                      size);
2063
2064    uint8_t available_flash_levels[CAM_FLASH_FIRING_LEVEL_MAX];
2065    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_firing_level_cnt; i++)
2066      available_flash_levels[i] = gCamCapability[cameraId]->supported_firing_levels[i];
2067
2068    staticInfo.update(ANDROID_FLASH_FIRING_POWER,
2069            available_flash_levels,
2070            gCamCapability[cameraId]->supported_flash_firing_level_cnt);
2071
2072
2073    uint8_t flashAvailable = gCamCapability[cameraId]->flash_available;
2074    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
2075            &flashAvailable, 1);
2076
2077    uint8_t avail_ae_modes[5];
2078    size = 0;
2079    for (int i = 0; i < gCamCapability[cameraId]->supported_ae_modes_cnt; i++) {
2080        avail_ae_modes[i] = gCamCapability[cameraId]->supported_ae_modes[i];
2081        size++;
2082    }
2083    if (flashAvailable) {
2084        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH;
2085        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH;
2086        avail_ae_modes[size++] = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE;
2087    }
2088    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
2089                      avail_ae_modes,
2090                      size);
2091
2092    int32_t sensitivity_range[2];
2093    sensitivity_range[0] = gCamCapability[cameraId]->sensitivity_range.min_sensitivity;
2094    sensitivity_range[1] = gCamCapability[cameraId]->sensitivity_range.max_sensitivity;
2095    staticInfo.update(ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
2096                      sensitivity_range,
2097                      sizeof(sensitivity_range) / sizeof(int32_t));
2098
2099    staticInfo.update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
2100                      &gCamCapability[cameraId]->max_analog_sensitivity,
2101                      1);
2102
2103    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS,
2104                      &gCamCapability[cameraId]->jpeg_min_duration[0],
2105                      gCamCapability[cameraId]->picture_sizes_tbl_cnt);
2106
2107    int32_t sensor_orientation = (int32_t)gCamCapability[cameraId]->sensor_mount_angle;
2108    staticInfo.update(ANDROID_SENSOR_ORIENTATION,
2109                      &sensor_orientation,
2110                      1);
2111
2112    int32_t max_output_streams[3] = {1, 3, 1};
2113    staticInfo.update(ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
2114                      max_output_streams,
2115                      3);
2116
2117    gStaticMetadata[cameraId] = staticInfo.release();
2118    return rc;
2119}
2120
2121/*===========================================================================
2122 * FUNCTION   : makeTable
2123 *
2124 * DESCRIPTION: make a table of sizes
2125 *
2126 * PARAMETERS :
2127 *
2128 *
2129 *==========================================================================*/
2130void QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
2131                                          int32_t* sizeTable)
2132{
2133    int j = 0;
2134    for (int i = 0; i < size; i++) {
2135        sizeTable[j] = dimTable[i].width;
2136        sizeTable[j+1] = dimTable[i].height;
2137        j+=2;
2138    }
2139}
2140
2141/*===========================================================================
2142 * FUNCTION   : makeFPSTable
2143 *
2144 * DESCRIPTION: make a table of fps ranges
2145 *
2146 * PARAMETERS :
2147 *
2148 *==========================================================================*/
2149void QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
2150                                          int32_t* fpsRangesTable)
2151{
2152    int j = 0;
2153    for (int i = 0; i < size; i++) {
2154        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
2155        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
2156        j+=2;
2157    }
2158}
2159
2160/*===========================================================================
2161 * FUNCTION   : makeOverridesList
2162 *
2163 * DESCRIPTION: make a list of scene mode overrides
2164 *
2165 * PARAMETERS :
2166 *
2167 *
2168 *==========================================================================*/
2169void QCamera3HardwareInterface::makeOverridesList(cam_scene_mode_overrides_t* overridesTable,
2170                                                  uint8_t size, uint8_t* overridesList,
2171                                                  uint8_t* supported_indexes,
2172                                                  int camera_id)
2173{
2174    /*daemon will give a list of overrides for all scene modes.
2175      However we should send the fwk only the overrides for the scene modes
2176      supported by the framework*/
2177    int j = 0, index = 0, supt = 0;
2178    uint8_t focus_override;
2179    for (int i = 0; i < size; i++) {
2180        supt = 0;
2181        index = supported_indexes[i];
2182        overridesList[j] = gCamCapability[camera_id]->flash_available ? ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:ANDROID_CONTROL_AE_MODE_ON;
2183        overridesList[j+1] = (uint8_t)lookupFwkName(WHITE_BALANCE_MODES_MAP,
2184                                 sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
2185                                                    overridesTable[index].awb_mode);
2186        focus_override = (uint8_t)overridesTable[index].af_mode;
2187        for (int k = 0; k < gCamCapability[camera_id]->supported_focus_modes_cnt; k++) {
2188           if (gCamCapability[camera_id]->supported_focus_modes[k] == focus_override) {
2189              supt = 1;
2190              break;
2191           }
2192        }
2193        if (supt) {
2194           overridesList[j+2] = (uint8_t)lookupFwkName(FOCUS_MODES_MAP,
2195                                              sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
2196                                              focus_override);
2197        } else {
2198           overridesList[j+2] = ANDROID_CONTROL_AF_MODE_OFF;
2199        }
2200        j+=3;
2201    }
2202}
2203
2204/*===========================================================================
2205 * FUNCTION   : getPreviewHalPixelFormat
2206 *
2207 * DESCRIPTION: convert the format to type recognized by framework
2208 *
2209 * PARAMETERS : format : the format from backend
2210 *
2211 ** RETURN    : format recognized by framework
2212 *
2213 *==========================================================================*/
2214int32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
2215{
2216    int32_t halPixelFormat;
2217
2218    switch (format) {
2219    case CAM_FORMAT_YUV_420_NV12:
2220        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
2221        break;
2222    case CAM_FORMAT_YUV_420_NV21:
2223        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2224        break;
2225    case CAM_FORMAT_YUV_420_NV21_ADRENO:
2226        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
2227        break;
2228    case CAM_FORMAT_YUV_420_YV12:
2229        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
2230        break;
2231    case CAM_FORMAT_YUV_422_NV16:
2232    case CAM_FORMAT_YUV_422_NV61:
2233    default:
2234        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
2235        break;
2236    }
2237    return halPixelFormat;
2238}
2239
2240/*===========================================================================
2241 * FUNCTION   : getSensorSensitivity
2242 *
2243 * DESCRIPTION: convert iso_mode to an integer value
2244 *
2245 * PARAMETERS : iso_mode : the iso_mode supported by sensor
2246 *
2247 ** RETURN    : sensitivity supported by sensor
2248 *
2249 *==========================================================================*/
2250int32_t QCamera3HardwareInterface::getSensorSensitivity(int32_t iso_mode)
2251{
2252    int32_t sensitivity;
2253
2254    switch (iso_mode) {
2255    case CAM_ISO_MODE_100:
2256        sensitivity = 100;
2257        break;
2258    case CAM_ISO_MODE_200:
2259        sensitivity = 200;
2260        break;
2261    case CAM_ISO_MODE_400:
2262        sensitivity = 400;
2263        break;
2264    case CAM_ISO_MODE_800:
2265        sensitivity = 800;
2266        break;
2267    case CAM_ISO_MODE_1600:
2268        sensitivity = 1600;
2269        break;
2270    default:
2271        sensitivity = -1;
2272        break;
2273    }
2274    return sensitivity;
2275}
2276
2277
2278/*===========================================================================
2279 * FUNCTION   : AddSetParmEntryToBatch
2280 *
2281 * DESCRIPTION: add set parameter entry into batch
2282 *
2283 * PARAMETERS :
2284 *   @p_table     : ptr to parameter buffer
2285 *   @paramType   : parameter type
2286 *   @paramLength : length of parameter value
2287 *   @paramValue  : ptr to parameter value
2288 *
2289 * RETURN     : int32_t type of status
2290 *              NO_ERROR  -- success
2291 *              none-zero failure code
2292 *==========================================================================*/
2293int32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
2294                                                          cam_intf_parm_type_t paramType,
2295                                                          uint32_t paramLength,
2296                                                          void *paramValue)
2297{
2298    int position = paramType;
2299    int current, next;
2300
2301    /*************************************************************************
2302    *                 Code to take care of linking next flags                *
2303    *************************************************************************/
2304    current = GET_FIRST_PARAM_ID(p_table);
2305    if (position == current){
2306        //DO NOTHING
2307    } else if (position < current){
2308        SET_NEXT_PARAM_ID(position, p_table, current);
2309        SET_FIRST_PARAM_ID(p_table, position);
2310    } else {
2311        /* Search for the position in the linked list where we need to slot in*/
2312        while (position > GET_NEXT_PARAM_ID(current, p_table))
2313            current = GET_NEXT_PARAM_ID(current, p_table);
2314
2315        /*If node already exists no need to alter linking*/
2316        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
2317            next = GET_NEXT_PARAM_ID(current, p_table);
2318            SET_NEXT_PARAM_ID(current, p_table, position);
2319            SET_NEXT_PARAM_ID(position, p_table, next);
2320        }
2321    }
2322
2323    /*************************************************************************
2324    *                   Copy contents into entry                             *
2325    *************************************************************************/
2326
2327    if (paramLength > sizeof(parm_type_t)) {
2328        ALOGE("%s:Size of input larger than max entry size",__func__);
2329        return BAD_VALUE;
2330    }
2331    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
2332    return NO_ERROR;
2333}
2334
2335/*===========================================================================
2336 * FUNCTION   : lookupFwkName
2337 *
2338 * DESCRIPTION: In case the enum is not same in fwk and backend
2339 *              make sure the parameter is correctly propogated
2340 *
2341 * PARAMETERS  :
2342 *   @arr      : map between the two enums
2343 *   @len      : len of the map
2344 *   @hal_name : name of the hal_parm to map
2345 *
2346 * RETURN     : int type of status
2347 *              fwk_name  -- success
2348 *              none-zero failure code
2349 *==========================================================================*/
2350int8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
2351                                             int len, int hal_name)
2352{
2353
2354    for (int i = 0; i < len; i++) {
2355        if (arr[i].hal_name == hal_name)
2356            return arr[i].fwk_name;
2357    }
2358
2359    /* Not able to find matching framework type is not necessarily
2360     * an error case. This happens when mm-camera supports more attributes
2361     * than the frameworks do */
2362    ALOGD("%s: Cannot find matching framework type", __func__);
2363    return NAME_NOT_FOUND;
2364}
2365
2366/*===========================================================================
2367 * FUNCTION   : lookupHalName
2368 *
2369 * DESCRIPTION: In case the enum is not same in fwk and backend
2370 *              make sure the parameter is correctly propogated
2371 *
2372 * PARAMETERS  :
2373 *   @arr      : map between the two enums
2374 *   @len      : len of the map
2375 *   @fwk_name : name of the hal_parm to map
2376 *
2377 * RETURN     : int32_t type of status
2378 *              hal_name  -- success
2379 *              none-zero failure code
2380 *==========================================================================*/
2381int8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2382                                             int len, int fwk_name)
2383{
2384    for (int i = 0; i < len; i++) {
2385       if (arr[i].fwk_name == fwk_name)
2386           return arr[i].hal_name;
2387    }
2388    ALOGE("%s: Cannot find matching hal type", __func__);
2389    return NAME_NOT_FOUND;
2390}
2391
2392/*===========================================================================
2393 * FUNCTION   : getCapabilities
2394 *
2395 * DESCRIPTION: query camera capabilities
2396 *
2397 * PARAMETERS :
2398 *   @cameraId  : camera Id
2399 *   @info      : camera info struct to be filled in with camera capabilities
2400 *
2401 * RETURN     : int32_t type of status
2402 *              NO_ERROR  -- success
2403 *              none-zero failure code
2404 *==========================================================================*/
2405int QCamera3HardwareInterface::getCamInfo(int cameraId,
2406                                    struct camera_info *info)
2407{
2408    int rc = 0;
2409
2410    if (NULL == gCamCapability[cameraId]) {
2411        rc = initCapabilities(cameraId);
2412        if (rc < 0) {
2413            //pthread_mutex_unlock(&g_camlock);
2414            return rc;
2415        }
2416    }
2417
2418    if (NULL == gStaticMetadata[cameraId]) {
2419        rc = initStaticMetadata(cameraId);
2420        if (rc < 0) {
2421            return rc;
2422        }
2423    }
2424
2425    switch(gCamCapability[cameraId]->position) {
2426    case CAM_POSITION_BACK:
2427        info->facing = CAMERA_FACING_BACK;
2428        break;
2429
2430    case CAM_POSITION_FRONT:
2431        info->facing = CAMERA_FACING_FRONT;
2432        break;
2433
2434    default:
2435        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2436        rc = -1;
2437        break;
2438    }
2439
2440
2441    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2442    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2443    info->static_camera_characteristics = gStaticMetadata[cameraId];
2444
2445    return rc;
2446}
2447
2448/*===========================================================================
2449 * FUNCTION   : translateMetadata
2450 *
2451 * DESCRIPTION: translate the metadata into camera_metadata_t
2452 *
2453 * PARAMETERS : type of the request
2454 *
2455 *
2456 * RETURN     : success: camera_metadata_t*
2457 *              failure: NULL
2458 *
2459 *==========================================================================*/
2460camera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2461{
2462    pthread_mutex_lock(&mMutex);
2463
2464    if (mDefaultMetadata[type] != NULL) {
2465        pthread_mutex_unlock(&mMutex);
2466        return mDefaultMetadata[type];
2467    }
2468    //first time we are handling this request
2469    //fill up the metadata structure using the wrapper class
2470    CameraMetadata settings;
2471    //translate from cam_capability_t to camera_metadata_tag_t
2472    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2473    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2474    int32_t defaultRequestID = 0;
2475    settings.update(ANDROID_REQUEST_ID, &defaultRequestID, 1);
2476
2477    /*control*/
2478
2479    uint8_t controlIntent = 0;
2480    switch (type) {
2481      case CAMERA3_TEMPLATE_PREVIEW:
2482        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2483        break;
2484      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2485        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2486        break;
2487      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2488        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2489        break;
2490      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2491        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2492        break;
2493      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2494        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2495        break;
2496      default:
2497        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2498        break;
2499    }
2500    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2501
2502    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
2503            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2504
2505    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2506    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2507
2508    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2509    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2510
2511    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2512    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2513
2514    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2515    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2516
2517    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2518    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2519
2520    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2521    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2522
2523    static uint8_t focusMode;
2524    if (gCamCapability[mCameraId]->supported_focus_modes_cnt > 1) {
2525        ALOGE("%s: Setting focus mode to auto", __func__);
2526        focusMode = ANDROID_CONTROL_AF_MODE_AUTO;
2527    } else {
2528        ALOGE("%s: Setting focus mode to off", __func__);
2529        focusMode = ANDROID_CONTROL_AF_MODE_OFF;
2530    }
2531    settings.update(ANDROID_CONTROL_AF_MODE, &focusMode, 1);
2532
2533    static const uint8_t aeMode = ANDROID_CONTROL_AE_MODE_ON;
2534    settings.update(ANDROID_CONTROL_AE_MODE, &aeMode, 1);
2535
2536    /*flash*/
2537    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2538    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2539
2540    static const uint8_t flashFiringLevel = CAM_FLASH_FIRING_LEVEL_4;
2541    settings.update(ANDROID_FLASH_FIRING_POWER,
2542            &flashFiringLevel, 1);
2543
2544    /* lens */
2545    float default_aperture = gCamCapability[mCameraId]->apertures[0];
2546    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2547
2548    if (gCamCapability[mCameraId]->filter_densities_count) {
2549        float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2550        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2551                        gCamCapability[mCameraId]->filter_densities_count);
2552    }
2553
2554    float default_focal_length = gCamCapability[mCameraId]->focal_length;
2555    settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2556
2557    /* Exposure time(Update the Min Exposure Time)*/
2558    int64_t default_exposure_time = gCamCapability[mCameraId]->exposure_time_range[0];
2559    settings.update(ANDROID_SENSOR_EXPOSURE_TIME, &default_exposure_time, 1);
2560
2561    /* sensitivity */
2562    static const int32_t default_sensitivity = 100;
2563    settings.update(ANDROID_SENSOR_SENSITIVITY, &default_sensitivity, 1);
2564
2565    mDefaultMetadata[type] = settings.release();
2566
2567    pthread_mutex_unlock(&mMutex);
2568    return mDefaultMetadata[type];
2569}
2570
2571/*===========================================================================
2572 * FUNCTION   : setFrameParameters
2573 *
2574 * DESCRIPTION: set parameters per frame as requested in the metadata from
2575 *              framework
2576 *
2577 * PARAMETERS :
2578 *   @frame_id  : frame number for this particular request
2579 *   @settings  : frame settings information from framework
2580 *   @streamTypeMask : bit mask of stream types on which buffers are requested
2581 *
2582 * RETURN     : success: NO_ERROR
2583 *              failure:
2584 *==========================================================================*/
2585int QCamera3HardwareInterface::setFrameParameters(int frame_id,
2586                    const camera_metadata_t *settings, uint32_t streamTypeMask)
2587{
2588    /*translate from camera_metadata_t type to parm_type_t*/
2589    int rc = 0;
2590    if (settings == NULL && mFirstRequest) {
2591        /*settings cannot be null for the first request*/
2592        return BAD_VALUE;
2593    }
2594
2595    int32_t hal_version = CAM_HAL_V3;
2596
2597    memset(mParameters, 0, sizeof(parm_buffer_t));
2598    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2599    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2600                sizeof(hal_version), &hal_version);
2601
2602    /*we need to update the frame number in the parameters*/
2603    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2604                                sizeof(frame_id), &frame_id);
2605    if (rc < 0) {
2606        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2607        return BAD_VALUE;
2608    }
2609
2610    /* Update stream id mask where buffers are requested */
2611    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_STREAM_TYPE_MASK,
2612                                sizeof(streamTypeMask), &streamTypeMask);
2613    if (rc < 0) {
2614        ALOGE("%s: Failed to set stream type mask in the parameters", __func__);
2615        return BAD_VALUE;
2616    }
2617
2618    if(settings != NULL){
2619        rc = translateMetadataToParameters(settings);
2620    }
2621    /*set the parameters to backend*/
2622    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
2623    return rc;
2624}
2625
2626/*===========================================================================
2627 * FUNCTION   : translateMetadataToParameters
2628 *
2629 * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
2630 *
2631 *
2632 * PARAMETERS :
2633 *   @settings  : frame settings information from framework
2634 *
2635 *
2636 * RETURN     : success: NO_ERROR
2637 *              failure:
2638 *==========================================================================*/
2639int QCamera3HardwareInterface::translateMetadataToParameters
2640                                  (const camera_metadata_t *settings)
2641{
2642    int rc = 0;
2643    CameraMetadata frame_settings;
2644    frame_settings = settings;
2645
2646
2647    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
2648        int32_t antibandingMode =
2649            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
2650        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
2651                sizeof(antibandingMode), &antibandingMode);
2652    }
2653
2654    if (frame_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
2655        int32_t expCompensation = frame_settings.find(
2656            ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
2657        if (expCompensation < gCamCapability[mCameraId]->exposure_compensation_min)
2658            expCompensation = gCamCapability[mCameraId]->exposure_compensation_min;
2659        if (expCompensation > gCamCapability[mCameraId]->exposure_compensation_max)
2660            expCompensation = gCamCapability[mCameraId]->exposure_compensation_max;
2661        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
2662          sizeof(expCompensation), &expCompensation);
2663    }
2664
2665    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
2666        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
2667        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
2668                sizeof(aeLock), &aeLock);
2669    }
2670    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
2671        cam_fps_range_t fps_range;
2672        fps_range.min_fps =
2673            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
2674        fps_range.max_fps =
2675            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[1];
2676        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
2677                sizeof(fps_range), &fps_range);
2678    }
2679
2680    float focalDistance = -1.0;
2681    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
2682        focalDistance = frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
2683        rc = AddSetParmEntryToBatch(mParameters,
2684                CAM_INTF_META_LENS_FOCUS_DISTANCE,
2685                sizeof(focalDistance), &focalDistance);
2686    }
2687
2688    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
2689        uint8_t fwk_focusMode =
2690            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
2691        uint8_t focusMode;
2692        if (focalDistance == 0.0 && fwk_focusMode == ANDROID_CONTROL_AF_MODE_OFF) {
2693            focusMode = CAM_FOCUS_MODE_INFINITY;
2694        } else{
2695         focusMode = lookupHalName(FOCUS_MODES_MAP,
2696                                   sizeof(FOCUS_MODES_MAP),
2697                                   fwk_focusMode);
2698        }
2699        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
2700                sizeof(focusMode), &focusMode);
2701    }
2702
2703    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
2704        uint8_t awbLock =
2705            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
2706        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
2707                sizeof(awbLock), &awbLock);
2708    }
2709
2710    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
2711        uint8_t fwk_whiteLevel =
2712            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
2713        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
2714                sizeof(WHITE_BALANCE_MODES_MAP),
2715                fwk_whiteLevel);
2716        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
2717                sizeof(whiteLevel), &whiteLevel);
2718    }
2719
2720    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
2721        uint8_t fwk_effectMode =
2722            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
2723        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
2724                sizeof(EFFECT_MODES_MAP),
2725                fwk_effectMode);
2726        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
2727                sizeof(effectMode), &effectMode);
2728    }
2729
2730    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
2731        uint8_t fwk_aeMode =
2732            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2733        uint8_t aeMode;
2734        int32_t redeye;
2735
2736        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_OFF ) {
2737            aeMode = CAM_AE_MODE_OFF;
2738        } else {
2739            aeMode = CAM_AE_MODE_ON;
2740        }
2741        if (fwk_aeMode == ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
2742            redeye = 1;
2743        } else {
2744            redeye = 0;
2745        }
2746
2747        int32_t flashMode = (int32_t)lookupHalName(AE_FLASH_MODE_MAP,
2748                                          sizeof(AE_FLASH_MODE_MAP),
2749                                          fwk_aeMode);
2750        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
2751                sizeof(aeMode), &aeMode);
2752        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2753                sizeof(flashMode), &flashMode);
2754        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_REDEYE_REDUCTION,
2755                sizeof(redeye), &redeye);
2756    }
2757
2758    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
2759        uint8_t colorCorrectMode =
2760            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
2761        rc =
2762            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
2763                    sizeof(colorCorrectMode), &colorCorrectMode);
2764    }
2765
2766    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_GAINS)) {
2767        cam_color_correct_gains_t colorCorrectGains;
2768        for (int i = 0; i < 4; i++) {
2769            colorCorrectGains.gains[i] =
2770                frame_settings.find(ANDROID_COLOR_CORRECTION_GAINS).data.f[i];
2771        }
2772        rc =
2773            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_GAINS,
2774                    sizeof(colorCorrectGains), &colorCorrectGains);
2775    }
2776
2777    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_TRANSFORM)) {
2778        cam_color_correct_matrix_t colorCorrectTransform;
2779        cam_rational_type_t transform_elem;
2780        int num = 0;
2781        for (int i = 0; i < 3; i++) {
2782           for (int j = 0; j < 3; j++) {
2783              transform_elem.numerator =
2784                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].numerator;
2785              transform_elem.denominator =
2786                 frame_settings.find(ANDROID_COLOR_CORRECTION_TRANSFORM).data.r[num].denominator;
2787              colorCorrectTransform.transform_matrix[i][j] = transform_elem;
2788              num++;
2789           }
2790        }
2791        rc =
2792            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_TRANSFORM,
2793                    sizeof(colorCorrectTransform), &colorCorrectTransform);
2794    }
2795
2796    cam_trigger_t aecTrigger;
2797    aecTrigger.trigger = CAM_AEC_TRIGGER_IDLE;
2798    aecTrigger.trigger_id = -1;
2799    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)&&
2800        frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_ID)) {
2801        aecTrigger.trigger =
2802            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
2803        aecTrigger.trigger_id =
2804            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_ID).data.i32[0];
2805    }
2806    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
2807                                sizeof(aecTrigger), &aecTrigger);
2808
2809    /*af_trigger must come with a trigger id*/
2810    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER) &&
2811        frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER_ID)) {
2812        cam_trigger_t af_trigger;
2813        af_trigger.trigger =
2814            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
2815        af_trigger.trigger_id =
2816            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER_ID).data.i32[0];
2817        rc = AddSetParmEntryToBatch(mParameters,
2818                CAM_INTF_META_AF_TRIGGER, sizeof(af_trigger), &af_trigger);
2819    }
2820
2821    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
2822        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
2823        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
2824                sizeof(metaMode), &metaMode);
2825        if (metaMode == ANDROID_CONTROL_MODE_USE_SCENE_MODE) {
2826           uint8_t fwk_sceneMode = frame_settings.find(ANDROID_CONTROL_SCENE_MODE).data.u8[0];
2827           uint8_t sceneMode = lookupHalName(SCENE_MODES_MAP,
2828                                             sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
2829                                             fwk_sceneMode);
2830           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2831                sizeof(sceneMode), &sceneMode);
2832        } else if (metaMode == ANDROID_CONTROL_MODE_OFF) {
2833           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2834           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2835                sizeof(sceneMode), &sceneMode);
2836        } else if (metaMode == ANDROID_CONTROL_MODE_AUTO) {
2837           uint8_t sceneMode = 0;//CAMERA_BESTSHOT_OFF;
2838           rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_BESTSHOT_MODE,
2839                sizeof(sceneMode), &sceneMode);
2840        }
2841    }
2842
2843    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
2844        int32_t demosaic =
2845            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
2846        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
2847                sizeof(demosaic), &demosaic);
2848    }
2849
2850    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
2851        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
2852        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE_MODE,
2853                sizeof(edgeMode), &edgeMode);
2854    }
2855
2856    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
2857        int32_t edgeStrength =
2858            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
2859        rc = AddSetParmEntryToBatch(mParameters,
2860                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
2861    }
2862
2863    if (frame_settings.exists(ANDROID_FLASH_MODE)) {
2864        int32_t respectFlashMode = 1;
2865        if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
2866            uint8_t fwk_aeMode =
2867                frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2868            if (fwk_aeMode > ANDROID_CONTROL_AE_MODE_ON) {
2869                respectFlashMode = 0;
2870                ALOGI("%s: AE Mode controls flash, ignore android.flash.mode",
2871                    __func__);
2872            }
2873        }
2874        if (respectFlashMode) {
2875            uint8_t flashMode =
2876                frame_settings.find(ANDROID_FLASH_MODE).data.u8[0];
2877            flashMode = (int32_t)lookupHalName(FLASH_MODES_MAP,
2878                                          sizeof(FLASH_MODES_MAP),
2879                                          flashMode);
2880            ALOGI("%s: flash mode after mapping %d", __func__, flashMode);
2881            // To check: CAM_INTF_META_FLASH_MODE usage
2882            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_LED_MODE,
2883                          sizeof(flashMode), &flashMode);
2884        }
2885    }
2886
2887    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
2888        uint8_t flashPower =
2889            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
2890        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
2891                sizeof(flashPower), &flashPower);
2892    }
2893
2894    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
2895        int64_t flashFiringTime =
2896            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
2897        rc = AddSetParmEntryToBatch(mParameters,
2898                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
2899    }
2900
2901    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
2902        uint8_t hotPixelMode =
2903            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
2904        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
2905                sizeof(hotPixelMode), &hotPixelMode);
2906    }
2907
2908    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
2909        float lensAperture =
2910            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
2911        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
2912                sizeof(lensAperture), &lensAperture);
2913    }
2914
2915    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
2916        float filterDensity =
2917            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
2918        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
2919                sizeof(filterDensity), &filterDensity);
2920    }
2921
2922    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
2923        float focalLength =
2924            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
2925        rc = AddSetParmEntryToBatch(mParameters,
2926                CAM_INTF_META_LENS_FOCAL_LENGTH,
2927                sizeof(focalLength), &focalLength);
2928    }
2929
2930    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
2931        uint8_t optStabMode =
2932            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
2933        rc = AddSetParmEntryToBatch(mParameters,
2934                CAM_INTF_META_LENS_OPT_STAB_MODE,
2935                sizeof(optStabMode), &optStabMode);
2936    }
2937
2938    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
2939        uint8_t noiseRedMode =
2940            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
2941        rc = AddSetParmEntryToBatch(mParameters,
2942                CAM_INTF_META_NOISE_REDUCTION_MODE,
2943                sizeof(noiseRedMode), &noiseRedMode);
2944    }
2945
2946    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
2947        uint8_t noiseRedStrength =
2948            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
2949        rc = AddSetParmEntryToBatch(mParameters,
2950                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
2951                sizeof(noiseRedStrength), &noiseRedStrength);
2952    }
2953
2954    cam_crop_region_t scalerCropRegion;
2955    bool scalerCropSet = false;
2956    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
2957        scalerCropRegion.left =
2958            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
2959        scalerCropRegion.top =
2960            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
2961        scalerCropRegion.width =
2962            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
2963        scalerCropRegion.height =
2964            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[3];
2965        rc = AddSetParmEntryToBatch(mParameters,
2966                CAM_INTF_META_SCALER_CROP_REGION,
2967                sizeof(scalerCropRegion), &scalerCropRegion);
2968        scalerCropSet = true;
2969    }
2970
2971    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
2972        int64_t sensorExpTime =
2973            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
2974        rc = AddSetParmEntryToBatch(mParameters,
2975                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
2976                sizeof(sensorExpTime), &sensorExpTime);
2977    }
2978
2979    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
2980        int64_t sensorFrameDuration =
2981            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
2982        if (sensorFrameDuration > gCamCapability[mCameraId]->max_frame_duration)
2983            sensorFrameDuration = gCamCapability[mCameraId]->max_frame_duration;
2984        rc = AddSetParmEntryToBatch(mParameters,
2985                CAM_INTF_META_SENSOR_FRAME_DURATION,
2986                sizeof(sensorFrameDuration), &sensorFrameDuration);
2987    }
2988
2989    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
2990        int32_t sensorSensitivity =
2991            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
2992        if (sensorSensitivity <
2993                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity)
2994            sensorSensitivity =
2995                gCamCapability[mCameraId]->sensitivity_range.min_sensitivity;
2996        if (sensorSensitivity >
2997                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity)
2998            sensorSensitivity =
2999                gCamCapability[mCameraId]->sensitivity_range.max_sensitivity;
3000        rc = AddSetParmEntryToBatch(mParameters,
3001                CAM_INTF_META_SENSOR_SENSITIVITY,
3002                sizeof(sensorSensitivity), &sensorSensitivity);
3003    }
3004
3005    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
3006        int32_t shadingMode =
3007            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
3008        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
3009                sizeof(shadingMode), &shadingMode);
3010    }
3011
3012    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
3013        uint8_t shadingStrength =
3014            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
3015        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
3016                sizeof(shadingStrength), &shadingStrength);
3017    }
3018
3019    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
3020        uint8_t facedetectMode =
3021            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
3022        rc = AddSetParmEntryToBatch(mParameters,
3023                CAM_INTF_META_STATS_FACEDETECT_MODE,
3024                sizeof(facedetectMode), &facedetectMode);
3025    }
3026
3027    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
3028        uint8_t histogramMode =
3029            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
3030        rc = AddSetParmEntryToBatch(mParameters,
3031                CAM_INTF_META_STATS_HISTOGRAM_MODE,
3032                sizeof(histogramMode), &histogramMode);
3033    }
3034
3035    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
3036        uint8_t sharpnessMapMode =
3037            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
3038        rc = AddSetParmEntryToBatch(mParameters,
3039                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
3040                sizeof(sharpnessMapMode), &sharpnessMapMode);
3041    }
3042
3043    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
3044        uint8_t tonemapMode =
3045            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
3046        rc = AddSetParmEntryToBatch(mParameters,
3047                CAM_INTF_META_TONEMAP_MODE,
3048                sizeof(tonemapMode), &tonemapMode);
3049    }
3050    int point = 0;
3051    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_BLUE)) {
3052        cam_tonemap_curve_t tonemapCurveBlue;
3053        tonemapCurveBlue.tonemap_points_cnt =
3054           gCamCapability[mCameraId]->max_tone_map_curve_points;
3055        for (int i = 0; i < tonemapCurveBlue.tonemap_points_cnt; i++) {
3056            for (int j = 0; j < 2; j++) {
3057               tonemapCurveBlue.tonemap_points[i][j] =
3058                  frame_settings.find(ANDROID_TONEMAP_CURVE_BLUE).data.f[point];
3059               point++;
3060            }
3061        }
3062        rc = AddSetParmEntryToBatch(mParameters,
3063                CAM_INTF_META_TONEMAP_CURVE_BLUE,
3064                sizeof(tonemapCurveBlue), &tonemapCurveBlue);
3065    }
3066    point = 0;
3067    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_GREEN)) {
3068        cam_tonemap_curve_t tonemapCurveGreen;
3069        tonemapCurveGreen.tonemap_points_cnt =
3070           gCamCapability[mCameraId]->max_tone_map_curve_points;
3071        for (int i = 0; i < tonemapCurveGreen.tonemap_points_cnt; i++) {
3072            for (int j = 0; j < 2; j++) {
3073               tonemapCurveGreen.tonemap_points[i][j] =
3074                  frame_settings.find(ANDROID_TONEMAP_CURVE_GREEN).data.f[point];
3075               point++;
3076            }
3077        }
3078        rc = AddSetParmEntryToBatch(mParameters,
3079                CAM_INTF_META_TONEMAP_CURVE_GREEN,
3080                sizeof(tonemapCurveGreen), &tonemapCurveGreen);
3081    }
3082    point = 0;
3083    if (frame_settings.exists(ANDROID_TONEMAP_CURVE_RED)) {
3084        cam_tonemap_curve_t tonemapCurveRed;
3085        tonemapCurveRed.tonemap_points_cnt =
3086           gCamCapability[mCameraId]->max_tone_map_curve_points;
3087        for (int i = 0; i < tonemapCurveRed.tonemap_points_cnt; i++) {
3088            for (int j = 0; j < 2; j++) {
3089               tonemapCurveRed.tonemap_points[i][j] =
3090                  frame_settings.find(ANDROID_TONEMAP_CURVE_RED).data.f[point];
3091               point++;
3092            }
3093        }
3094        rc = AddSetParmEntryToBatch(mParameters,
3095                CAM_INTF_META_TONEMAP_CURVE_RED,
3096                sizeof(tonemapCurveRed), &tonemapCurveRed);
3097    }
3098
3099    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
3100        uint8_t captureIntent =
3101            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
3102        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
3103                sizeof(captureIntent), &captureIntent);
3104    }
3105
3106    if (frame_settings.exists(ANDROID_BLACK_LEVEL_LOCK)) {
3107        uint8_t blackLevelLock =
3108            frame_settings.find(ANDROID_BLACK_LEVEL_LOCK).data.u8[0];
3109        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_BLACK_LEVEL_LOCK,
3110                sizeof(blackLevelLock), &blackLevelLock);
3111    }
3112
3113    if (frame_settings.exists(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE)) {
3114        uint8_t lensShadingMapMode =
3115            frame_settings.find(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE).data.u8[0];
3116        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_SHADING_MAP_MODE,
3117                sizeof(lensShadingMapMode), &lensShadingMapMode);
3118    }
3119
3120    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
3121        cam_area_t roi;
3122        bool reset = true;
3123        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
3124        if (scalerCropSet) {
3125            reset = resetIfNeededROI(&roi, &scalerCropRegion);
3126        }
3127        if (reset) {
3128            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
3129                    sizeof(roi), &roi);
3130        }
3131    }
3132
3133    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
3134        cam_area_t roi;
3135        bool reset = true;
3136        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
3137        if (scalerCropSet) {
3138            reset = resetIfNeededROI(&roi, &scalerCropRegion);
3139        }
3140        if (reset) {
3141            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
3142                    sizeof(roi), &roi);
3143        }
3144    }
3145
3146    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
3147        cam_area_t roi;
3148        bool reset = true;
3149        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
3150        if (scalerCropSet) {
3151            reset = resetIfNeededROI(&roi, &scalerCropRegion);
3152        }
3153        if (reset) {
3154            rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
3155                    sizeof(roi), &roi);
3156        }
3157    }
3158    return rc;
3159}
3160
3161/*===========================================================================
3162 * FUNCTION   : getJpegSettings
3163 *
3164 * DESCRIPTION: save the jpeg settings in the HAL
3165 *
3166 *
3167 * PARAMETERS :
3168 *   @settings  : frame settings information from framework
3169 *
3170 *
3171 * RETURN     : success: NO_ERROR
3172 *              failure:
3173 *==========================================================================*/
3174int QCamera3HardwareInterface::getJpegSettings
3175                                  (const camera_metadata_t *settings)
3176{
3177    if (mJpegSettings) {
3178        if (mJpegSettings->gps_timestamp) {
3179            free(mJpegSettings->gps_timestamp);
3180            mJpegSettings->gps_timestamp = NULL;
3181        }
3182        if (mJpegSettings->gps_coordinates) {
3183            for (int i = 0; i < 3; i++) {
3184                free(mJpegSettings->gps_coordinates[i]);
3185                mJpegSettings->gps_coordinates[i] = NULL;
3186            }
3187        }
3188        free(mJpegSettings);
3189        mJpegSettings = NULL;
3190    }
3191    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
3192    CameraMetadata jpeg_settings;
3193    jpeg_settings = settings;
3194
3195    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
3196        mJpegSettings->jpeg_orientation =
3197            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
3198    } else {
3199        mJpegSettings->jpeg_orientation = 0;
3200    }
3201    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
3202        mJpegSettings->jpeg_quality =
3203            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
3204    } else {
3205        mJpegSettings->jpeg_quality = 85;
3206    }
3207    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
3208        mJpegSettings->thumbnail_size.width =
3209            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
3210        mJpegSettings->thumbnail_size.height =
3211            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
3212    } else {
3213        mJpegSettings->thumbnail_size.width = 0;
3214        mJpegSettings->thumbnail_size.height = 0;
3215    }
3216    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
3217        for (int i = 0; i < 3; i++) {
3218            mJpegSettings->gps_coordinates[i] = (double*)malloc(sizeof(double*));
3219            *(mJpegSettings->gps_coordinates[i]) =
3220                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
3221        }
3222    } else{
3223       for (int i = 0; i < 3; i++) {
3224            mJpegSettings->gps_coordinates[i] = NULL;
3225        }
3226    }
3227
3228    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
3229        mJpegSettings->gps_timestamp = (int64_t*)malloc(sizeof(int64_t*));
3230        *(mJpegSettings->gps_timestamp) =
3231            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
3232    } else {
3233        mJpegSettings->gps_timestamp = NULL;
3234    }
3235
3236    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
3237        int len = jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).count;
3238        for (int i = 0; i < len; i++) {
3239            mJpegSettings->gps_processing_method[i] =
3240                jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[i];
3241        }
3242        if (mJpegSettings->gps_processing_method[len-1] != '\0') {
3243            mJpegSettings->gps_processing_method[len] = '\0';
3244        }
3245    } else {
3246        mJpegSettings->gps_processing_method[0] = '\0';
3247    }
3248
3249    mJpegSettings->sensor_sensitivity = mMetadataResponse.iso_speed;
3250
3251    mJpegSettings->sensor_exposure_time = mMetadataResponse.exposure_time;
3252
3253    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
3254        mJpegSettings->lens_focal_length =
3255            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
3256    }
3257    if (jpeg_settings.exists(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)) {
3258        mJpegSettings->exposure_compensation =
3259            jpeg_settings.find(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION).data.i32[0];
3260    }
3261    mJpegSettings->exposure_comp_step = gCamCapability[mCameraId]->exp_compensation_step;
3262    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
3263    mJpegSettings->is_jpeg_format = true;
3264    mJpegSettings->min_required_pp_mask = gCamCapability[mCameraId]->min_required_pp_mask;
3265    return 0;
3266}
3267
3268/*===========================================================================
3269 * FUNCTION   : captureResultCb
3270 *
3271 * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
3272 *
3273 * PARAMETERS :
3274 *   @frame  : frame information from mm-camera-interface
3275 *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
3276 *   @userdata: userdata
3277 *
3278 * RETURN     : NONE
3279 *==========================================================================*/
3280void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
3281                camera3_stream_buffer_t *buffer,
3282                uint32_t frame_number, void *userdata)
3283{
3284    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
3285    if (hw == NULL) {
3286        ALOGE("%s: Invalid hw %p", __func__, hw);
3287        return;
3288    }
3289
3290    hw->captureResultCb(metadata, buffer, frame_number);
3291    return;
3292}
3293
3294
3295/*===========================================================================
3296 * FUNCTION   : initialize
3297 *
3298 * DESCRIPTION: Pass framework callback pointers to HAL
3299 *
3300 * PARAMETERS :
3301 *
3302 *
3303 * RETURN     : Success : 0
3304 *              Failure: -ENODEV
3305 *==========================================================================*/
3306
3307int QCamera3HardwareInterface::initialize(const struct camera3_device *device,
3308                                  const camera3_callback_ops_t *callback_ops)
3309{
3310    ALOGV("%s: E", __func__);
3311    QCamera3HardwareInterface *hw =
3312        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3313    if (!hw) {
3314        ALOGE("%s: NULL camera device", __func__);
3315        return -ENODEV;
3316    }
3317
3318    int rc = hw->initialize(callback_ops);
3319    ALOGV("%s: X", __func__);
3320    return rc;
3321}
3322
3323/*===========================================================================
3324 * FUNCTION   : configure_streams
3325 *
3326 * DESCRIPTION:
3327 *
3328 * PARAMETERS :
3329 *
3330 *
3331 * RETURN     : Success: 0
3332 *              Failure: -EINVAL (if stream configuration is invalid)
3333 *                       -ENODEV (fatal error)
3334 *==========================================================================*/
3335
3336int QCamera3HardwareInterface::configure_streams(
3337        const struct camera3_device *device,
3338        camera3_stream_configuration_t *stream_list)
3339{
3340    ALOGV("%s: E", __func__);
3341    QCamera3HardwareInterface *hw =
3342        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3343    if (!hw) {
3344        ALOGE("%s: NULL camera device", __func__);
3345        return -ENODEV;
3346    }
3347    int rc = hw->configureStreams(stream_list);
3348    ALOGV("%s: X", __func__);
3349    return rc;
3350}
3351
3352/*===========================================================================
3353 * FUNCTION   : register_stream_buffers
3354 *
3355 * DESCRIPTION: Register stream buffers with the device
3356 *
3357 * PARAMETERS :
3358 *
3359 * RETURN     :
3360 *==========================================================================*/
3361int QCamera3HardwareInterface::register_stream_buffers(
3362        const struct camera3_device *device,
3363        const camera3_stream_buffer_set_t *buffer_set)
3364{
3365    ALOGV("%s: E", __func__);
3366    QCamera3HardwareInterface *hw =
3367        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3368    if (!hw) {
3369        ALOGE("%s: NULL camera device", __func__);
3370        return -ENODEV;
3371    }
3372    int rc = hw->registerStreamBuffers(buffer_set);
3373    ALOGV("%s: X", __func__);
3374    return rc;
3375}
3376
3377/*===========================================================================
3378 * FUNCTION   : construct_default_request_settings
3379 *
3380 * DESCRIPTION: Configure a settings buffer to meet the required use case
3381 *
3382 * PARAMETERS :
3383 *
3384 *
3385 * RETURN     : Success: Return valid metadata
3386 *              Failure: Return NULL
3387 *==========================================================================*/
3388const camera_metadata_t* QCamera3HardwareInterface::
3389    construct_default_request_settings(const struct camera3_device *device,
3390                                        int type)
3391{
3392
3393    ALOGV("%s: E", __func__);
3394    camera_metadata_t* fwk_metadata = NULL;
3395    QCamera3HardwareInterface *hw =
3396        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3397    if (!hw) {
3398        ALOGE("%s: NULL camera device", __func__);
3399        return NULL;
3400    }
3401
3402    fwk_metadata = hw->translateCapabilityToMetadata(type);
3403
3404    ALOGV("%s: X", __func__);
3405    return fwk_metadata;
3406}
3407
3408/*===========================================================================
3409 * FUNCTION   : process_capture_request
3410 *
3411 * DESCRIPTION:
3412 *
3413 * PARAMETERS :
3414 *
3415 *
3416 * RETURN     :
3417 *==========================================================================*/
3418int QCamera3HardwareInterface::process_capture_request(
3419                    const struct camera3_device *device,
3420                    camera3_capture_request_t *request)
3421{
3422    ALOGV("%s: E", __func__);
3423    QCamera3HardwareInterface *hw =
3424        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3425    if (!hw) {
3426        ALOGE("%s: NULL camera device", __func__);
3427        return -EINVAL;
3428    }
3429
3430    int rc = hw->processCaptureRequest(request);
3431    ALOGV("%s: X", __func__);
3432    return rc;
3433}
3434
3435/*===========================================================================
3436 * FUNCTION   : get_metadata_vendor_tag_ops
3437 *
3438 * DESCRIPTION:
3439 *
3440 * PARAMETERS :
3441 *
3442 *
3443 * RETURN     :
3444 *==========================================================================*/
3445
3446void QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
3447                const struct camera3_device *device,
3448                vendor_tag_query_ops_t* ops)
3449{
3450    ALOGV("%s: E", __func__);
3451    QCamera3HardwareInterface *hw =
3452        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3453    if (!hw) {
3454        ALOGE("%s: NULL camera device", __func__);
3455        return;
3456    }
3457
3458    hw->getMetadataVendorTagOps(ops);
3459    ALOGV("%s: X", __func__);
3460    return;
3461}
3462
3463/*===========================================================================
3464 * FUNCTION   : dump
3465 *
3466 * DESCRIPTION:
3467 *
3468 * PARAMETERS :
3469 *
3470 *
3471 * RETURN     :
3472 *==========================================================================*/
3473
3474void QCamera3HardwareInterface::dump(
3475                const struct camera3_device *device, int fd)
3476{
3477    ALOGV("%s: E", __func__);
3478    QCamera3HardwareInterface *hw =
3479        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
3480    if (!hw) {
3481        ALOGE("%s: NULL camera device", __func__);
3482        return;
3483    }
3484
3485    hw->dump(fd);
3486    ALOGV("%s: X", __func__);
3487    return;
3488}
3489
3490/*===========================================================================
3491 * FUNCTION   : close_camera_device
3492 *
3493 * DESCRIPTION:
3494 *
3495 * PARAMETERS :
3496 *
3497 *
3498 * RETURN     :
3499 *==========================================================================*/
3500int QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
3501{
3502    ALOGV("%s: E", __func__);
3503    int ret = NO_ERROR;
3504    QCamera3HardwareInterface *hw =
3505        reinterpret_cast<QCamera3HardwareInterface *>(
3506            reinterpret_cast<camera3_device_t *>(device)->priv);
3507    if (!hw) {
3508        ALOGE("NULL camera device");
3509        return BAD_VALUE;
3510    }
3511    delete hw;
3512
3513    pthread_mutex_lock(&mCameraSessionLock);
3514    mCameraSessionActive = 0;
3515    pthread_mutex_unlock(&mCameraSessionLock);
3516    ALOGV("%s: X", __func__);
3517    return ret;
3518}
3519
3520/*===========================================================================
3521 * FUNCTION   : getWaveletDenoiseProcessPlate
3522 *
3523 * DESCRIPTION: query wavelet denoise process plate
3524 *
3525 * PARAMETERS : None
3526 *
3527 * RETURN     : WNR prcocess plate vlaue
3528 *==========================================================================*/
3529cam_denoise_process_type_t QCamera3HardwareInterface::getWaveletDenoiseProcessPlate()
3530{
3531    char prop[PROPERTY_VALUE_MAX];
3532    memset(prop, 0, sizeof(prop));
3533    property_get("persist.denoise.process.plates", prop, "0");
3534    int processPlate = atoi(prop);
3535    switch(processPlate) {
3536    case 0:
3537        return CAM_WAVELET_DENOISE_YCBCR_PLANE;
3538    case 1:
3539        return CAM_WAVELET_DENOISE_CBCR_ONLY;
3540    case 2:
3541        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
3542    case 3:
3543        return CAM_WAVELET_DENOISE_STREAMLINED_CBCR;
3544    default:
3545        return CAM_WAVELET_DENOISE_STREAMLINE_YCBCR;
3546    }
3547}
3548
3549/*===========================================================================
3550 * FUNCTION   : needRotationReprocess
3551 *
3552 * DESCRIPTION: if rotation needs to be done by reprocess in pp
3553 *
3554 * PARAMETERS : none
3555 *
3556 * RETURN     : true: needed
3557 *              false: no need
3558 *==========================================================================*/
3559bool QCamera3HardwareInterface::needRotationReprocess()
3560{
3561
3562    if (!mJpegSettings->is_jpeg_format) {
3563        // RAW image, no need to reprocess
3564        return false;
3565    }
3566
3567    if ((gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
3568        mJpegSettings->jpeg_orientation > 0) {
3569        // current rotation is not zero, and pp has the capability to process rotation
3570        ALOGD("%s: need do reprocess for rotation", __func__);
3571        return true;
3572    }
3573
3574    return false;
3575}
3576
3577/*===========================================================================
3578 * FUNCTION   : needReprocess
3579 *
3580 * DESCRIPTION: if reprocess in needed
3581 *
3582 * PARAMETERS : none
3583 *
3584 * RETURN     : true: needed
3585 *              false: no need
3586 *==========================================================================*/
3587bool QCamera3HardwareInterface::needReprocess()
3588{
3589    if (!mJpegSettings->is_jpeg_format) {
3590        // RAW image, no need to reprocess
3591        return false;
3592    }
3593
3594    if ((mJpegSettings->min_required_pp_mask > 0) ||
3595         isWNREnabled()) {
3596        // TODO: add for ZSL HDR later
3597        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
3598        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
3599        return true;
3600    }
3601    return needRotationReprocess();
3602}
3603
3604/*===========================================================================
3605 * FUNCTION   : addOnlineReprocChannel
3606 *
3607 * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
3608 *              coming from input channel
3609 *
3610 * PARAMETERS :
3611 *   @pInputChannel : ptr to input channel whose frames will be post-processed
3612 *
3613 * RETURN     : Ptr to the newly created channel obj. NULL if failed.
3614 *==========================================================================*/
3615QCamera3ReprocessChannel *QCamera3HardwareInterface::addOnlineReprocChannel(
3616                                                      QCamera3Channel *pInputChannel, QCamera3PicChannel *picChHandle)
3617{
3618    int32_t rc = NO_ERROR;
3619    QCamera3ReprocessChannel *pChannel = NULL;
3620    if (pInputChannel == NULL) {
3621        ALOGE("%s: input channel obj is NULL", __func__);
3622        return NULL;
3623    }
3624
3625    pChannel = new QCamera3ReprocessChannel(mCameraHandle->camera_handle,
3626            mCameraHandle->ops, NULL, pInputChannel->mPaddingInfo, this, picChHandle);
3627    if (NULL == pChannel) {
3628        ALOGE("%s: no mem for reprocess channel", __func__);
3629        return NULL;
3630    }
3631
3632    // Capture channel, only need snapshot and postview streams start together
3633    mm_camera_channel_attr_t attr;
3634    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
3635    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
3636    attr.max_unmatched_frames = getMaxUnmatchedFramesInQueue();
3637    rc = pChannel->initialize();
3638    if (rc != NO_ERROR) {
3639        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
3640        delete pChannel;
3641        return NULL;
3642    }
3643
3644    // pp feature config
3645    cam_pp_feature_config_t pp_config;
3646    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
3647    if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
3648        pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
3649        pp_config.sharpness = 10;
3650    }
3651
3652    if (isWNREnabled()) {
3653        pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
3654        pp_config.denoise2d.denoise_enable = 1;
3655        pp_config.denoise2d.process_plates = getWaveletDenoiseProcessPlate();
3656    }
3657    if (needRotationReprocess()) {
3658        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
3659        int rotation = mJpegSettings->jpeg_orientation;
3660        if (rotation == 0) {
3661            pp_config.rotation = ROTATE_0;
3662        } else if (rotation == 90) {
3663            pp_config.rotation = ROTATE_90;
3664        } else if (rotation == 180) {
3665            pp_config.rotation = ROTATE_180;
3666        } else if (rotation == 270) {
3667            pp_config.rotation = ROTATE_270;
3668        }
3669    }
3670
3671   rc = pChannel->addReprocStreamsFromSource(pp_config,
3672                                             pInputChannel,
3673                                             mMetadataChannel);
3674
3675    if (rc != NO_ERROR) {
3676        delete pChannel;
3677        return NULL;
3678    }
3679    return pChannel;
3680}
3681
3682int QCamera3HardwareInterface::getMaxUnmatchedFramesInQueue()
3683{
3684    return gCamCapability[mCameraId]->min_num_pp_bufs;
3685}
3686
3687bool QCamera3HardwareInterface::isWNREnabled() {
3688    return gCamCapability[mCameraId]->isWnrSupported;
3689}
3690
3691}; //end namespace qcamera
3692