QCamera3HWI.cpp revision 59a548ac1f29a32e40d5de6c3d911469ccdb3f73
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
53const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::EFFECT_MODES_MAP[] = {
54    { ANDROID_CONTROL_EFFECT_MODE_OFF,       CAM_EFFECT_MODE_OFF },
55    { ANDROID_CONTROL_EFFECT_MODE_MONO,       CAM_EFFECT_MODE_MONO },
56    { ANDROID_CONTROL_EFFECT_MODE_NEGATIVE,   CAM_EFFECT_MODE_NEGATIVE },
57    { ANDROID_CONTROL_EFFECT_MODE_SOLARIZE,   CAM_EFFECT_MODE_SOLARIZE },
58    { ANDROID_CONTROL_EFFECT_MODE_SEPIA,      CAM_EFFECT_MODE_SEPIA },
59    { ANDROID_CONTROL_EFFECT_MODE_POSTERIZE,  CAM_EFFECT_MODE_POSTERIZE },
60    { ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD, CAM_EFFECT_MODE_WHITEBOARD },
61    { ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD, CAM_EFFECT_MODE_BLACKBOARD },
62    { ANDROID_CONTROL_EFFECT_MODE_AQUA,       CAM_EFFECT_MODE_AQUA }
63};
64
65const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::WHITE_BALANCE_MODES_MAP[] = {
66    { ANDROID_CONTROL_AWB_MODE_OFF,             CAM_WB_MODE_OFF },
67    { ANDROID_CONTROL_AWB_MODE_AUTO,            CAM_WB_MODE_AUTO },
68    { ANDROID_CONTROL_AWB_MODE_INCANDESCENT,    CAM_WB_MODE_INCANDESCENT },
69    { ANDROID_CONTROL_AWB_MODE_FLUORESCENT,     CAM_WB_MODE_FLUORESCENT },
70    { ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT,CAM_WB_MODE_WARM_FLUORESCENT},
71    { ANDROID_CONTROL_AWB_MODE_DAYLIGHT,        CAM_WB_MODE_DAYLIGHT },
72    { ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT, CAM_WB_MODE_CLOUDY_DAYLIGHT },
73    { ANDROID_CONTROL_AWB_MODE_TWILIGHT,        CAM_WB_MODE_TWILIGHT },
74    { ANDROID_CONTROL_AWB_MODE_SHADE,           CAM_WB_MODE_SHADE }
75};
76
77const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::SCENE_MODES_MAP[] = {
78    { ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED,    CAM_SCENE_MODE_OFF },
79    { ANDROID_CONTROL_SCENE_MODE_ACTION,         CAM_SCENE_MODE_ACTION },
80    { ANDROID_CONTROL_SCENE_MODE_PORTRAIT,       CAM_SCENE_MODE_PORTRAIT },
81    { ANDROID_CONTROL_SCENE_MODE_LANDSCAPE,      CAM_SCENE_MODE_LANDSCAPE },
82    { ANDROID_CONTROL_SCENE_MODE_NIGHT,          CAM_SCENE_MODE_NIGHT },
83    { ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT, CAM_SCENE_MODE_NIGHT_PORTRAIT },
84    { ANDROID_CONTROL_SCENE_MODE_THEATRE,        CAM_SCENE_MODE_THEATRE },
85    { ANDROID_CONTROL_SCENE_MODE_BEACH,          CAM_SCENE_MODE_BEACH },
86    { ANDROID_CONTROL_SCENE_MODE_SNOW,           CAM_SCENE_MODE_SNOW },
87    { ANDROID_CONTROL_SCENE_MODE_SUNSET,         CAM_SCENE_MODE_SUNSET },
88    { ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO,    CAM_SCENE_MODE_ANTISHAKE },
89    { ANDROID_CONTROL_SCENE_MODE_FIREWORKS ,     CAM_SCENE_MODE_FIREWORKS },
90    { ANDROID_CONTROL_SCENE_MODE_SPORTS ,        CAM_SCENE_MODE_SPORTS },
91    { ANDROID_CONTROL_SCENE_MODE_PARTY,          CAM_SCENE_MODE_PARTY },
92    { ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT,    CAM_SCENE_MODE_CANDLELIGHT },
93    { ANDROID_CONTROL_SCENE_MODE_BARCODE,        CAM_SCENE_MODE_BARCODE}
94};
95
96const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FOCUS_MODES_MAP[] = {
97    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_OFF },
98    { ANDROID_CONTROL_AF_MODE_OFF,                CAM_FOCUS_MODE_FIXED },
99    { ANDROID_CONTROL_AF_MODE_AUTO,               CAM_FOCUS_MODE_AUTO },
100    { ANDROID_CONTROL_AF_MODE_MACRO,              CAM_FOCUS_MODE_MACRO },
101    { ANDROID_CONTROL_AF_MODE_EDOF,               CAM_FOCUS_MODE_EDOF },
102    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE, CAM_FOCUS_MODE_CONTINOUS_PICTURE },
103    { ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,   CAM_FOCUS_MODE_CONTINOUS_VIDEO }
104};
105
106const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::ANTIBANDING_MODES_MAP[] = {
107    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF,  CAM_ANTIBANDING_MODE_OFF },
108    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ, CAM_ANTIBANDING_MODE_50HZ },
109    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ, CAM_ANTIBANDING_MODE_60HZ },
110    { ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO, CAM_ANTIBANDING_MODE_AUTO }
111};
112
113const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::AUTO_EXPOSURE_MAP[] = {
114    { ANDROID_CONTROL_AE_MODE_OFF,    CAM_AEC_MODE_OFF           },
115    { ANDROID_CONTROL_AE_MODE_ON,     CAM_AEC_MODE_FRAME_AVERAGE },
116};
117
118const QCamera3HardwareInterface::QCameraMap QCamera3HardwareInterface::FLASH_MODES_MAP[] = {
119    { ANDROID_FLASH_MODE_OFF,    CAM_FLASH_MODE_OFF  },
120    { ANDROID_FLASH_MODE_SINGLE, CAM_FLASH_MODE_ON   },
121    { ANDROID_FLASH_MODE_TORCH,  CAM_FLASH_MODE_TORCH}
122};
123
124
125camera3_device_ops_t QCamera3HardwareInterface::mCameraOps = {
126    initialize:                         QCamera3HardwareInterface::initialize,
127    configure_streams:                  QCamera3HardwareInterface::configure_streams,
128    register_stream_buffers:            QCamera3HardwareInterface::register_stream_buffers,
129    construct_default_request_settings: QCamera3HardwareInterface::construct_default_request_settings,
130    process_capture_request:            QCamera3HardwareInterface::process_capture_request,
131    get_metadata_vendor_tag_ops:        QCamera3HardwareInterface::get_metadata_vendor_tag_ops,
132    dump:                               QCamera3HardwareInterface::dump,
133};
134
135
136/*===========================================================================
137 * FUNCTION   : QCamera3HardwareInterface
138 *
139 * DESCRIPTION: constructor of QCamera3HardwareInterface
140 *
141 * PARAMETERS :
142 *   @cameraId  : camera ID
143 *
144 * RETURN     : none
145 *==========================================================================*/
146QCamera3HardwareInterface::QCamera3HardwareInterface(int cameraId)
147    : mCameraId(cameraId),
148      mCameraHandle(NULL),
149      mCameraOpened(false),
150      mCallbackOps(NULL),
151      mInputStream(NULL),
152      mMetadataChannel(NULL),
153      mFirstRequest(false),
154      mParamHeap(NULL),
155      mParameters(NULL),
156      mJpegSettings(NULL)
157{
158    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
159    mCameraDevice.common.version = CAMERA_DEVICE_API_VERSION_3_0;
160    mCameraDevice.common.close = close_camera_device;
161    mCameraDevice.ops = &mCameraOps;
162    mCameraDevice.priv = this;
163    gCamCapability[cameraId]->version = CAM_HAL_V3;
164
165    pthread_mutex_init(&mRequestLock, NULL);
166    pthread_cond_init(&mRequestCond, NULL);
167    mPendingRequest = 0;
168
169    pthread_mutex_init(&mMutex, NULL);
170    pthread_mutex_init(&mCaptureResultLock, NULL);
171
172    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
173        mDefaultMetadata[i] = NULL;
174}
175
176/*===========================================================================
177 * FUNCTION   : ~QCamera3HardwareInterface
178 *
179 * DESCRIPTION: destructor of QCamera3HardwareInterface
180 *
181 * PARAMETERS : none
182 *
183 * RETURN     : none
184 *==========================================================================*/
185QCamera3HardwareInterface::~QCamera3HardwareInterface()
186{
187    ALOGV("%s: E", __func__);
188    /* Clean up all channels */
189    mMetadataChannel->stop();
190    delete mMetadataChannel;
191    mMetadataChannel = NULL;
192    /* We need to stop all streams before deleting any stream */
193    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
194        it != mStreamInfo.end(); it++) {
195        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
196        channel->stop();
197    }
198    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
199        it != mStreamInfo.end(); it++) {
200        QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
201        delete channel;
202        free (*it);
203    }
204
205    if (mJpegSettings != NULL) {
206        free(mJpegSettings);
207        mJpegSettings = NULL;
208    }
209    deinitParameters();
210    closeCamera();
211
212    for (size_t i = 0; i < CAMERA3_TEMPLATE_COUNT; i++)
213        if (mDefaultMetadata[i])
214            free_camera_metadata(mDefaultMetadata[i]);
215
216    pthread_mutex_destroy(&mRequestLock);
217    pthread_cond_destroy(&mRequestCond);
218
219    pthread_mutex_destroy(&mMutex);
220    pthread_mutex_destroy(&mCaptureResultLock);
221    ALOGV("%s: X", __func__);
222}
223
224/*===========================================================================
225 * FUNCTION   : openCamera
226 *
227 * DESCRIPTION: open camera
228 *
229 * PARAMETERS :
230 *   @hw_device  : double ptr for camera device struct
231 *
232 * RETURN     : int32_t type of status
233 *              NO_ERROR  -- success
234 *              none-zero failure code
235 *==========================================================================*/
236int QCamera3HardwareInterface::openCamera(struct hw_device_t **hw_device)
237{
238    //int rc = NO_ERROR;
239    int rc = 0;
240    if (mCameraOpened) {
241        *hw_device = NULL;
242        return PERMISSION_DENIED;
243    }
244
245    rc = openCamera();
246    if (rc == 0)
247        *hw_device = &mCameraDevice.common;
248    else
249        *hw_device = NULL;
250    return rc;
251}
252
253/*===========================================================================
254 * FUNCTION   : openCamera
255 *
256 * DESCRIPTION: open camera
257 *
258 * PARAMETERS : none
259 *
260 * RETURN     : int32_t type of status
261 *              NO_ERROR  -- success
262 *              none-zero failure code
263 *==========================================================================*/
264int QCamera3HardwareInterface::openCamera()
265{
266    if (mCameraHandle) {
267        ALOGE("Failure: Camera already opened");
268        return ALREADY_EXISTS;
269    }
270    mCameraHandle = camera_open(mCameraId);
271    if (!mCameraHandle) {
272        ALOGE("camera_open failed.");
273        return UNKNOWN_ERROR;
274    }
275
276    mCameraOpened = true;
277
278    return NO_ERROR;
279}
280
281/*===========================================================================
282 * FUNCTION   : closeCamera
283 *
284 * DESCRIPTION: close camera
285 *
286 * PARAMETERS : none
287 *
288 * RETURN     : int32_t type of status
289 *              NO_ERROR  -- success
290 *              none-zero failure code
291 *==========================================================================*/
292int QCamera3HardwareInterface::closeCamera()
293{
294    int rc = NO_ERROR;
295
296    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
297    mCameraHandle = NULL;
298    mCameraOpened = false;
299
300    return rc;
301}
302
303/*===========================================================================
304 * FUNCTION   : initialize
305 *
306 * DESCRIPTION: Initialize frameworks callback functions
307 *
308 * PARAMETERS :
309 *   @callback_ops : callback function to frameworks
310 *
311 * RETURN     :
312 *
313 *==========================================================================*/
314int QCamera3HardwareInterface::initialize(
315        const struct camera3_callback_ops *callback_ops)
316{
317    int rc;
318
319    pthread_mutex_lock(&mMutex);
320
321    rc = initParameters();
322    if (rc < 0) {
323        ALOGE("%s: initParamters failed %d", __func__, rc);
324       goto err1;
325    }
326    //Create metadata channel and initialize it
327    mMetadataChannel = new QCamera3MetadataChannel(mCameraHandle->camera_handle,
328                    mCameraHandle->ops, captureResultCb,
329                    &gCamCapability[mCameraId]->padding_info, this);
330    if (mMetadataChannel == NULL) {
331        ALOGE("%s: failed to allocate metadata channel", __func__);
332        rc = -ENOMEM;
333        goto err2;
334    }
335    rc = mMetadataChannel->initialize();
336    if (rc < 0) {
337        ALOGE("%s: metadata channel initialization failed", __func__);
338        goto err3;
339    }
340
341    mCallbackOps = callback_ops;
342
343    pthread_mutex_unlock(&mMutex);
344    return 0;
345
346err3:
347    delete mMetadataChannel;
348    mMetadataChannel = NULL;
349err2:
350    deinitParameters();
351err1:
352    pthread_mutex_unlock(&mMutex);
353    return rc;
354}
355
356/*===========================================================================
357 * FUNCTION   : configureStreams
358 *
359 * DESCRIPTION: Reset HAL camera device processing pipeline and set up new input
360 *              and output streams.
361 *
362 * PARAMETERS :
363 *   @stream_list : streams to be configured
364 *
365 * RETURN     :
366 *
367 *==========================================================================*/
368int QCamera3HardwareInterface::configureStreams(
369        camera3_stream_configuration_t *streamList)
370{
371    int rc = 0;
372    pthread_mutex_lock(&mMutex);
373
374    // Sanity check stream_list
375    if (streamList == NULL) {
376        ALOGE("%s: NULL stream configuration", __func__);
377        pthread_mutex_unlock(&mMutex);
378        return BAD_VALUE;
379    }
380
381    if (streamList->streams == NULL) {
382        ALOGE("%s: NULL stream list", __func__);
383        pthread_mutex_unlock(&mMutex);
384        return BAD_VALUE;
385    }
386
387    if (streamList->num_streams < 1) {
388        ALOGE("%s: Bad number of streams requested: %d", __func__,
389                streamList->num_streams);
390        pthread_mutex_unlock(&mMutex);
391        return BAD_VALUE;
392    }
393
394    camera3_stream_t *inputStream = NULL;
395    /* first invalidate all the steams in the mStreamList
396     * if they appear again, they will be validated */
397    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
398            it != mStreamInfo.end(); it++) {
399        QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
400        channel->stop();
401        (*it)->status = INVALID;
402    }
403
404    for (size_t i = 0; i < streamList->num_streams; i++) {
405        camera3_stream_t *newStream = streamList->streams[i];
406        ALOGV("%s: newStream type = %d, stream format = %d",
407                __func__, newStream->stream_type, newStream->format);
408        //if the stream is in the mStreamList validate it
409        bool stream_exists = false;
410        for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
411                it != mStreamInfo.end(); it++) {
412            if ((*it)->stream == newStream) {
413                QCamera3Channel *channel =
414                    (QCamera3Channel*)(*it)->stream->priv;
415                stream_exists = true;
416                (*it)->status = RECONFIGURE;
417                /*delete the channel object associated with the stream because
418                  we need to reconfigure*/
419                delete channel;
420                (*it)->stream->priv = NULL;
421            }
422        }
423        if (!stream_exists) {
424            //new stream
425            stream_info_t* stream_info;
426            stream_info = (stream_info_t* )malloc(sizeof(stream_info_t));
427            stream_info->stream = newStream;
428            stream_info->status = VALID;
429            stream_info->registered = 0;
430            mStreamInfo.push_back(stream_info);
431        }
432        if (newStream->stream_type == CAMERA3_STREAM_INPUT) {
433            if (inputStream != NULL) {
434                ALOGE("%s: Multiple input streams requested!", __func__);
435                pthread_mutex_unlock(&mMutex);
436                return BAD_VALUE;
437            }
438            inputStream = newStream;
439        }
440    }
441    mInputStream = inputStream;
442
443    /*clean up invalid streams*/
444    for (List<stream_info_t*>::iterator it=mStreamInfo.begin();
445            it != mStreamInfo.end();) {
446        if(((*it)->status) == INVALID){
447            QCamera3Channel *channel = (QCamera3Channel*)(*it)->stream->priv;
448            delete channel;
449            delete[] (buffer_handle_t*)(*it)->buffer_set.buffers;
450            free(*it);
451            it = mStreamInfo.erase(it);
452        } else {
453            it++;
454        }
455    }
456
457    //mMetadataChannel->stop();
458
459    /* Allocate channel objects for the requested streams */
460    for (size_t i = 0; i < streamList->num_streams; i++) {
461        camera3_stream_t *newStream = streamList->streams[i];
462        if (newStream->priv == NULL) {
463            //New stream, construct channel
464            switch (newStream->stream_type) {
465            case CAMERA3_STREAM_INPUT:
466                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ;
467                break;
468            case CAMERA3_STREAM_BIDIRECTIONAL:
469                newStream->usage = GRALLOC_USAGE_HW_CAMERA_READ |
470                    GRALLOC_USAGE_HW_CAMERA_WRITE;
471                break;
472            case CAMERA3_STREAM_OUTPUT:
473                newStream->usage = GRALLOC_USAGE_HW_CAMERA_WRITE;
474                break;
475            default:
476                ALOGE("%s: Invalid stream_type %d", __func__, newStream->stream_type);
477                break;
478            }
479
480            if (newStream->stream_type == CAMERA3_STREAM_OUTPUT ||
481                    newStream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
482                QCamera3Channel *channel;
483                switch (newStream->format) {
484                case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
485                case HAL_PIXEL_FORMAT_YCbCr_420_888:
486                    newStream->max_buffers = QCamera3RegularChannel::kMaxBuffers;
487                    channel = new QCamera3RegularChannel(mCameraHandle->camera_handle,
488                            mCameraHandle->ops, captureResultCb,
489                            &gCamCapability[mCameraId]->padding_info, this, newStream);
490                    if (channel == NULL) {
491                        ALOGE("%s: allocation of channel failed", __func__);
492                        pthread_mutex_unlock(&mMutex);
493                        return -ENOMEM;
494                    }
495
496                    newStream->priv = channel;
497                    break;
498                case HAL_PIXEL_FORMAT_BLOB:
499                    newStream->max_buffers = QCamera3PicChannel::kMaxBuffers;
500                    channel = new QCamera3PicChannel(mCameraHandle->camera_handle,
501                            mCameraHandle->ops, captureResultCb,
502                            &gCamCapability[mCameraId]->padding_info, this, newStream);
503                    if (channel == NULL) {
504                        ALOGE("%s: allocation of channel failed", __func__);
505                        pthread_mutex_unlock(&mMutex);
506                        return -ENOMEM;
507                    }
508                    newStream->priv = channel;
509                    break;
510
511                //TODO: Add support for app consumed format?
512                default:
513                    ALOGE("%s: not a supported format 0x%x", __func__, newStream->format);
514                    break;
515                }
516            }
517        } else {
518            // Channel already exists for this stream
519            // Do nothing for now
520        }
521    }
522    /*For the streams to be reconfigured we need to register the buffers
523      since the framework wont*/
524    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
525            it != mStreamInfo.end(); it++) {
526        if ((*it)->status == RECONFIGURE) {
527            QCamera3Channel *channel = (QCamera3Channel *)(*it)->stream->priv;
528            /*only register buffers for streams that have already been
529              registered*/
530            if ((*it)->registered) {
531                rc = channel->registerBuffers((*it)->buffer_set.num_buffers,
532                        (*it)->buffer_set.buffers);
533                if (rc != NO_ERROR) {
534                    ALOGE("%s: Failed to register the buffers of old stream,\
535                            rc = %d", __func__, rc);
536                }
537                ALOGD("%s: channel %p has %d buffers",
538                        __func__, channel, (*it)->buffer_set.num_buffers);
539            }
540        }
541
542        ssize_t index = mPendingBuffersMap.indexOfKey((*it)->stream);
543        if (index == NAME_NOT_FOUND) {
544            mPendingBuffersMap.add((*it)->stream, 0);
545        } else {
546            mPendingBuffersMap.editValueAt(index) = 0;
547        }
548    }
549
550    /* Initialize mPendingRequestInfo and mPendnigBuffersMap */
551    mPendingRequestsList.clear();
552
553    //settings/parameters don't carry over for new configureStreams
554    memset(mParameters, 0, sizeof(parm_buffer_t));
555    mFirstRequest = true;
556
557    pthread_mutex_unlock(&mMutex);
558    return rc;
559}
560
561/*===========================================================================
562 * FUNCTION   : validateCaptureRequest
563 *
564 * DESCRIPTION: validate a capture request from camera service
565 *
566 * PARAMETERS :
567 *   @request : request from framework to process
568 *
569 * RETURN     :
570 *
571 *==========================================================================*/
572int QCamera3HardwareInterface::validateCaptureRequest(
573                    camera3_capture_request_t *request)
574{
575    ssize_t idx = 0;
576    const camera3_stream_buffer_t *b;
577    CameraMetadata meta;
578
579    /* Sanity check the request */
580    if (request == NULL) {
581        ALOGE("%s: NULL capture request", __func__);
582        return BAD_VALUE;
583    }
584
585    uint32_t frameNumber = request->frame_number;
586    if (request->input_buffer != NULL &&
587            request->input_buffer->stream != mInputStream) {
588        ALOGE("%s: Request %d: Input buffer not from input stream!",
589                __FUNCTION__, frameNumber);
590        return BAD_VALUE;
591    }
592    if (request->num_output_buffers < 1 || request->output_buffers == NULL) {
593        ALOGE("%s: Request %d: No output buffers provided!",
594                __FUNCTION__, frameNumber);
595        return BAD_VALUE;
596    }
597    if (request->input_buffer != NULL) {
598        //TODO
599        ALOGE("%s: Not supporting input buffer yet", __func__);
600        return BAD_VALUE;
601    }
602
603    // Validate all buffers
604    b = request->output_buffers;
605    do {
606        QCamera3Channel *channel =
607                static_cast<QCamera3Channel*>(b->stream->priv);
608        if (channel == NULL) {
609            ALOGE("%s: Request %d: Buffer %d: Unconfigured stream!",
610                    __func__, frameNumber, idx);
611            return BAD_VALUE;
612        }
613        if (b->status != CAMERA3_BUFFER_STATUS_OK) {
614            ALOGE("%s: Request %d: Buffer %d: Status not OK!",
615                    __func__, frameNumber, idx);
616            return BAD_VALUE;
617        }
618        if (b->release_fence != -1) {
619            ALOGE("%s: Request %d: Buffer %d: Has a release fence!",
620                    __func__, frameNumber, idx);
621            return BAD_VALUE;
622        }
623        if (b->buffer == NULL) {
624            ALOGE("%s: Request %d: Buffer %d: NULL buffer handle!",
625                    __func__, frameNumber, idx);
626            return BAD_VALUE;
627        }
628        idx++;
629        b = request->output_buffers + idx;
630    } while (idx < (ssize_t)request->num_output_buffers);
631
632    return NO_ERROR;
633}
634
635/*===========================================================================
636 * FUNCTION   : registerStreamBuffers
637 *
638 * DESCRIPTION: Register buffers for a given stream with the HAL device.
639 *
640 * PARAMETERS :
641 *   @stream_list : streams to be configured
642 *
643 * RETURN     :
644 *
645 *==========================================================================*/
646int QCamera3HardwareInterface::registerStreamBuffers(
647        const camera3_stream_buffer_set_t *buffer_set)
648{
649    int rc = 0;
650
651    pthread_mutex_lock(&mMutex);
652
653    if (buffer_set == NULL) {
654        ALOGE("%s: Invalid buffer_set parameter.", __func__);
655        pthread_mutex_unlock(&mMutex);
656        return -EINVAL;
657    }
658    if (buffer_set->stream == NULL) {
659        ALOGE("%s: Invalid stream parameter.", __func__);
660        pthread_mutex_unlock(&mMutex);
661        return -EINVAL;
662    }
663    if (buffer_set->num_buffers < 1) {
664        ALOGE("%s: Invalid num_buffers %d.", __func__, buffer_set->num_buffers);
665        pthread_mutex_unlock(&mMutex);
666        return -EINVAL;
667    }
668    if (buffer_set->buffers == NULL) {
669        ALOGE("%s: Invalid buffers parameter.", __func__);
670        pthread_mutex_unlock(&mMutex);
671        return -EINVAL;
672    }
673
674    camera3_stream_t *stream = buffer_set->stream;
675    QCamera3Channel *channel = (QCamera3Channel *)stream->priv;
676
677    //set the buffer_set in the mStreamInfo array
678    for (List<stream_info_t *>::iterator it = mStreamInfo.begin();
679            it != mStreamInfo.end(); it++) {
680        if ((*it)->stream == stream) {
681            uint32_t numBuffers = buffer_set->num_buffers;
682            (*it)->buffer_set.stream = buffer_set->stream;
683            (*it)->buffer_set.num_buffers = numBuffers;
684            (*it)->buffer_set.buffers = new buffer_handle_t*[numBuffers];
685            if ((*it)->buffer_set.buffers == NULL) {
686                ALOGE("%s: Failed to allocate buffer_handle_t*", __func__);
687                pthread_mutex_unlock(&mMutex);
688                return -ENOMEM;
689            }
690            for (size_t j = 0; j < numBuffers; j++){
691                (*it)->buffer_set.buffers[j] = buffer_set->buffers[j];
692            }
693            (*it)->registered = 1;
694        }
695    }
696
697    if (stream->stream_type != CAMERA3_STREAM_OUTPUT) {
698        ALOGE("%s: not yet support non output type stream", __func__);
699        pthread_mutex_unlock(&mMutex);
700        return -EINVAL;
701    }
702    rc = channel->registerBuffers(buffer_set->num_buffers, buffer_set->buffers);
703    if (rc < 0) {
704        ALOGE("%s: registerBUffers for stream %p failed", __func__, stream);
705        pthread_mutex_unlock(&mMutex);
706        return -ENODEV;
707    }
708
709    pthread_mutex_unlock(&mMutex);
710    return NO_ERROR;
711}
712
713/*===========================================================================
714 * FUNCTION   : processCaptureRequest
715 *
716 * DESCRIPTION: process a capture request from camera service
717 *
718 * PARAMETERS :
719 *   @request : request from framework to process
720 *
721 * RETURN     :
722 *
723 *==========================================================================*/
724int QCamera3HardwareInterface::processCaptureRequest(
725                    camera3_capture_request_t *request)
726{
727    int rc = NO_ERROR;
728    CameraMetadata meta;
729
730    pthread_mutex_lock(&mMutex);
731
732    rc = validateCaptureRequest(request);
733    if (rc != NO_ERROR) {
734        ALOGE("%s: incoming request is not valid", __func__);
735        pthread_mutex_unlock(&mMutex);
736        return rc;
737    }
738
739    uint32_t frameNumber = request->frame_number;
740
741    rc = setFrameParameters(request->frame_number, request->settings);
742    if (rc < 0) {
743        ALOGE("%s: fail to set frame parameters", __func__);
744        pthread_mutex_unlock(&mMutex);
745        return rc;
746    }
747
748    ALOGV("%s: %d, num_output_buffers = %d", __func__, __LINE__,
749                                    request->num_output_buffers);
750    // Acquire all request buffers first
751    for (size_t i = 0; i < request->num_output_buffers; i++) {
752        const camera3_stream_buffer_t& output = request->output_buffers[i];
753        sp<Fence> acquireFence = new Fence(output.acquire_fence);
754
755        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
756        //Call function to store local copy of jpeg data for encode params.
757            rc = getJpegSettings(request->settings);
758            if (rc < 0) {
759                ALOGE("%s: failed to get jpeg parameters", __func__);
760                pthread_mutex_unlock(&mMutex);
761                return rc;
762            }
763        }
764
765        rc = acquireFence->wait(Fence::TIMEOUT_NEVER);
766        if (rc != OK) {
767            ALOGE("%s: fence wait failed %d", __func__, rc);
768            pthread_mutex_unlock(&mMutex);
769            return rc;
770        }
771    }
772
773    /* Update pending request list and pending buffers map */
774    pthread_mutex_lock(&mRequestLock);
775    PendingRequestInfo pendingRequest;
776    pendingRequest.frame_number = frameNumber;
777    pendingRequest.num_buffers = request->num_output_buffers;
778    for (size_t i = 0; i < request->num_output_buffers; i++) {
779        RequestedBufferInfo requestedBuf;
780        requestedBuf.stream = request->output_buffers[i].stream;
781        requestedBuf.buffer = NULL;
782        pendingRequest.buffers.push_back(requestedBuf);
783
784        mPendingBuffersMap.editValueFor(requestedBuf.stream)++;
785    }
786    mPendingRequestsList.push_back(pendingRequest);
787    pthread_mutex_unlock(&mRequestLock);
788
789    // Notify metadata channel we receive a request
790    mMetadataChannel->request(NULL, frameNumber);
791
792    // Call request on other streams
793    for (size_t i = 0; i < request->num_output_buffers; i++) {
794        const camera3_stream_buffer_t& output = request->output_buffers[i];
795        QCamera3Channel *channel = (QCamera3Channel *)output.stream->priv;
796
797        if (channel == NULL) {
798            ALOGE("%s: invalid channel pointer for stream", __func__);
799            continue;
800        }
801
802        if (output.stream->format == HAL_PIXEL_FORMAT_BLOB) {
803            rc = channel->request(output.buffer, frameNumber, mJpegSettings);
804        } else {
805            ALOGI("%s: %d, request with buffer %p, frame_number %d", __func__, __LINE__, output.buffer, frameNumber);
806            rc = channel->request(output.buffer, frameNumber);
807        }
808        if (rc < 0)
809            ALOGE("%s: request failed", __func__);
810    }
811
812    mFirstRequest = false;
813
814    //Block on conditional variable
815    pthread_mutex_lock(&mRequestLock);
816    mPendingRequest = 1;
817    while (mPendingRequest == 1) {
818        pthread_cond_wait(&mRequestCond, &mRequestLock);
819    }
820    pthread_mutex_unlock(&mRequestLock);
821
822    pthread_mutex_unlock(&mMutex);
823    return rc;
824}
825
826/*===========================================================================
827 * FUNCTION   : getMetadataVendorTagOps
828 *
829 * DESCRIPTION:
830 *
831 * PARAMETERS :
832 *
833 *
834 * RETURN     :
835 *==========================================================================*/
836void QCamera3HardwareInterface::getMetadataVendorTagOps(
837                    vendor_tag_query_ops_t* /*ops*/)
838{
839    /* Enable locks when we eventually add Vendor Tags */
840    /*
841    pthread_mutex_lock(&mMutex);
842
843    pthread_mutex_unlock(&mMutex);
844    */
845    return;
846}
847
848/*===========================================================================
849 * FUNCTION   : dump
850 *
851 * DESCRIPTION:
852 *
853 * PARAMETERS :
854 *
855 *
856 * RETURN     :
857 *==========================================================================*/
858void QCamera3HardwareInterface::dump(int /*fd*/)
859{
860    /*Enable lock when we implement this function*/
861    /*
862    pthread_mutex_lock(&mMutex);
863
864    pthread_mutex_unlock(&mMutex);
865    */
866    return;
867}
868
869/*===========================================================================
870 * FUNCTION   : captureResultCb
871 *
872 * DESCRIPTION: Callback handler for all capture result
873 *              (streams, as well as metadata)
874 *
875 * PARAMETERS :
876 *   @metadata : metadata information
877 *   @buffer   : actual gralloc buffer to be returned to frameworks.
878 *               NULL if metadata.
879 *
880 * RETURN     : NONE
881 *==========================================================================*/
882void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata_buf,
883                camera3_stream_buffer_t *buffer, uint32_t frame_number)
884{
885    pthread_mutex_lock(&mRequestLock);
886
887    if (metadata_buf) {
888        metadata_buffer_t *metadata = (metadata_buffer_t *)metadata_buf->bufs[0]->buffer;
889        int32_t frame_number_valid = *(int32_t *)
890            POINTER_OF(CAM_INTF_META_FRAME_NUMBER_VALID, metadata);
891        uint32_t frame_number = *(uint32_t *)
892            POINTER_OF(CAM_INTF_META_FRAME_NUMBER, metadata);
893        const struct timeval *tv = (const struct timeval *)
894            POINTER_OF(CAM_INTF_META_SENSOR_TIMESTAMP, metadata);
895        nsecs_t capture_time = (nsecs_t)tv->tv_sec * NSEC_PER_SEC +
896            tv->tv_usec * NSEC_PER_USEC;
897
898        if (!frame_number_valid) {
899            ALOGD("%s: Not a valid frame number, used as SOF only", __func__);
900            mMetadataChannel->bufDone(metadata_buf);
901            goto done_metadata;
902        }
903        ALOGD("%s: valid frame_number = %d, capture_time = %lld", __func__,
904                frame_number, capture_time);
905
906        // Go through the pending requests info and send shutter/results to frameworks
907        for (List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
908                i != mPendingRequestsList.end() && i->frame_number <= frame_number;) {
909            camera3_capture_result_t result;
910            camera3_notify_msg_t notify_msg;
911            ALOGD("%s: frame_number in the list is %d", __func__, i->frame_number);
912
913            // Flush out all entries with less or equal frame numbers.
914
915            //TODO: Make sure shutter timestamp really reflects shutter timestamp.
916            //Right now it's the same as metadata timestamp
917
918            //TODO: When there is metadata drop, how do we derive the timestamp of
919            //dropped frames? For now, we fake the dropped timestamp by substracting
920            //from the reported timestamp
921            nsecs_t current_capture_time = capture_time -
922                (frame_number - i->frame_number) * NSEC_PER_33MSEC;
923
924            // Send shutter notify to frameworks
925            notify_msg.type = CAMERA3_MSG_SHUTTER;
926            notify_msg.message.shutter.frame_number = i->frame_number;
927            notify_msg.message.shutter.timestamp = current_capture_time;
928            mCallbackOps->notify(mCallbackOps, &notify_msg);
929            ALOGD("%s: notify frame_number = %d, capture_time = %lld", __func__,
930                    i->frame_number, capture_time);
931
932            // Send empty metadata with already filled buffers for dropped metadata
933            // and send valid metadata with already filled buffers for current metadata
934            if (i->frame_number < frame_number) {
935                CameraMetadata emptyMetadata(1, 0);
936                emptyMetadata.update(ANDROID_SENSOR_TIMESTAMP,
937                        &current_capture_time, 1);
938                result.result = emptyMetadata.release();
939            } else {
940                result.result = translateCbMetadataToResultMetadata(metadata,
941                        current_capture_time);
942                // Return metadata buffer
943                mMetadataChannel->bufDone(metadata_buf);
944            }
945            if (!result.result) {
946                ALOGE("%s: metadata is NULL", __func__);
947            }
948            result.frame_number = i->frame_number;
949            result.num_output_buffers = 0;
950            result.output_buffers = NULL;
951            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
952                    j != i->buffers.end(); j++) {
953                if (j->buffer) {
954                    result.num_output_buffers++;
955                }
956            }
957
958            if (result.num_output_buffers > 0) {
959                camera3_stream_buffer_t *result_buffers =
960                    new camera3_stream_buffer_t[result.num_output_buffers];
961                if (!result_buffers) {
962                    ALOGE("%s: Fatal error: out of memory", __func__);
963                }
964                size_t result_buffers_idx = 0;
965                for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
966                        j != i->buffers.end(); j++) {
967                    if (j->buffer) {
968                        result_buffers[result_buffers_idx++] = *(j->buffer);
969                        free(j->buffer);
970                        mPendingBuffersMap.editValueFor(j->stream)--;
971                    }
972                }
973                result.output_buffers = result_buffers;
974
975                mCallbackOps->process_capture_result(mCallbackOps, &result);
976                ALOGD("%s: meta frame_number = %d, capture_time = %lld",
977                        __func__, result.frame_number, current_capture_time);
978                free_camera_metadata((camera_metadata_t *)result.result);
979                delete[] result_buffers;
980            } else {
981                mCallbackOps->process_capture_result(mCallbackOps, &result);
982                ALOGD("%s: meta frame_number = %d, capture_time = %lld",
983                        __func__, result.frame_number, current_capture_time);
984                free_camera_metadata((camera_metadata_t *)result.result);
985            }
986            // erase the element from the list
987            i = mPendingRequestsList.erase(i);
988        }
989
990
991done_metadata:
992        bool max_buffers_dequeued = false;
993        for (size_t i = 0; i < mPendingBuffersMap.size(); i++) {
994            const camera3_stream_t *stream = mPendingBuffersMap.keyAt(i);
995            uint32_t queued_buffers = mPendingBuffersMap.valueAt(i);
996            if (queued_buffers == stream->max_buffers) {
997                max_buffers_dequeued = true;
998                break;
999            }
1000        }
1001        if (!max_buffers_dequeued) {
1002            // Unblock process_capture_request
1003            mPendingRequest = 0;
1004            pthread_cond_signal(&mRequestCond);
1005        }
1006    } else {
1007        // If the frame number doesn't exist in the pending request list,
1008        // directly send the buffer to the frameworks, and update pending buffers map
1009        // Otherwise, book-keep the buffer.
1010        List<PendingRequestInfo>::iterator i = mPendingRequestsList.begin();
1011        while (i != mPendingRequestsList.end() && i->frame_number != frame_number)
1012            i++;
1013        if (i == mPendingRequestsList.end()) {
1014            // Verify all pending requests frame_numbers are greater
1015            for (List<PendingRequestInfo>::iterator j = mPendingRequestsList.begin();
1016                    j != mPendingRequestsList.end(); j++) {
1017                if (j->frame_number < frame_number) {
1018                    ALOGE("%s: Error: pending frame number %d is smaller than %d",
1019                            __func__, j->frame_number, frame_number);
1020                }
1021            }
1022            camera3_capture_result_t result;
1023            result.result = NULL;
1024            result.frame_number = frame_number;
1025            result.num_output_buffers = 1;
1026            result.output_buffers = buffer;
1027            ALOGD("%s: result frame_number = %d, buffer = %p",
1028                    __func__, frame_number, buffer);
1029            mPendingBuffersMap.editValueFor(buffer->stream)--;
1030            mCallbackOps->process_capture_result(mCallbackOps, &result);
1031        } else {
1032            for (List<RequestedBufferInfo>::iterator j = i->buffers.begin();
1033                    j != i->buffers.end(); j++) {
1034                if (j->stream == buffer->stream) {
1035                    if (j->buffer != NULL) {
1036                        ALOGE("%s: Error: buffer is already set", __func__);
1037                    } else {
1038                        j->buffer = (camera3_stream_buffer_t *)malloc(
1039                                sizeof(camera3_stream_buffer_t));
1040                        *(j->buffer) = *buffer;
1041                        ALOGD("%s: cache buffer %p at result frame_number %d",
1042                                __func__, buffer, frame_number);
1043                    }
1044                }
1045            }
1046        }
1047    }
1048
1049    pthread_mutex_unlock(&mRequestLock);
1050    return;
1051}
1052
1053/*===========================================================================
1054 * FUNCTION   : translateCbMetadataToResultMetadata
1055 *
1056 * DESCRIPTION:
1057 *
1058 * PARAMETERS :
1059 *   @metadata : metadata information from callback
1060 *
1061 * RETURN     : camera_metadata_t*
1062 *              metadata in a format specified by fwk
1063 *==========================================================================*/
1064camera_metadata_t*
1065QCamera3HardwareInterface::translateCbMetadataToResultMetadata
1066                                (metadata_buffer_t *metadata, nsecs_t timestamp)
1067{
1068    CameraMetadata camMetadata;
1069    camera_metadata_t* resultMetadata;
1070
1071
1072    camMetadata.update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
1073
1074    /*CAM_INTF_META_HISTOGRAM - TODO*/
1075    /*cam_hist_stats_t  *histogram =
1076      (cam_hist_stats_t *)POINTER_OF(CAM_INTF_META_HISTOGRAM,
1077      metadata);*/
1078
1079    /*face detection*/
1080    cam_face_detection_data_t *faceDetectionInfo =(cam_face_detection_data_t *)
1081        POINTER_OF(CAM_INTF_META_FACE_DETECTION, metadata);
1082    uint8_t numFaces = faceDetectionInfo->num_faces_detected;
1083    int32_t faceIds[numFaces];
1084    uint8_t faceScores[numFaces];
1085    int32_t faceRectangles[numFaces * 4];
1086    int32_t faceLandmarks[numFaces * 6];
1087    int j = 0, k = 0;
1088    for (int i = 0; i < numFaces; i++) {
1089        faceIds[i] = faceDetectionInfo->faces[i].face_id;
1090        faceScores[i] = faceDetectionInfo->faces[i].score;
1091        convertToRegions(faceDetectionInfo->faces[i].face_boundary,
1092                faceRectangles+j, -1);
1093        convertLandmarks(faceDetectionInfo->faces[i], faceLandmarks+k);
1094        j+= 4;
1095        k+= 6;
1096    }
1097    camMetadata.update(ANDROID_STATISTICS_FACE_IDS, faceIds, numFaces);
1098    camMetadata.update(ANDROID_STATISTICS_FACE_SCORES, faceScores, numFaces);
1099    camMetadata.update(ANDROID_STATISTICS_FACE_RECTANGLES,
1100            faceRectangles, numFaces*4);
1101    camMetadata.update(ANDROID_STATISTICS_FACE_LANDMARKS,
1102            faceLandmarks, numFaces*6);
1103
1104
1105    /*autofocus - TODO*/
1106    /*cam_auto_focus_data_t  *afData =(cam_auto_focus_data_t *)
1107      POINTER_OF(CAM_INTF_META_AUTOFOCUS_DATA,metadata);*/
1108
1109    uint8_t  *color_correct_mode =
1110        (uint8_t *)POINTER_OF(CAM_INTF_META_COLOR_CORRECT_MODE, metadata);
1111    camMetadata.update(ANDROID_COLOR_CORRECTION_MODE, color_correct_mode, 1);
1112
1113    int32_t  *ae_precapture_id =
1114        (int32_t *)POINTER_OF(CAM_INTF_META_AEC_PRECAPTURE_ID, metadata);
1115    camMetadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID, ae_precapture_id, 1);
1116
1117    /*aec regions*/
1118    cam_area_t  *hAeRegions =
1119        (cam_area_t *)POINTER_OF(CAM_INTF_META_AEC_ROI, metadata);
1120    int32_t aeRegions[5];
1121    convertToRegions(hAeRegions->rect, aeRegions, hAeRegions->weight);
1122    camMetadata.update(ANDROID_CONTROL_AE_REGIONS, aeRegions, 5);
1123
1124    uint8_t  *ae_state =
1125        (uint8_t *)POINTER_OF(CAM_INTF_META_AEC_STATE, metadata);
1126    camMetadata.update(ANDROID_CONTROL_AE_STATE, ae_state, 1);
1127
1128    uint8_t  *focusMode =
1129        (uint8_t *)POINTER_OF(CAM_INTF_PARM_FOCUS_MODE, metadata);
1130    camMetadata.update(ANDROID_CONTROL_AF_MODE, focusMode, 1);
1131
1132    /*af regions*/
1133    cam_area_t  *hAfRegions =
1134        (cam_area_t *)POINTER_OF(CAM_INTF_META_AF_ROI, metadata);
1135    int32_t afRegions[5];
1136    convertToRegions(hAfRegions->rect, afRegions, hAfRegions->weight);
1137    camMetadata.update(ANDROID_CONTROL_AF_REGIONS, afRegions, 5);
1138
1139    uint8_t  *afState = (uint8_t *)POINTER_OF(CAM_INTF_META_AF_STATE, metadata);
1140    camMetadata.update(ANDROID_CONTROL_AF_STATE, afState, 1);
1141
1142    int32_t  *afTriggerId =
1143        (int32_t *)POINTER_OF(CAM_INTF_META_AF_TRIGGER_ID, metadata);
1144    camMetadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, afTriggerId, 1);
1145
1146    uint8_t  *whiteBalance =
1147        (uint8_t *)POINTER_OF(CAM_INTF_PARM_WHITE_BALANCE, metadata);
1148    camMetadata.update(ANDROID_CONTROL_AWB_MODE, whiteBalance, 1);
1149
1150    /*awb regions*/
1151    cam_area_t  *hAwbRegions =
1152        (cam_area_t *)POINTER_OF(CAM_INTF_META_AWB_REGIONS, metadata);
1153    int32_t awbRegions[5];
1154    convertToRegions(hAwbRegions->rect, awbRegions, hAwbRegions->weight);
1155    camMetadata.update(ANDROID_CONTROL_AWB_REGIONS, awbRegions, 5);
1156
1157    uint8_t  *whiteBalanceState =
1158        (uint8_t *)POINTER_OF(CAM_INTF_META_AWB_STATE, metadata);
1159    camMetadata.update(ANDROID_CONTROL_AWB_STATE, whiteBalanceState, 1);
1160
1161    uint8_t  *mode = (uint8_t *)POINTER_OF(CAM_INTF_META_MODE, metadata);
1162    camMetadata.update(ANDROID_CONTROL_MODE, mode, 1);
1163
1164    uint8_t  *edgeMode = (uint8_t *)POINTER_OF(CAM_INTF_META_EDGE, metadata);
1165    camMetadata.update(ANDROID_EDGE_MODE, edgeMode, 1);
1166
1167    uint8_t  *flashPower =
1168        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_POWER, metadata);
1169    camMetadata.update(ANDROID_FLASH_FIRING_POWER, flashPower, 1);
1170
1171    int64_t  *flashFiringTime =
1172        (int64_t *)POINTER_OF(CAM_INTF_META_FLASH_FIRING_TIME, metadata);
1173    camMetadata.update(ANDROID_FLASH_FIRING_TIME, flashFiringTime, 1);
1174
1175    /*int32_t  *ledMode =
1176      (int32_t *)POINTER_OF(CAM_INTF_PARM_LED_MODE, metadata);
1177      camMetadata.update(ANDROID_FLASH_FIRING_TIME, ledMode, 1);*/
1178
1179    uint8_t  *flashState =
1180        (uint8_t *)POINTER_OF(CAM_INTF_META_FLASH_STATE, metadata);
1181    camMetadata.update(ANDROID_FLASH_STATE, flashState, 1);
1182
1183    uint8_t  *hotPixelMode =
1184        (uint8_t *)POINTER_OF(CAM_INTF_META_HOTPIXEL_MODE, metadata);
1185    camMetadata.update(ANDROID_HOT_PIXEL_MODE, hotPixelMode, 1);
1186
1187    float  *lensAperture =
1188        (float *)POINTER_OF(CAM_INTF_META_LENS_APERTURE, metadata);
1189    camMetadata.update(ANDROID_LENS_APERTURE , lensAperture, 1);
1190
1191    float  *filterDensity =
1192        (float *)POINTER_OF(CAM_INTF_META_LENS_FILTERDENSITY, metadata);
1193    camMetadata.update(ANDROID_LENS_FILTER_DENSITY , filterDensity, 1);
1194
1195    float  *focalLength =
1196        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCAL_LENGTH, metadata);
1197    camMetadata.update(ANDROID_LENS_FOCAL_LENGTH, focalLength, 1);
1198
1199    float  *focusDistance =
1200        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_DISTANCE, metadata);
1201    camMetadata.update(ANDROID_LENS_FOCUS_DISTANCE , focusDistance, 1);
1202
1203    float  *focusRange =
1204        (float *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_RANGE, metadata);
1205    camMetadata.update(ANDROID_LENS_FOCUS_RANGE , focusRange, 1);
1206
1207    uint8_t  *opticalStab =
1208        (uint8_t *)POINTER_OF(CAM_INTF_META_LENS_OPT_STAB_MODE, metadata);
1209    camMetadata.update(ANDROID_LENS_OPTICAL_STABILIZATION_MODE ,opticalStab, 1);
1210
1211    /*int32_t  *focusState =
1212      (int32_t *)POINTER_OF(CAM_INTF_META_LENS_FOCUS_STATE, metadata);
1213      camMetadata.update(ANDROID_LENS_STATE , focusState, 1); //check */
1214
1215    uint8_t  *noiseRedMode =
1216        (uint8_t *)POINTER_OF(CAM_INTF_META_NOISE_REDUCTION_MODE, metadata);
1217    camMetadata.update(ANDROID_NOISE_REDUCTION_MODE , noiseRedMode, 1);
1218
1219    /*CAM_INTF_META_SCALER_CROP_REGION - check size*/
1220
1221    cam_crop_region_t  *hScalerCropRegion =(cam_crop_region_t *)
1222        POINTER_OF(CAM_INTF_META_SCALER_CROP_REGION, metadata);
1223    int32_t scalerCropRegion[3];
1224    scalerCropRegion[0] = hScalerCropRegion->left;
1225    scalerCropRegion[1] = hScalerCropRegion->top;
1226    scalerCropRegion[2] = hScalerCropRegion->width;
1227    camMetadata.update(ANDROID_SCALER_CROP_REGION, scalerCropRegion, 3);
1228
1229    int64_t  *sensorExpTime =
1230        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_EXPOSURE_TIME, metadata);
1231    camMetadata.update(ANDROID_SENSOR_EXPOSURE_TIME , sensorExpTime, 1);
1232
1233    int64_t  *sensorFameDuration =
1234        (int64_t *)POINTER_OF(CAM_INTF_META_SENSOR_FRAME_DURATION, metadata);
1235    camMetadata.update(ANDROID_SENSOR_FRAME_DURATION, sensorFameDuration, 1);
1236
1237    int32_t  *sensorSensitivity =
1238        (int32_t *)POINTER_OF(CAM_INTF_META_SENSOR_SENSITIVITY, metadata);
1239    camMetadata.update(ANDROID_SENSOR_SENSITIVITY, sensorSensitivity, 1);
1240
1241    uint8_t  *shadingMode =
1242        (uint8_t *)POINTER_OF(CAM_INTF_META_SHADING_MODE, metadata);
1243    camMetadata.update(ANDROID_SHADING_MODE, shadingMode, 1);
1244
1245    uint8_t  *faceDetectMode =
1246        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_FACEDETECT_MODE, metadata);
1247    camMetadata.update(ANDROID_STATISTICS_FACE_DETECT_MODE, faceDetectMode, 1);
1248
1249    uint8_t  *histogramMode =
1250        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_HISTOGRAM_MODE, metadata);
1251    camMetadata.update(ANDROID_STATISTICS_HISTOGRAM_MODE, histogramMode, 1);
1252
1253    uint8_t  *sharpnessMapMode =
1254        (uint8_t *)POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP_MODE, metadata);
1255    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP_MODE,
1256            sharpnessMapMode, 1);
1257
1258    /*CAM_INTF_META_STATS_SHARPNESS_MAP - check size*/
1259    cam_sharpness_map_t  *sharpnessMap = (cam_sharpness_map_t *)
1260        POINTER_OF(CAM_INTF_META_STATS_SHARPNESS_MAP, metadata);
1261    camMetadata.update(ANDROID_STATISTICS_SHARPNESS_MAP,
1262            (int32_t*)sharpnessMap->sharpness,
1263            CAM_MAX_MAP_WIDTH*CAM_MAX_MAP_HEIGHT);
1264
1265    resultMetadata = camMetadata.release();
1266    return resultMetadata;
1267}
1268
1269/*===========================================================================
1270 * FUNCTION   : convertToRegions
1271 *
1272 * DESCRIPTION: helper method to convert from cam_rect_t into int32_t array
1273 *
1274 * PARAMETERS :
1275 *   @rect   : cam_rect_t struct to convert
1276 *   @region : int32_t destination array
1277 *   @weight : if we are converting from cam_area_t, weight is valid
1278 *             else weight = -1
1279 *
1280 *==========================================================================*/
1281void QCamera3HardwareInterface::convertToRegions(cam_rect_t rect, int32_t* region, int weight){
1282    region[0] = rect.left;
1283    region[1] = rect.top;
1284    region[2] = rect.left + rect.width;
1285    region[3] = rect.top + rect.height;
1286    if (weight > -1) {
1287        region[4] = weight;
1288    }
1289}
1290
1291/*===========================================================================
1292 * FUNCTION   : convertFromRegions
1293 *
1294 * DESCRIPTION: helper method to convert from array to cam_rect_t
1295 *
1296 * PARAMETERS :
1297 *   @rect   : cam_rect_t struct to convert
1298 *   @region : int32_t destination array
1299 *   @weight : if we are converting from cam_area_t, weight is valid
1300 *             else weight = -1
1301 *
1302 *==========================================================================*/
1303void QCamera3HardwareInterface::convertFromRegions(cam_area_t* roi,
1304                                                   const camera_metadata_t *settings,
1305                                                   uint32_t tag){
1306    CameraMetadata frame_settings;
1307    frame_settings = settings;
1308    int32_t x_min = frame_settings.find(tag).data.i32[0];
1309    int32_t y_min = frame_settings.find(tag).data.i32[1];
1310    int32_t x_max = frame_settings.find(tag).data.i32[2];
1311    int32_t y_max = frame_settings.find(tag).data.i32[3];
1312    roi->weight = frame_settings.find(tag).data.i32[4];
1313    roi->rect.left = x_min;
1314    roi->rect.top = y_min;
1315    roi->rect.width = x_max - x_min;
1316    roi->rect.height = y_max - y_min;
1317}
1318
1319/*===========================================================================
1320 * FUNCTION   : convertLandmarks
1321 *
1322 * DESCRIPTION: helper method to extract the landmarks from face detection info
1323 *
1324 * PARAMETERS :
1325 *   @face   : cam_rect_t struct to convert
1326 *   @landmarks : int32_t destination array
1327 *
1328 *
1329 *==========================================================================*/
1330void QCamera3HardwareInterface::convertLandmarks(cam_face_detection_info_t face, int32_t* landmarks)
1331{
1332    landmarks[0] = face.left_eye_center.x;
1333    landmarks[1] = face.left_eye_center.y;
1334    landmarks[2] = face.right_eye_center.y;
1335    landmarks[3] = face.right_eye_center.y;
1336    landmarks[4] = face.mouth_center.x;
1337    landmarks[5] = face.mouth_center.y;
1338}
1339
1340#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
1341/*===========================================================================
1342 * FUNCTION   : initCapabilities
1343 *
1344 * DESCRIPTION: initialize camera capabilities in static data struct
1345 *
1346 * PARAMETERS :
1347 *   @cameraId  : camera Id
1348 *
1349 * RETURN     : int32_t type of status
1350 *              NO_ERROR  -- success
1351 *              none-zero failure code
1352 *==========================================================================*/
1353int QCamera3HardwareInterface::initCapabilities(int cameraId)
1354{
1355    int rc = 0;
1356    mm_camera_vtbl_t *cameraHandle = NULL;
1357    QCamera3HeapMemory *capabilityHeap = NULL;
1358
1359    cameraHandle = camera_open(cameraId);
1360    if (!cameraHandle) {
1361        ALOGE("%s: camera_open failed", __func__);
1362        rc = -1;
1363        goto open_failed;
1364    }
1365
1366    capabilityHeap = new QCamera3HeapMemory();
1367    if (capabilityHeap == NULL) {
1368        ALOGE("%s: creation of capabilityHeap failed", __func__);
1369        goto heap_creation_failed;
1370    }
1371    /* Allocate memory for capability buffer */
1372    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t), false);
1373    if(rc != OK) {
1374        ALOGE("%s: No memory for cappability", __func__);
1375        goto allocate_failed;
1376    }
1377
1378    /* Map memory for capability buffer */
1379    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
1380    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
1381                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
1382                                capabilityHeap->getFd(0),
1383                                sizeof(cam_capability_t));
1384    if(rc < 0) {
1385        ALOGE("%s: failed to map capability buffer", __func__);
1386        goto map_failed;
1387    }
1388
1389    /* Query Capability */
1390    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
1391    if(rc < 0) {
1392        ALOGE("%s: failed to query capability",__func__);
1393        goto query_failed;
1394    }
1395    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
1396    if (!gCamCapability[cameraId]) {
1397        ALOGE("%s: out of memory", __func__);
1398        goto query_failed;
1399    }
1400    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
1401                                        sizeof(cam_capability_t));
1402    rc = 0;
1403
1404query_failed:
1405    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
1406                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
1407map_failed:
1408    capabilityHeap->deallocate();
1409allocate_failed:
1410    delete capabilityHeap;
1411heap_creation_failed:
1412    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
1413    cameraHandle = NULL;
1414open_failed:
1415    return rc;
1416}
1417
1418/*===========================================================================
1419 * FUNCTION   : initParameters
1420 *
1421 * DESCRIPTION: initialize camera parameters
1422 *
1423 * PARAMETERS :
1424 *
1425 * RETURN     : int32_t type of status
1426 *              NO_ERROR  -- success
1427 *              none-zero failure code
1428 *==========================================================================*/
1429int QCamera3HardwareInterface::initParameters()
1430{
1431    int rc = 0;
1432
1433    //Allocate Set Param Buffer
1434    mParamHeap = new QCamera3HeapMemory();
1435    rc = mParamHeap->allocate(1, sizeof(parm_buffer_t), false);
1436    if(rc != OK) {
1437        rc = NO_MEMORY;
1438        ALOGE("Failed to allocate SETPARM Heap memory");
1439        delete mParamHeap;
1440        mParamHeap = NULL;
1441        return rc;
1442    }
1443
1444    //Map memory for parameters buffer
1445    rc = mCameraHandle->ops->map_buf(mCameraHandle->camera_handle,
1446            CAM_MAPPING_BUF_TYPE_PARM_BUF,
1447            mParamHeap->getFd(0),
1448            sizeof(parm_buffer_t));
1449    if(rc < 0) {
1450        ALOGE("%s:failed to map SETPARM buffer",__func__);
1451        rc = FAILED_TRANSACTION;
1452        mParamHeap->deallocate();
1453        delete mParamHeap;
1454        mParamHeap = NULL;
1455        return rc;
1456    }
1457
1458    mParameters = (parm_buffer_t*) DATA_PTR(mParamHeap,0);
1459    return rc;
1460}
1461
1462/*===========================================================================
1463 * FUNCTION   : deinitParameters
1464 *
1465 * DESCRIPTION: de-initialize camera parameters
1466 *
1467 * PARAMETERS :
1468 *
1469 * RETURN     : NONE
1470 *==========================================================================*/
1471void QCamera3HardwareInterface::deinitParameters()
1472{
1473    mCameraHandle->ops->unmap_buf(mCameraHandle->camera_handle,
1474            CAM_MAPPING_BUF_TYPE_PARM_BUF);
1475
1476    mParamHeap->deallocate();
1477    delete mParamHeap;
1478    mParamHeap = NULL;
1479
1480    mParameters = NULL;
1481}
1482
1483/*===========================================================================
1484 * FUNCTION   : calcMaxJpegSize
1485 *
1486 * DESCRIPTION: Calculates maximum jpeg size supported by the cameraId
1487 *
1488 * PARAMETERS :
1489 *
1490 * RETURN     : max_jpeg_size
1491 *==========================================================================*/
1492int QCamera3HardwareInterface::calcMaxJpegSize()
1493{
1494    int32_t max_jpeg_size = 0;
1495    int temp_width, temp_height;
1496    for (int i = 0; i < gCamCapability[mCameraId]->picture_sizes_tbl_cnt; i++) {
1497        temp_width = gCamCapability[mCameraId]->picture_sizes_tbl[i].width;
1498        temp_height = gCamCapability[mCameraId]->picture_sizes_tbl[i].height;
1499        if (temp_width * temp_height > max_jpeg_size ) {
1500            max_jpeg_size = temp_width * temp_height;
1501        }
1502    }
1503    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
1504    return max_jpeg_size;
1505}
1506
1507/*===========================================================================
1508 * FUNCTION   : initStaticMetadata
1509 *
1510 * DESCRIPTION: initialize the static metadata
1511 *
1512 * PARAMETERS :
1513 *   @cameraId  : camera Id
1514 *
1515 * RETURN     : int32_t type of status
1516 *              0  -- success
1517 *              non-zero failure code
1518 *==========================================================================*/
1519int QCamera3HardwareInterface::initStaticMetadata(int cameraId)
1520{
1521    int rc = 0;
1522    CameraMetadata staticInfo;
1523    int facingBack = gCamCapability[cameraId]->position == CAM_POSITION_BACK;
1524    /*HAL 3 only*/
1525    staticInfo.update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
1526                    &gCamCapability[cameraId]->min_focus_distance, 1);
1527
1528    staticInfo.update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
1529                    &gCamCapability[cameraId]->hyper_focal_distance, 1);
1530
1531    /*should be using focal lengths but sensor doesn't provide that info now*/
1532    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
1533                      &gCamCapability[cameraId]->focal_length,
1534                      1);
1535
1536    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_APERTURES,
1537                      gCamCapability[cameraId]->apertures,
1538                      gCamCapability[cameraId]->apertures_count);
1539
1540    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
1541                gCamCapability[cameraId]->filter_densities,
1542                gCamCapability[cameraId]->filter_densities_count);
1543
1544
1545    staticInfo.update(ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
1546                      (uint8_t*)gCamCapability[cameraId]->optical_stab_modes,
1547                      gCamCapability[cameraId]->optical_stab_modes_count);
1548
1549    staticInfo.update(ANDROID_LENS_POSITION,
1550                      gCamCapability[cameraId]->lens_position,
1551                      sizeof(gCamCapability[cameraId]->lens_position)/ sizeof(float));
1552
1553    static const int32_t lens_shading_map_size[] = {gCamCapability[cameraId]->lens_shading_map_size.width,
1554                                                    gCamCapability[cameraId]->lens_shading_map_size.height};
1555    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE,
1556                      lens_shading_map_size,
1557                      sizeof(lens_shading_map_size)/sizeof(int32_t));
1558
1559    staticInfo.update(ANDROID_LENS_INFO_SHADING_MAP, gCamCapability[cameraId]->lens_shading_map,
1560            sizeof(gCamCapability[cameraId]->lens_shading_map)/ sizeof(float));
1561
1562    static const int32_t geo_correction_map_size[] = {gCamCapability[cameraId]->geo_correction_map_size.width,
1563                                                      gCamCapability[cameraId]->geo_correction_map_size.height};
1564    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP_SIZE,
1565            geo_correction_map_size,
1566            sizeof(geo_correction_map_size)/sizeof(int32_t));
1567
1568    staticInfo.update(ANDROID_LENS_INFO_GEOMETRIC_CORRECTION_MAP,
1569                       gCamCapability[cameraId]->geo_correction_map,
1570                       sizeof(gCamCapability[cameraId]->geo_correction_map)/sizeof(float));
1571
1572    staticInfo.update(ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
1573            gCamCapability[cameraId]->sensor_physical_size, 2);
1574
1575    staticInfo.update(ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
1576            gCamCapability[cameraId]->exposure_time_range, 2);
1577
1578    staticInfo.update(ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
1579            &gCamCapability[cameraId]->max_frame_duration, 1);
1580
1581
1582    staticInfo.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
1583                     (uint8_t*)&gCamCapability[cameraId]->color_arrangement, 1);
1584
1585    static const int32_t pixel_array_size[] = {gCamCapability[cameraId]->pixel_array_size.width,
1586                                               gCamCapability[cameraId]->pixel_array_size.height};
1587    staticInfo.update(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
1588                      pixel_array_size, 2);
1589
1590    static const int32_t active_array_size[] = {gCamCapability[cameraId]->active_array_size.width,
1591                                                gCamCapability[cameraId]->active_array_size.height};
1592    staticInfo.update(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
1593                      active_array_size, 2);
1594
1595    staticInfo.update(ANDROID_SENSOR_INFO_WHITE_LEVEL,
1596            &gCamCapability[cameraId]->white_level, 1);
1597
1598    staticInfo.update(ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
1599            gCamCapability[cameraId]->black_level_pattern, 4);
1600
1601    staticInfo.update(ANDROID_FLASH_INFO_CHARGE_DURATION,
1602                      &gCamCapability[cameraId]->flash_charge_duration, 1);
1603
1604    staticInfo.update(ANDROID_TONEMAP_MAX_CURVE_POINTS,
1605                      &gCamCapability[cameraId]->max_tone_map_curve_points, 1);
1606
1607    /*staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1608                      (int*)&gCamCapability[cameraId]->max_face_detection_count, 1);*/
1609    /*hardcode 0 for now*/
1610    int32_t max_face_count = 0;
1611    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
1612                      &max_face_count, 1);
1613
1614    staticInfo.update(ANDROID_STATISTICS_INFO_HISTOGRAM_BUCKET_COUNT,
1615                      &gCamCapability[cameraId]->histogram_size, 1);
1616
1617    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_HISTOGRAM_COUNT,
1618            &gCamCapability[cameraId]->max_histogram_count, 1);
1619
1620    static const int32_t sharpness_map_size[] = {gCamCapability[cameraId]->sharpness_map_size.width,
1621                                                gCamCapability[cameraId]->sharpness_map_size.height};
1622
1623    staticInfo.update(ANDROID_STATISTICS_INFO_SHARPNESS_MAP_SIZE,
1624            sharpness_map_size, sizeof(sharpness_map_size)/sizeof(int32_t));
1625
1626    staticInfo.update(ANDROID_STATISTICS_INFO_MAX_SHARPNESS_MAP_VALUE,
1627            &gCamCapability[cameraId]->max_sharpness_map_value, 1);
1628
1629
1630    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_MIN_DURATIONS,
1631                      &gCamCapability[cameraId]->raw_min_duration,
1632                       1);
1633
1634    static int32_t scalar_formats[CAM_FORMAT_MAX];
1635    int scalar_formats_count = gCamCapability[cameraId]->supported_scalar_format_cnt;
1636    for (int i = 0; i < scalar_formats_count; i++) {
1637        scalar_formats[i] = getScalarFormat(gCamCapability[cameraId]->supported_scalar_fmts[i]);
1638    }
1639    scalar_formats[scalar_formats_count] = HAL_PIXEL_FORMAT_YCbCr_420_888;
1640    scalar_formats_count++;
1641    staticInfo.update(ANDROID_SCALER_AVAILABLE_FORMATS,
1642                      scalar_formats,
1643                      scalar_formats_count);
1644
1645    static int32_t available_processed_sizes[CAM_FORMAT_MAX];
1646    makeTable(gCamCapability[cameraId]->supported_sizes_tbl,
1647              gCamCapability[cameraId]->supported_sizes_tbl_cnt,
1648              available_processed_sizes);
1649    staticInfo.update(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES,
1650                available_processed_sizes,
1651                (gCamCapability[cameraId]->supported_sizes_tbl_cnt) * 2);
1652
1653    static int32_t available_fps_ranges[MAX_SIZES_CNT];
1654    makeFPSTable(gCamCapability[cameraId]->fps_ranges_tbl,
1655                 gCamCapability[cameraId]->fps_ranges_tbl_cnt,
1656                 available_fps_ranges);
1657    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
1658            available_fps_ranges, (gCamCapability[cameraId]->fps_ranges_tbl_cnt*2) );
1659
1660    static const camera_metadata_rational exposureCompensationStep = {
1661            gCamCapability[cameraId]->exp_compensation_step.numerator,
1662            gCamCapability[cameraId]->exp_compensation_step.denominator};
1663    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_STEP,
1664                      &exposureCompensationStep, 1);
1665
1666    /*TO DO*/
1667    static const uint8_t availableVstabModes[] = {ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF};
1668    staticInfo.update(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
1669                      availableVstabModes, sizeof(availableVstabModes));
1670
1671    /*HAL 1 and HAL 3 common*/
1672    static const float maxZoom = 10;
1673    staticInfo.update(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
1674            &maxZoom, 1);
1675
1676    static const int32_t max3aRegions = 0;
1677    staticInfo.update(ANDROID_CONTROL_MAX_REGIONS,
1678            &max3aRegions, 1);
1679
1680    static const uint8_t flashAvailable = 0;
1681    staticInfo.update(ANDROID_FLASH_INFO_AVAILABLE,
1682            &flashAvailable, sizeof(flashAvailable));
1683
1684    static const uint8_t availableFaceDetectModes[] = {
1685    ANDROID_STATISTICS_FACE_DETECT_MODE_OFF };
1686
1687    staticInfo.update(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
1688                      availableFaceDetectModes,
1689                      sizeof(availableFaceDetectModes));
1690
1691    static const int32_t raw_size[] = {gCamCapability[cameraId]->raw_dim.width,
1692                                       gCamCapability[cameraId]->raw_dim.height};
1693    staticInfo.update(ANDROID_SCALER_AVAILABLE_RAW_SIZES,
1694                      raw_size,
1695                      sizeof(raw_size)/sizeof(uint32_t));
1696
1697    static const int32_t exposureCompensationRange[] = {gCamCapability[cameraId]->exposure_compensation_min,
1698                                                        gCamCapability[cameraId]->exposure_compensation_max};
1699    staticInfo.update(ANDROID_CONTROL_AE_COMPENSATION_RANGE,
1700            exposureCompensationRange,
1701            sizeof(exposureCompensationRange)/sizeof(int32_t));
1702
1703    uint8_t lensFacing = (facingBack) ?
1704            ANDROID_LENS_FACING_BACK : ANDROID_LENS_FACING_FRONT;
1705    staticInfo.update(ANDROID_LENS_FACING, &lensFacing, 1);
1706
1707    static int32_t available_jpeg_sizes[MAX_SIZES_CNT];
1708    makeTable(gCamCapability[cameraId]->picture_sizes_tbl,
1709              gCamCapability[cameraId]->picture_sizes_tbl_cnt,
1710              available_jpeg_sizes);
1711    staticInfo.update(ANDROID_SCALER_AVAILABLE_JPEG_SIZES,
1712                available_jpeg_sizes,
1713                (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1714
1715    staticInfo.update(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
1716                      available_jpeg_sizes,
1717                      (gCamCapability[cameraId]->picture_sizes_tbl_cnt * 2));
1718
1719    static int32_t max_jpeg_size = 0;
1720    int temp_width, temp_height;
1721    for (int i = 0; i < gCamCapability[cameraId]->picture_sizes_tbl_cnt; i++) {
1722        temp_width = gCamCapability[cameraId]->picture_sizes_tbl[i].width;
1723        temp_height = gCamCapability[cameraId]->picture_sizes_tbl[i].height;
1724        if (temp_width * temp_height > max_jpeg_size ) {
1725            max_jpeg_size = temp_width * temp_height;
1726        }
1727    }
1728    max_jpeg_size = max_jpeg_size * 3/2 + sizeof(camera3_jpeg_blob_t);
1729    staticInfo.update(ANDROID_JPEG_MAX_SIZE,
1730                      &max_jpeg_size, 1);
1731
1732    static uint8_t avail_effects[CAM_EFFECT_MODE_MAX];
1733    int32_t size = 0;
1734    for (int i = 0; i < gCamCapability[cameraId]->supported_effects_cnt; i++) {
1735        int val = lookupFwkName(EFFECT_MODES_MAP,
1736                                   sizeof(EFFECT_MODES_MAP)/sizeof(EFFECT_MODES_MAP[0]),
1737                                   gCamCapability[cameraId]->supported_effects[i]);
1738        if (val != NAME_NOT_FOUND) {
1739            avail_effects[size] = (uint8_t)val;
1740            size++;
1741        }
1742    }
1743    staticInfo.update(ANDROID_CONTROL_AVAILABLE_EFFECTS,
1744                      avail_effects,
1745                      size);
1746
1747    static uint8_t avail_scene_modes[CAM_SCENE_MODE_MAX];
1748    size = 0;
1749    for (int i = 0; i < gCamCapability[cameraId]->supported_scene_modes_cnt; i++) {
1750        int val = lookupFwkName(SCENE_MODES_MAP,
1751                                sizeof(SCENE_MODES_MAP)/sizeof(SCENE_MODES_MAP[0]),
1752                                gCamCapability[cameraId]->supported_scene_modes[i]);
1753        if (val != NAME_NOT_FOUND) {
1754            avail_scene_modes[size] = (uint8_t)val;
1755            size++;
1756        }
1757    }
1758    staticInfo.update(ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
1759                      avail_scene_modes,
1760                      size);
1761
1762    static uint8_t avail_antibanding_modes[CAM_ANTIBANDING_MODE_MAX];
1763    size = 0;
1764    for (int i = 0; i < gCamCapability[cameraId]->supported_antibandings_cnt; i++) {
1765        int val = lookupFwkName(ANTIBANDING_MODES_MAP,
1766                                 sizeof(ANTIBANDING_MODES_MAP)/sizeof(ANTIBANDING_MODES_MAP[0]),
1767                                 gCamCapability[cameraId]->supported_antibandings[i]);
1768        if (val != NAME_NOT_FOUND) {
1769            avail_antibanding_modes[size] = (uint8_t)val;
1770            size++;
1771        }
1772
1773    }
1774    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
1775                      avail_antibanding_modes,
1776                      size);
1777
1778    static uint8_t avail_af_modes[CAM_FOCUS_MODE_MAX];
1779    size = 0;
1780    for (int i = 0; i < gCamCapability[cameraId]->supported_focus_modes_cnt; i++) {
1781        int val = lookupFwkName(FOCUS_MODES_MAP,
1782                                sizeof(FOCUS_MODES_MAP)/sizeof(FOCUS_MODES_MAP[0]),
1783                                gCamCapability[cameraId]->supported_focus_modes[i]);
1784        if (val != NAME_NOT_FOUND) {
1785            avail_af_modes[size] = (uint8_t)val;
1786            size++;
1787        }
1788    }
1789    staticInfo.update(ANDROID_CONTROL_AF_AVAILABLE_MODES,
1790                      avail_af_modes,
1791                      size);
1792
1793    static uint8_t avail_awb_modes[CAM_WB_MODE_MAX];
1794    size = 0;
1795    for (int i = 0; i < gCamCapability[cameraId]->supported_white_balances_cnt; i++) {
1796        int8_t val = lookupFwkName(WHITE_BALANCE_MODES_MAP,
1797                                    sizeof(WHITE_BALANCE_MODES_MAP)/sizeof(WHITE_BALANCE_MODES_MAP[0]),
1798                                    gCamCapability[cameraId]->supported_white_balances[i]);
1799        if (val != NAME_NOT_FOUND) {
1800            avail_awb_modes[size] = (uint8_t)val;
1801            size++;
1802        }
1803    }
1804    staticInfo.update(ANDROID_CONTROL_AWB_AVAILABLE_MODES,
1805                      avail_awb_modes,
1806                      size);
1807
1808    static uint8_t avail_flash_modes[CAM_FLASH_MODE_MAX];
1809    size = 0;
1810    for (int i = 0; i < gCamCapability[cameraId]->supported_flash_modes_cnt; i++) {
1811        int val = lookupFwkName(FLASH_MODES_MAP,
1812                                sizeof(FLASH_MODES_MAP)/sizeof(FLASH_MODES_MAP[0]),
1813                                gCamCapability[cameraId]->supported_flash_modes[i]);
1814        if (val != NAME_NOT_FOUND) {
1815            avail_flash_modes[size] = (uint8_t)val;
1816            size++;
1817        }
1818    }
1819    staticInfo.update(ANDROID_FLASH_MODE,
1820                      avail_flash_modes,
1821                      size);
1822
1823    /*so far fwk seems to support only 2 aec modes on and off*/
1824    static const uint8_t avail_ae_modes[] = {
1825            ANDROID_CONTROL_AE_MODE_OFF,
1826            ANDROID_CONTROL_AE_MODE_ON
1827    };
1828    staticInfo.update(ANDROID_CONTROL_AE_AVAILABLE_MODES,
1829                      avail_ae_modes,
1830                      sizeof(avail_ae_modes));
1831
1832    gStaticMetadata[cameraId] = staticInfo.release();
1833    return rc;
1834}
1835
1836/*===========================================================================
1837 * FUNCTION   : makeTable
1838 *
1839 * DESCRIPTION: make a table of sizes
1840 *
1841 * PARAMETERS :
1842 *
1843 *
1844 *
1845 * RETURN     : int32_t type of status
1846 *              NO_ERROR  -- success
1847 *              none-zero failure code
1848 *==========================================================================*/
1849void QCamera3HardwareInterface::makeTable(cam_dimension_t* dimTable, uint8_t size,
1850                                          int32_t* sizeTable)
1851{
1852    int j = 0;
1853    for (int i = 0; i < size; i++) {
1854        sizeTable[j] = dimTable[i].width;
1855        sizeTable[j+1] = dimTable[i].height;
1856        j+=2;
1857    }
1858}
1859
1860/*===========================================================================
1861 * FUNCTION   : makeFPSTable
1862 *
1863 * DESCRIPTION: make a table of fps ranges
1864 *
1865 * PARAMETERS :
1866 *
1867 *
1868 *
1869 * RETURN     : int32_t type of status
1870 *              NO_ERROR  -- success
1871 *              none-zero failure code
1872 *==========================================================================*/
1873void QCamera3HardwareInterface::makeFPSTable(cam_fps_range_t* fpsTable, uint8_t size,
1874                                          int32_t* fpsRangesTable)
1875{
1876    int j = 0;
1877    for (int i = 0; i < size; i++) {
1878        fpsRangesTable[j] = (int32_t)fpsTable[i].min_fps;
1879        fpsRangesTable[j+1] = (int32_t)fpsTable[i].max_fps;
1880        j+=2;
1881    }
1882}
1883/*===========================================================================
1884 * FUNCTION   : getPreviewHalPixelFormat
1885 *
1886 * DESCRIPTION: convert the format to type recognized by framework
1887 *
1888 * PARAMETERS : format : the format from backend
1889 *
1890 ** RETURN    : format recognized by framework
1891 *
1892 *==========================================================================*/
1893int32_t QCamera3HardwareInterface::getScalarFormat(int32_t format)
1894{
1895    int32_t halPixelFormat;
1896
1897    switch (format) {
1898    case CAM_FORMAT_YUV_420_NV12:
1899        halPixelFormat = HAL_PIXEL_FORMAT_YCbCr_420_SP;
1900        break;
1901    case CAM_FORMAT_YUV_420_NV21:
1902        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1903        break;
1904    case CAM_FORMAT_YUV_420_NV21_ADRENO:
1905        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP_ADRENO;
1906        break;
1907    case CAM_FORMAT_YUV_420_YV12:
1908        halPixelFormat = HAL_PIXEL_FORMAT_YV12;
1909        break;
1910    case CAM_FORMAT_YUV_422_NV16:
1911    case CAM_FORMAT_YUV_422_NV61:
1912    default:
1913        halPixelFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1914        break;
1915    }
1916    return halPixelFormat;
1917}
1918
1919/*===========================================================================
1920 * FUNCTION   : AddSetParmEntryToBatch
1921 *
1922 * DESCRIPTION: add set parameter entry into batch
1923 *
1924 * PARAMETERS :
1925 *   @p_table     : ptr to parameter buffer
1926 *   @paramType   : parameter type
1927 *   @paramLength : length of parameter value
1928 *   @paramValue  : ptr to parameter value
1929 *
1930 * RETURN     : int32_t type of status
1931 *              NO_ERROR  -- success
1932 *              none-zero failure code
1933 *==========================================================================*/
1934int32_t QCamera3HardwareInterface::AddSetParmEntryToBatch(parm_buffer_t *p_table,
1935                                                          cam_intf_parm_type_t paramType,
1936                                                          uint32_t paramLength,
1937                                                          void *paramValue)
1938{
1939    int position = paramType;
1940    int current, next;
1941
1942    /*************************************************************************
1943    *                 Code to take care of linking next flags                *
1944    *************************************************************************/
1945    current = GET_FIRST_PARAM_ID(p_table);
1946    if (position == current){
1947        //DO NOTHING
1948    } else if (position < current){
1949        SET_NEXT_PARAM_ID(position, p_table, current);
1950        SET_FIRST_PARAM_ID(p_table, position);
1951    } else {
1952        /* Search for the position in the linked list where we need to slot in*/
1953        while (position > GET_NEXT_PARAM_ID(current, p_table))
1954            current = GET_NEXT_PARAM_ID(current, p_table);
1955
1956        /*If node already exists no need to alter linking*/
1957        if (position != GET_NEXT_PARAM_ID(current, p_table)) {
1958            next = GET_NEXT_PARAM_ID(current, p_table);
1959            SET_NEXT_PARAM_ID(current, p_table, position);
1960            SET_NEXT_PARAM_ID(position, p_table, next);
1961        }
1962    }
1963
1964    /*************************************************************************
1965    *                   Copy contents into entry                             *
1966    *************************************************************************/
1967
1968    if (paramLength > sizeof(parm_type_t)) {
1969        ALOGE("%s:Size of input larger than max entry size",__func__);
1970        return BAD_VALUE;
1971    }
1972    memcpy(POINTER_OF(paramType,p_table), paramValue, paramLength);
1973    return NO_ERROR;
1974}
1975
1976/*===========================================================================
1977 * FUNCTION   : lookupFwkName
1978 *
1979 * DESCRIPTION: In case the enum is not same in fwk and backend
1980 *              make sure the parameter is correctly propogated
1981 *
1982 * PARAMETERS  :
1983 *   @arr      : map between the two enums
1984 *   @len      : len of the map
1985 *   @hal_name : name of the hal_parm to map
1986 *
1987 * RETURN     : int type of status
1988 *              fwk_name  -- success
1989 *              none-zero failure code
1990 *==========================================================================*/
1991int8_t QCamera3HardwareInterface::lookupFwkName(const QCameraMap arr[],
1992                                             int len, int hal_name)
1993{
1994
1995    for (int i = 0; i < len; i++) {
1996        if (arr[i].hal_name == hal_name)
1997            return arr[i].fwk_name;
1998    }
1999
2000    /* Not able to find matching framework type is not necessarily
2001     * an error case. This happens when mm-camera supports more attributes
2002     * than the frameworks do */
2003    ALOGD("%s: Cannot find matching framework type", __func__);
2004    return NAME_NOT_FOUND;
2005}
2006
2007/*===========================================================================
2008 * FUNCTION   : lookupHalName
2009 *
2010 * DESCRIPTION: In case the enum is not same in fwk and backend
2011 *              make sure the parameter is correctly propogated
2012 *
2013 * PARAMETERS  :
2014 *   @arr      : map between the two enums
2015 *   @len      : len of the map
2016 *   @fwk_name : name of the hal_parm to map
2017 *
2018 * RETURN     : int32_t type of status
2019 *              hal_name  -- success
2020 *              none-zero failure code
2021 *==========================================================================*/
2022int8_t QCamera3HardwareInterface::lookupHalName(const QCameraMap arr[],
2023                                             int len, int fwk_name)
2024{
2025    for (int i = 0; i < len; i++) {
2026       if (arr[i].fwk_name == fwk_name)
2027           return arr[i].hal_name;
2028    }
2029    ALOGE("%s: Cannot find matching hal type", __func__);
2030    return NAME_NOT_FOUND;
2031}
2032
2033/*===========================================================================
2034 * FUNCTION   : getCapabilities
2035 *
2036 * DESCRIPTION: query camera capabilities
2037 *
2038 * PARAMETERS :
2039 *   @cameraId  : camera Id
2040 *   @info      : camera info struct to be filled in with camera capabilities
2041 *
2042 * RETURN     : int32_t type of status
2043 *              NO_ERROR  -- success
2044 *              none-zero failure code
2045 *==========================================================================*/
2046int QCamera3HardwareInterface::getCamInfo(int cameraId,
2047                                    struct camera_info *info)
2048{
2049    int rc = 0;
2050
2051    if (NULL == gCamCapability[cameraId]) {
2052        rc = initCapabilities(cameraId);
2053        if (rc < 0) {
2054            //pthread_mutex_unlock(&g_camlock);
2055            return rc;
2056        }
2057    }
2058
2059    if (NULL == gStaticMetadata[cameraId]) {
2060        rc = initStaticMetadata(cameraId);
2061        if (rc < 0) {
2062            return rc;
2063        }
2064    }
2065
2066    switch(gCamCapability[cameraId]->position) {
2067    case CAM_POSITION_BACK:
2068        info->facing = CAMERA_FACING_BACK;
2069        break;
2070
2071    case CAM_POSITION_FRONT:
2072        info->facing = CAMERA_FACING_FRONT;
2073        break;
2074
2075    default:
2076        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
2077        rc = -1;
2078        break;
2079    }
2080
2081
2082    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
2083    info->device_version = HARDWARE_DEVICE_API_VERSION(3, 0);
2084    info->static_camera_characteristics = gStaticMetadata[cameraId];
2085
2086    return rc;
2087}
2088
2089/*===========================================================================
2090 * FUNCTION   : translateMetadata
2091 *
2092 * DESCRIPTION: translate the metadata into camera_metadata_t
2093 *
2094 * PARAMETERS : type of the request
2095 *
2096 *
2097 * RETURN     : success: camera_metadata_t*
2098 *              failure: NULL
2099 *
2100 *==========================================================================*/
2101camera_metadata_t* QCamera3HardwareInterface::translateCapabilityToMetadata(int type)
2102{
2103    pthread_mutex_lock(&mMutex);
2104
2105    if (mDefaultMetadata[type] != NULL) {
2106        pthread_mutex_unlock(&mMutex);
2107        return mDefaultMetadata[type];
2108    }
2109    //first time we are handling this request
2110    //fill up the metadata structure using the wrapper class
2111    CameraMetadata settings;
2112    //translate from cam_capability_t to camera_metadata_tag_t
2113    static const uint8_t requestType = ANDROID_REQUEST_TYPE_CAPTURE;
2114    settings.update(ANDROID_REQUEST_TYPE, &requestType, 1);
2115
2116    /*control*/
2117
2118    uint8_t controlIntent = 0;
2119    switch (type) {
2120      case CAMERA3_TEMPLATE_PREVIEW:
2121        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW;
2122        break;
2123      case CAMERA3_TEMPLATE_STILL_CAPTURE:
2124        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
2125        break;
2126      case CAMERA3_TEMPLATE_VIDEO_RECORD:
2127        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_RECORD;
2128        break;
2129      case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
2130        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_VIDEO_SNAPSHOT;
2131        break;
2132      case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
2133        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_ZERO_SHUTTER_LAG;
2134        break;
2135      default:
2136        controlIntent = ANDROID_CONTROL_CAPTURE_INTENT_CUSTOM;
2137        break;
2138    }
2139    settings.update(ANDROID_CONTROL_CAPTURE_INTENT, &controlIntent, 1);
2140
2141    settings.update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
2142            &gCamCapability[mCameraId]->exposure_compensation_default, 1);
2143
2144    static const uint8_t aeLock = ANDROID_CONTROL_AE_LOCK_OFF;
2145    settings.update(ANDROID_CONTROL_AE_LOCK, &aeLock, 1);
2146
2147    static const uint8_t awbLock = ANDROID_CONTROL_AWB_LOCK_OFF;
2148    settings.update(ANDROID_CONTROL_AWB_LOCK, &awbLock, 1);
2149
2150    static const uint8_t awbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2151    settings.update(ANDROID_CONTROL_AWB_MODE, &awbMode, 1);
2152
2153    static const uint8_t controlMode = ANDROID_CONTROL_MODE_AUTO;
2154    settings.update(ANDROID_CONTROL_MODE, &controlMode, 1);
2155
2156    static const uint8_t effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
2157    settings.update(ANDROID_CONTROL_EFFECT_MODE, &effectMode, 1);
2158
2159    static const uint8_t sceneMode = ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY; //similar to AUTO?
2160    settings.update(ANDROID_CONTROL_SCENE_MODE, &sceneMode, 1);
2161
2162    /*flash*/
2163    static const uint8_t flashMode = ANDROID_FLASH_MODE_OFF;
2164    settings.update(ANDROID_FLASH_MODE, &flashMode, 1);
2165
2166
2167    /* lens */
2168    static const float default_aperture = gCamCapability[mCameraId]->apertures[0];
2169    settings.update(ANDROID_LENS_APERTURE, &default_aperture, 1);
2170
2171    if (gCamCapability[mCameraId]->filter_densities_count) {
2172        static const float default_filter_density = gCamCapability[mCameraId]->filter_densities[0];
2173        settings.update(ANDROID_LENS_FILTER_DENSITY, &default_filter_density,
2174                        gCamCapability[mCameraId]->filter_densities_count);
2175    }
2176
2177    /* TODO: Enable focus lengths once supported*/
2178    /*if (gCamCapability[mCameraId]->focal_lengths_count) {
2179        static const float default_focal_length = gCamCapability[mCameraId]->focal_lengths[0];
2180        settings.update(ANDROID_LENS_FOCAL_LENGTH, &default_focal_length, 1);
2181    }*/
2182
2183    mDefaultMetadata[type] = settings.release();
2184
2185    pthread_mutex_unlock(&mMutex);
2186    return mDefaultMetadata[type];
2187}
2188
2189/*===========================================================================
2190 * FUNCTION   : setFrameParameters
2191 *
2192 * DESCRIPTION: set parameters per frame as requested in the metadata from
2193 *              framework
2194 *
2195 * PARAMETERS :
2196 *   @settings  : frame settings information from framework
2197 *
2198 *
2199 * RETURN     : success: NO_ERROR
2200 *              failure:
2201 *==========================================================================*/
2202int QCamera3HardwareInterface::setFrameParameters(int frame_id,
2203                                                  const camera_metadata_t *settings)
2204{
2205    /*translate from camera_metadata_t type to parm_type_t*/
2206    int rc = 0;
2207    if (settings == NULL && mFirstRequest) {
2208        /*settings cannot be null for the first request*/
2209        return BAD_VALUE;
2210    }
2211
2212    int32_t hal_version = CAM_HAL_V3;
2213
2214    memset(mParameters, 0, sizeof(parm_buffer_t));
2215    mParameters->first_flagged_entry = CAM_INTF_PARM_MAX;
2216    AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_HAL_VERSION,
2217                sizeof(hal_version), &hal_version);
2218
2219    /*we need to update the frame number in the parameters*/
2220    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2221                                sizeof(frame_id), &frame_id);
2222    if (rc < 0) {
2223        ALOGE("%s: Failed to set the frame number in the parameters", __func__);
2224        return BAD_VALUE;
2225    }
2226
2227    if(settings != NULL){
2228        rc = translateMetadataToParameters(settings);
2229    }
2230    /*set the parameters to backend*/
2231    mCameraHandle->ops->set_parms(mCameraHandle->camera_handle, mParameters);
2232    return rc;
2233}
2234
2235/*===========================================================================
2236 * FUNCTION   : translateMetadataToParameters
2237 *
2238 * DESCRIPTION: read from the camera_metadata_t and change to parm_type_t
2239 *
2240 *
2241 * PARAMETERS :
2242 *   @settings  : frame settings information from framework
2243 *
2244 *
2245 * RETURN     : success: NO_ERROR
2246 *              failure:
2247 *==========================================================================*/
2248int QCamera3HardwareInterface::translateMetadataToParameters
2249                                  (const camera_metadata_t *settings)
2250{
2251    int rc = 0;
2252    CameraMetadata frame_settings;
2253    frame_settings = settings;
2254
2255
2256    if (frame_settings.exists(ANDROID_CONTROL_AE_ANTIBANDING_MODE)) {
2257        int32_t antibandingMode =
2258            frame_settings.find(ANDROID_CONTROL_AE_ANTIBANDING_MODE).data.i32[0];
2259        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_ANTIBANDING,
2260                sizeof(antibandingMode), &antibandingMode);
2261    }
2262
2263    /*int32_t expCompensation = frame_settings.find().data.i32[0];
2264      rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EXPOSURE_COMPENSATION,
2265      sizeof(expCompensation), &expCompensation);*/
2266    if (frame_settings.exists(ANDROID_CONTROL_AE_LOCK)) {
2267        uint8_t aeLock = frame_settings.find(ANDROID_CONTROL_AE_LOCK).data.u8[0];
2268        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AEC_LOCK,
2269                sizeof(aeLock), &aeLock);
2270    }
2271
2272    if (frame_settings.exists(ANDROID_CONTROL_AE_TARGET_FPS_RANGE)) {
2273        cam_fps_range_t fps_range;
2274        fps_range.min_fps =
2275            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
2276        fps_range.max_fps =
2277            frame_settings.find(ANDROID_CONTROL_AE_TARGET_FPS_RANGE).data.i32[0];
2278        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FPS_RANGE,
2279                sizeof(fps_range), &fps_range);
2280    }
2281
2282    if (frame_settings.exists(ANDROID_CONTROL_AF_MODE)) {
2283        uint8_t focusMode =
2284            frame_settings.find(ANDROID_CONTROL_AF_MODE).data.u8[0];
2285        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_FOCUS_MODE,
2286                sizeof(focusMode), &focusMode);
2287    }
2288
2289    if (frame_settings.exists(ANDROID_CONTROL_AWB_LOCK)) {
2290        uint8_t awbLock =
2291            frame_settings.find(ANDROID_CONTROL_AWB_LOCK).data.u8[0];
2292        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_AWB_LOCK,
2293                sizeof(awbLock), &awbLock);
2294    }
2295
2296    if (frame_settings.exists(ANDROID_CONTROL_AWB_MODE)) {
2297        uint8_t fwk_whiteLevel =
2298            frame_settings.find(ANDROID_CONTROL_AWB_MODE).data.u8[0];
2299        uint8_t whiteLevel = lookupHalName(WHITE_BALANCE_MODES_MAP,
2300                sizeof(WHITE_BALANCE_MODES_MAP),
2301                fwk_whiteLevel);
2302        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_WHITE_BALANCE,
2303                sizeof(whiteLevel), &whiteLevel);
2304    }
2305
2306    if (frame_settings.exists(ANDROID_CONTROL_EFFECT_MODE)) {
2307        uint8_t fwk_effectMode =
2308            frame_settings.find(ANDROID_CONTROL_EFFECT_MODE).data.u8[0];
2309        uint8_t effectMode = lookupHalName(EFFECT_MODES_MAP,
2310                sizeof(EFFECT_MODES_MAP),
2311                fwk_effectMode);
2312        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_PARM_EFFECT,
2313                sizeof(effectMode), &effectMode);
2314    }
2315
2316    if (frame_settings.exists(ANDROID_CONTROL_AE_MODE)) {
2317        uint8_t fwk_aeMode =
2318            frame_settings.find(ANDROID_CONTROL_AE_MODE).data.u8[0];
2319        uint8_t aeMode = lookupHalName(AUTO_EXPOSURE_MAP,
2320                sizeof(AUTO_EXPOSURE_MAP),
2321                fwk_aeMode);
2322        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_MODE,
2323                sizeof(aeMode), &aeMode);
2324    }
2325
2326    if (frame_settings.exists(ANDROID_REQUEST_FRAME_COUNT)) {
2327        int32_t metaFrameNumber =
2328            frame_settings.find(ANDROID_REQUEST_FRAME_COUNT).data.i32[0];
2329        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FRAME_NUMBER,
2330                sizeof(metaFrameNumber), &metaFrameNumber);
2331    }
2332
2333    if (frame_settings.exists(ANDROID_COLOR_CORRECTION_MODE)) {
2334        uint8_t colorCorrectMode =
2335            frame_settings.find(ANDROID_COLOR_CORRECTION_MODE).data.u8[0];
2336        rc =
2337            AddSetParmEntryToBatch(mParameters, CAM_INTF_META_COLOR_CORRECT_MODE,
2338                    sizeof(colorCorrectMode), &colorCorrectMode);
2339    }
2340
2341    uint8_t aecTrigger = CAM_AEC_TRIGGER_IDLE;
2342    if (frame_settings.exists(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER)) {
2343        aecTrigger =
2344            frame_settings.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER).data.u8[0];
2345    }
2346    rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_PRECAPTURE_TRIGGER,
2347                                sizeof(aecTrigger), &aecTrigger);
2348
2349    if (frame_settings.exists(ANDROID_CONTROL_AF_TRIGGER)) {
2350        uint8_t afTrigger =
2351            frame_settings.find(ANDROID_CONTROL_AF_TRIGGER).data.u8[0];
2352        rc = AddSetParmEntryToBatch(mParameters,
2353                CAM_INTF_META_AF_TRIGGER, sizeof(afTrigger), &afTrigger);
2354    }
2355
2356    if (frame_settings.exists(ANDROID_CONTROL_MODE)) {
2357        uint8_t metaMode = frame_settings.find(ANDROID_CONTROL_MODE).data.u8[0];
2358        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_MODE,
2359                sizeof(metaMode), &metaMode);
2360    }
2361
2362    if (frame_settings.exists(ANDROID_DEMOSAIC_MODE)) {
2363        int32_t demosaic =
2364            frame_settings.find(ANDROID_DEMOSAIC_MODE).data.u8[0];
2365        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_DEMOSAIC,
2366                sizeof(demosaic), &demosaic);
2367    }
2368
2369    if (frame_settings.exists(ANDROID_EDGE_MODE)) {
2370        uint8_t edgeMode = frame_settings.find(ANDROID_EDGE_MODE).data.u8[0];
2371        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_EDGE,
2372                sizeof(edgeMode), &edgeMode);
2373    }
2374
2375    if (frame_settings.exists(ANDROID_EDGE_STRENGTH)) {
2376        int32_t edgeStrength =
2377            frame_settings.find(ANDROID_EDGE_STRENGTH).data.i32[0];
2378        rc = AddSetParmEntryToBatch(mParameters,
2379                CAM_INTF_META_SHARPNESS_STRENGTH, sizeof(edgeStrength), &edgeStrength);
2380    }
2381
2382    if (frame_settings.exists(ANDROID_FLASH_FIRING_POWER)) {
2383        uint8_t flashPower =
2384            frame_settings.find(ANDROID_FLASH_FIRING_POWER).data.u8[0];
2385        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_FLASH_POWER,
2386                sizeof(flashPower), &flashPower);
2387    }
2388
2389    if (frame_settings.exists(ANDROID_FLASH_FIRING_TIME)) {
2390        int64_t flashFiringTime =
2391            frame_settings.find(ANDROID_FLASH_FIRING_TIME).data.i64[0];
2392        rc = AddSetParmEntryToBatch(mParameters,
2393                CAM_INTF_META_FLASH_FIRING_TIME, sizeof(flashFiringTime), &flashFiringTime);
2394    }
2395
2396    if (frame_settings.exists(ANDROID_GEOMETRIC_MODE)) {
2397        uint8_t geometricMode =
2398            frame_settings.find(ANDROID_GEOMETRIC_MODE).data.u8[0];
2399        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_GEOMETRIC_MODE,
2400                sizeof(geometricMode), &geometricMode);
2401    }
2402
2403    if (frame_settings.exists(ANDROID_GEOMETRIC_STRENGTH)) {
2404        uint8_t geometricStrength =
2405            frame_settings.find(ANDROID_GEOMETRIC_STRENGTH).data.u8[0];
2406        rc = AddSetParmEntryToBatch(mParameters,
2407                CAM_INTF_META_GEOMETRIC_STRENGTH,
2408                sizeof(geometricStrength), &geometricStrength);
2409    }
2410
2411    if (frame_settings.exists(ANDROID_HOT_PIXEL_MODE)) {
2412        uint8_t hotPixelMode =
2413            frame_settings.find(ANDROID_HOT_PIXEL_MODE).data.u8[0];
2414        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_HOTPIXEL_MODE,
2415                sizeof(hotPixelMode), &hotPixelMode);
2416    }
2417
2418    if (frame_settings.exists(ANDROID_LENS_APERTURE)) {
2419        float lensAperture =
2420            frame_settings.find( ANDROID_LENS_APERTURE).data.f[0];
2421        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_APERTURE,
2422                sizeof(lensAperture), &lensAperture);
2423    }
2424
2425    if (frame_settings.exists(ANDROID_LENS_FILTER_DENSITY)) {
2426        float filterDensity =
2427            frame_settings.find(ANDROID_LENS_FILTER_DENSITY).data.f[0];
2428        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_LENS_FILTERDENSITY,
2429                sizeof(filterDensity), &filterDensity);
2430    }
2431
2432    if (frame_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
2433        float focalLength =
2434            frame_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
2435        rc = AddSetParmEntryToBatch(mParameters,
2436                CAM_INTF_META_LENS_FOCAL_LENGTH,
2437                sizeof(focalLength), &focalLength);
2438    }
2439
2440    if (frame_settings.exists(ANDROID_LENS_FOCUS_DISTANCE)) {
2441        float focalDistance =
2442            frame_settings.find(ANDROID_LENS_FOCUS_DISTANCE).data.f[0];
2443        rc = AddSetParmEntryToBatch(mParameters,
2444                CAM_INTF_META_LENS_FOCUS_DISTANCE,
2445                sizeof(focalDistance), &focalDistance);
2446    }
2447
2448    if (frame_settings.exists(ANDROID_LENS_OPTICAL_STABILIZATION_MODE)) {
2449        uint8_t optStabMode =
2450            frame_settings.find(ANDROID_LENS_OPTICAL_STABILIZATION_MODE).data.u8[0];
2451        rc = AddSetParmEntryToBatch(mParameters,
2452                CAM_INTF_META_LENS_OPT_STAB_MODE,
2453                sizeof(optStabMode), &optStabMode);
2454    }
2455
2456    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_MODE)) {
2457        uint8_t noiseRedMode =
2458            frame_settings.find(ANDROID_NOISE_REDUCTION_MODE).data.u8[0];
2459        rc = AddSetParmEntryToBatch(mParameters,
2460                CAM_INTF_META_NOISE_REDUCTION_MODE,
2461                sizeof(noiseRedMode), &noiseRedMode);
2462    }
2463
2464    if (frame_settings.exists(ANDROID_NOISE_REDUCTION_STRENGTH)) {
2465        uint8_t noiseRedStrength =
2466            frame_settings.find(ANDROID_NOISE_REDUCTION_STRENGTH).data.u8[0];
2467        rc = AddSetParmEntryToBatch(mParameters,
2468                CAM_INTF_META_NOISE_REDUCTION_STRENGTH,
2469                sizeof(noiseRedStrength), &noiseRedStrength);
2470    }
2471
2472    if (frame_settings.exists(ANDROID_SCALER_CROP_REGION)) {
2473        cam_crop_region_t scalerCropRegion;
2474        scalerCropRegion.left =
2475            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[0];
2476        scalerCropRegion.top =
2477            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[1];
2478        scalerCropRegion.width =
2479            frame_settings.find(ANDROID_SCALER_CROP_REGION).data.i32[2];
2480        rc = AddSetParmEntryToBatch(mParameters,
2481                CAM_INTF_META_SCALER_CROP_REGION,
2482                sizeof(scalerCropRegion), &scalerCropRegion);
2483    }
2484
2485    if (frame_settings.exists(ANDROID_SENSOR_EXPOSURE_TIME)) {
2486        int64_t sensorExpTime =
2487            frame_settings.find(ANDROID_SENSOR_EXPOSURE_TIME).data.i64[0];
2488        rc = AddSetParmEntryToBatch(mParameters,
2489                CAM_INTF_META_SENSOR_EXPOSURE_TIME,
2490                sizeof(sensorExpTime), &sensorExpTime);
2491    }
2492
2493    if (frame_settings.exists(ANDROID_SENSOR_FRAME_DURATION)) {
2494        int64_t sensorFrameDuration =
2495            frame_settings.find(ANDROID_SENSOR_FRAME_DURATION).data.i64[0];
2496        rc = AddSetParmEntryToBatch(mParameters,
2497                CAM_INTF_META_SENSOR_FRAME_DURATION,
2498                sizeof(sensorFrameDuration), &sensorFrameDuration);
2499    }
2500
2501    if (frame_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
2502        int32_t sensorSensitivity =
2503            frame_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
2504        rc = AddSetParmEntryToBatch(mParameters,
2505                CAM_INTF_META_SENSOR_SENSITIVITY,
2506                sizeof(sensorSensitivity), &sensorSensitivity);
2507    }
2508
2509    if (frame_settings.exists(ANDROID_SHADING_MODE)) {
2510        int32_t shadingMode =
2511            frame_settings.find(ANDROID_SHADING_MODE).data.u8[0];
2512        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_MODE,
2513                sizeof(shadingMode), &shadingMode);
2514    }
2515
2516    if (frame_settings.exists(ANDROID_SHADING_STRENGTH)) {
2517        uint8_t shadingStrength =
2518            frame_settings.find(ANDROID_SHADING_STRENGTH).data.u8[0];
2519        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_SHADING_STRENGTH,
2520                sizeof(shadingStrength), &shadingStrength);
2521    }
2522
2523    if (frame_settings.exists(ANDROID_STATISTICS_FACE_DETECT_MODE)) {
2524        uint8_t facedetectMode =
2525            frame_settings.find(ANDROID_STATISTICS_FACE_DETECT_MODE).data.u8[0];
2526        rc = AddSetParmEntryToBatch(mParameters,
2527                CAM_INTF_META_STATS_FACEDETECT_MODE,
2528                sizeof(facedetectMode), &facedetectMode);
2529    }
2530
2531    if (frame_settings.exists(ANDROID_STATISTICS_HISTOGRAM_MODE)) {
2532        uint8_t histogramMode =
2533            frame_settings.find(ANDROID_STATISTICS_HISTOGRAM_MODE).data.u8[0];
2534        rc = AddSetParmEntryToBatch(mParameters,
2535                CAM_INTF_META_STATS_HISTOGRAM_MODE,
2536                sizeof(histogramMode), &histogramMode);
2537    }
2538
2539    if (frame_settings.exists(ANDROID_STATISTICS_SHARPNESS_MAP_MODE)) {
2540        uint8_t sharpnessMapMode =
2541            frame_settings.find(ANDROID_STATISTICS_SHARPNESS_MAP_MODE).data.u8[0];
2542        rc = AddSetParmEntryToBatch(mParameters,
2543                CAM_INTF_META_STATS_SHARPNESS_MAP_MODE,
2544                sizeof(sharpnessMapMode), &sharpnessMapMode);
2545    }
2546
2547    if (frame_settings.exists(ANDROID_TONEMAP_MODE)) {
2548        uint8_t tonemapMode =
2549            frame_settings.find(ANDROID_TONEMAP_MODE).data.u8[0];
2550        rc = AddSetParmEntryToBatch(mParameters,
2551                CAM_INTF_META_TONEMAP_MODE,
2552                sizeof(tonemapMode), &tonemapMode);
2553    }
2554
2555    if (frame_settings.exists(ANDROID_CONTROL_CAPTURE_INTENT)) {
2556        uint8_t captureIntent =
2557            frame_settings.find(ANDROID_CONTROL_CAPTURE_INTENT).data.u8[0];
2558        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_CAPTURE_INTENT,
2559                sizeof(captureIntent), &captureIntent);
2560    }
2561
2562    if (frame_settings.exists(ANDROID_CONTROL_AE_REGIONS)) {
2563        cam_area_t roi;
2564        convertFromRegions(&roi, settings, ANDROID_CONTROL_AE_REGIONS);
2565        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AEC_ROI,
2566                sizeof(roi), &roi);
2567    }
2568
2569    if (frame_settings.exists(ANDROID_CONTROL_AF_REGIONS)) {
2570        cam_area_t roi;
2571        convertFromRegions(&roi, settings, ANDROID_CONTROL_AF_REGIONS);
2572        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AF_ROI,
2573                sizeof(roi), &roi);
2574    }
2575
2576    if (frame_settings.exists(ANDROID_CONTROL_AWB_REGIONS)) {
2577        cam_area_t roi;
2578        convertFromRegions(&roi, settings, ANDROID_CONTROL_AWB_REGIONS);
2579        rc = AddSetParmEntryToBatch(mParameters, CAM_INTF_META_AWB_REGIONS,
2580                sizeof(roi), &roi);
2581    }
2582    return rc;
2583}
2584
2585/*===========================================================================
2586 * FUNCTION   : getJpegSettings
2587 *
2588 * DESCRIPTION: save the jpeg settings in the HAL
2589 *
2590 *
2591 * PARAMETERS :
2592 *   @settings  : frame settings information from framework
2593 *
2594 *
2595 * RETURN     : success: NO_ERROR
2596 *              failure:
2597 *==========================================================================*/
2598int QCamera3HardwareInterface::getJpegSettings
2599                                  (const camera_metadata_t *settings)
2600{
2601    if (mJpegSettings) {
2602        free(mJpegSettings);
2603        mJpegSettings = NULL;
2604    }
2605    mJpegSettings = (jpeg_settings_t*) malloc(sizeof(jpeg_settings_t));
2606    CameraMetadata jpeg_settings;
2607    jpeg_settings = settings;
2608
2609    if (jpeg_settings.exists(ANDROID_JPEG_ORIENTATION)) {
2610        mJpegSettings->jpeg_orientation =
2611            jpeg_settings.find(ANDROID_JPEG_ORIENTATION).data.i32[0];
2612    } else {
2613        mJpegSettings->jpeg_orientation = 0;
2614    }
2615    if (jpeg_settings.exists(ANDROID_JPEG_QUALITY)) {
2616        mJpegSettings->jpeg_quality =
2617            jpeg_settings.find(ANDROID_JPEG_QUALITY).data.u8[0];
2618    } else {
2619        mJpegSettings->jpeg_quality = 85;
2620    }
2621    if (jpeg_settings.exists(ANDROID_JPEG_THUMBNAIL_SIZE)) {
2622        mJpegSettings->thumbnail_size.width =
2623            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[0];
2624        mJpegSettings->thumbnail_size.height =
2625            jpeg_settings.find(ANDROID_JPEG_THUMBNAIL_SIZE).data.i32[1];
2626        mJpegSettings->thumbnail_size.width = 320;
2627        mJpegSettings->thumbnail_size.height = 240;
2628    } else {
2629        mJpegSettings->thumbnail_size.width = 640;
2630        mJpegSettings->thumbnail_size.height = 480;
2631    }
2632    if (jpeg_settings.exists(ANDROID_JPEG_GPS_COORDINATES)) {
2633        for (int i = 0; i < 3; i++) {
2634            mJpegSettings->gps_coordinates[i] =
2635                jpeg_settings.find(ANDROID_JPEG_GPS_COORDINATES).data.d[i];
2636        }
2637    }
2638    if (jpeg_settings.exists(ANDROID_JPEG_GPS_TIMESTAMP)) {
2639        mJpegSettings->gps_timestamp =
2640            jpeg_settings.find(ANDROID_JPEG_GPS_TIMESTAMP).data.i64[0];
2641    }
2642
2643    if (jpeg_settings.exists(ANDROID_JPEG_GPS_PROCESSING_METHOD)) {
2644        mJpegSettings->gps_processing_method =
2645            jpeg_settings.find(ANDROID_JPEG_GPS_PROCESSING_METHOD).data.u8[0];
2646    }
2647    if (jpeg_settings.exists(ANDROID_SENSOR_SENSITIVITY)) {
2648        mJpegSettings->sensor_sensitivity =
2649            jpeg_settings.find(ANDROID_SENSOR_SENSITIVITY).data.i32[0];
2650    }
2651    if (jpeg_settings.exists(ANDROID_LENS_FOCAL_LENGTH)) {
2652        mJpegSettings->lens_focal_length =
2653            jpeg_settings.find(ANDROID_LENS_FOCAL_LENGTH).data.f[0];
2654    }
2655    mJpegSettings->max_jpeg_size = calcMaxJpegSize();
2656    return 0;
2657}
2658
2659/*===========================================================================
2660 * FUNCTION   : captureResultCb
2661 *
2662 * DESCRIPTION: Callback handler for all channels (streams, as well as metadata)
2663 *
2664 * PARAMETERS :
2665 *   @frame  : frame information from mm-camera-interface
2666 *   @buffer : actual gralloc buffer to be returned to frameworks. NULL if metadata.
2667 *   @userdata: userdata
2668 *
2669 * RETURN     : NONE
2670 *==========================================================================*/
2671void QCamera3HardwareInterface::captureResultCb(mm_camera_super_buf_t *metadata,
2672                camera3_stream_buffer_t *buffer,
2673                uint32_t frame_number, void *userdata)
2674{
2675    QCamera3HardwareInterface *hw = (QCamera3HardwareInterface *)userdata;
2676    if (hw == NULL) {
2677        ALOGE("%s: Invalid hw %p", __func__, hw);
2678        return;
2679    }
2680
2681    hw->captureResultCb(metadata, buffer, frame_number);
2682    return;
2683}
2684
2685/*===========================================================================
2686 * FUNCTION   : initialize
2687 *
2688 * DESCRIPTION: Pass framework callback pointers to HAL
2689 *
2690 * PARAMETERS :
2691 *
2692 *
2693 * RETURN     : Success : 0
2694 *              Failure: -ENODEV
2695 *==========================================================================*/
2696
2697int QCamera3HardwareInterface::initialize(const struct camera3_device *device,
2698                                  const camera3_callback_ops_t *callback_ops)
2699{
2700    ALOGV("%s: E", __func__);
2701    QCamera3HardwareInterface *hw =
2702        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2703    if (!hw) {
2704        ALOGE("%s: NULL camera device", __func__);
2705        return -ENODEV;
2706    }
2707
2708    int rc = hw->initialize(callback_ops);
2709    ALOGV("%s: X", __func__);
2710    return rc;
2711}
2712
2713/*===========================================================================
2714 * FUNCTION   : configure_streams
2715 *
2716 * DESCRIPTION:
2717 *
2718 * PARAMETERS :
2719 *
2720 *
2721 * RETURN     : Success: 0
2722 *              Failure: -EINVAL (if stream configuration is invalid)
2723 *                       -ENODEV (fatal error)
2724 *==========================================================================*/
2725
2726int QCamera3HardwareInterface::configure_streams(
2727        const struct camera3_device *device,
2728        camera3_stream_configuration_t *stream_list)
2729{
2730    ALOGV("%s: E", __func__);
2731    QCamera3HardwareInterface *hw =
2732        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2733    if (!hw) {
2734        ALOGE("%s: NULL camera device", __func__);
2735        return -ENODEV;
2736    }
2737    int rc = hw->configureStreams(stream_list);
2738    ALOGV("%s: X", __func__);
2739    return rc;
2740}
2741
2742/*===========================================================================
2743 * FUNCTION   : register_stream_buffers
2744 *
2745 * DESCRIPTION: Register stream buffers with the device
2746 *
2747 * PARAMETERS :
2748 *
2749 * RETURN     :
2750 *==========================================================================*/
2751int QCamera3HardwareInterface::register_stream_buffers(
2752        const struct camera3_device *device,
2753        const camera3_stream_buffer_set_t *buffer_set)
2754{
2755    ALOGV("%s: E", __func__);
2756    QCamera3HardwareInterface *hw =
2757        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2758    if (!hw) {
2759        ALOGE("%s: NULL camera device", __func__);
2760        return -ENODEV;
2761    }
2762    int rc = hw->registerStreamBuffers(buffer_set);
2763    ALOGV("%s: X", __func__);
2764    return rc;
2765}
2766
2767/*===========================================================================
2768 * FUNCTION   : construct_default_request_settings
2769 *
2770 * DESCRIPTION: Configure a settings buffer to meet the required use case
2771 *
2772 * PARAMETERS :
2773 *
2774 *
2775 * RETURN     : Success: Return valid metadata
2776 *              Failure: Return NULL
2777 *==========================================================================*/
2778const camera_metadata_t* QCamera3HardwareInterface::
2779    construct_default_request_settings(const struct camera3_device *device,
2780                                        int type)
2781{
2782
2783    ALOGV("%s: E", __func__);
2784    camera_metadata_t* fwk_metadata = NULL;
2785    QCamera3HardwareInterface *hw =
2786        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2787    if (!hw) {
2788        ALOGE("%s: NULL camera device", __func__);
2789        return NULL;
2790    }
2791
2792    fwk_metadata = hw->translateCapabilityToMetadata(type);
2793
2794    ALOGV("%s: X", __func__);
2795    return fwk_metadata;
2796}
2797
2798/*===========================================================================
2799 * FUNCTION   : process_capture_request
2800 *
2801 * DESCRIPTION:
2802 *
2803 * PARAMETERS :
2804 *
2805 *
2806 * RETURN     :
2807 *==========================================================================*/
2808int QCamera3HardwareInterface::process_capture_request(
2809                    const struct camera3_device *device,
2810                    camera3_capture_request_t *request)
2811{
2812    ALOGV("%s: E", __func__);
2813    QCamera3HardwareInterface *hw =
2814        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2815    if (!hw) {
2816        ALOGE("%s: NULL camera device", __func__);
2817        return -EINVAL;
2818    }
2819
2820    int rc = hw->processCaptureRequest(request);
2821    ALOGV("%s: X", __func__);
2822    return rc;
2823}
2824
2825/*===========================================================================
2826 * FUNCTION   : get_metadata_vendor_tag_ops
2827 *
2828 * DESCRIPTION:
2829 *
2830 * PARAMETERS :
2831 *
2832 *
2833 * RETURN     :
2834 *==========================================================================*/
2835
2836void QCamera3HardwareInterface::get_metadata_vendor_tag_ops(
2837                const struct camera3_device *device,
2838                vendor_tag_query_ops_t* ops)
2839{
2840    ALOGV("%s: E", __func__);
2841    QCamera3HardwareInterface *hw =
2842        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2843    if (!hw) {
2844        ALOGE("%s: NULL camera device", __func__);
2845        return;
2846    }
2847
2848    hw->getMetadataVendorTagOps(ops);
2849    ALOGV("%s: X", __func__);
2850    return;
2851}
2852
2853/*===========================================================================
2854 * FUNCTION   : dump
2855 *
2856 * DESCRIPTION:
2857 *
2858 * PARAMETERS :
2859 *
2860 *
2861 * RETURN     :
2862 *==========================================================================*/
2863
2864void QCamera3HardwareInterface::dump(
2865                const struct camera3_device *device, int fd)
2866{
2867    ALOGV("%s: E", __func__);
2868    QCamera3HardwareInterface *hw =
2869        reinterpret_cast<QCamera3HardwareInterface *>(device->priv);
2870    if (!hw) {
2871        ALOGE("%s: NULL camera device", __func__);
2872        return;
2873    }
2874
2875    hw->dump(fd);
2876    ALOGV("%s: X", __func__);
2877    return;
2878}
2879
2880/*===========================================================================
2881 * FUNCTION   : close_camera_device
2882 *
2883 * DESCRIPTION:
2884 *
2885 * PARAMETERS :
2886 *
2887 *
2888 * RETURN     :
2889 *==========================================================================*/
2890int QCamera3HardwareInterface::close_camera_device(struct hw_device_t* device)
2891{
2892    ALOGV("%s: E", __func__);
2893    int ret = NO_ERROR;
2894    QCamera3HardwareInterface *hw =
2895        reinterpret_cast<QCamera3HardwareInterface *>(
2896            reinterpret_cast<camera3_device_t *>(device)->priv);
2897    if (!hw) {
2898        ALOGE("NULL camera device");
2899        return BAD_VALUE;
2900    }
2901    delete hw;
2902    ALOGV("%s: X", __func__);
2903    return ret;
2904}
2905
2906}; //end namespace qcamera
2907