QCamera2HWI.cpp revision 72594c0844ef2066190ecaddf73c9207a983ad90
16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved.
26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* Redistribution and use in source and binary forms, with or without
46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* modification, are permitted provided that the following conditions are
56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* met:
66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Redistributions of source code must retain the above copyright
76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       notice, this list of conditions and the following disclaimer.
86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Redistributions in binary form must reproduce the above
96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       copyright notice, this list of conditions and the following
106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       disclaimer in the documentation and/or other materials provided
116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       with the distribution.
126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*     * Neither the name of The Linux Foundation nor the names of its
136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       contributors may be used to endorse or promote products derived
146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*       from this software without specific prior written permission.
156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*
286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*/
296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define LOG_TAG "QCamera2HWI"
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cutils/properties.h>
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <hardware/camera.h>
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <stdlib.h>
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/Errors.h>
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gralloc_priv.h>
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCamera2HWI.h"
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraMem.h"
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define MAP_TO_DRIVER_COORDINATE(val, base, scale, offset) (val * scale / base + offset)
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define CAMERA_MIN_STREAMING_BUFFERS     3
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define CAMERA_MIN_JPEG_ENCODING_BUFFERS 2
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define CAMERA_MIN_VIDEO_BUFFERS         9
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera {
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevcam_capability_t *gCamCapability[MM_CAMERA_MAX_NUM_SENSORS];
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatic pthread_mutex_t g_camlock = PTHREAD_MUTEX_INITIALIZER;
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevcamera_device_ops_t QCamera2HardwareInterface::mCameraOps = {
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    set_preview_window:         QCamera2HardwareInterface::set_preview_window,
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    set_callbacks:              QCamera2HardwareInterface::set_CallBacks,
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    enable_msg_type:            QCamera2HardwareInterface::enable_msg_type,
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    disable_msg_type:           QCamera2HardwareInterface::disable_msg_type,
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    msg_type_enabled:           QCamera2HardwareInterface::msg_type_enabled,
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    start_preview:              QCamera2HardwareInterface::start_preview,
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    stop_preview:               QCamera2HardwareInterface::stop_preview,
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    preview_enabled:            QCamera2HardwareInterface::preview_enabled,
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    store_meta_data_in_buffers: QCamera2HardwareInterface::store_meta_data_in_buffers,
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    start_recording:            QCamera2HardwareInterface::start_recording,
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    stop_recording:             QCamera2HardwareInterface::stop_recording,
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    recording_enabled:          QCamera2HardwareInterface::recording_enabled,
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    release_recording_frame:    QCamera2HardwareInterface::release_recording_frame,
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    auto_focus:                 QCamera2HardwareInterface::auto_focus,
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cancel_auto_focus:          QCamera2HardwareInterface::cancel_auto_focus,
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    take_picture:               QCamera2HardwareInterface::take_picture,
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cancel_picture:             QCamera2HardwareInterface::cancel_picture,
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    set_parameters:             QCamera2HardwareInterface::set_parameters,
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    get_parameters:             QCamera2HardwareInterface::get_parameters,
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    put_parameters:             QCamera2HardwareInterface::put_parameters,
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    send_command:               QCamera2HardwareInterface::send_command,
786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    release:                    QCamera2HardwareInterface::release,
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    dump:                       QCamera2HardwareInterface::dump,
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev};
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : set_preview_window
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set preview window.
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @window  : window ops table
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::set_preview_window(struct camera_device *device,
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        struct preview_stream_ops *window)
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: NULL camera device", __func__);
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = hw->processAPI(QCAMERA_SM_EVT_SET_PREVIEW_WINDOW, (void *)window);
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_SET_PREVIEW_WINDOW);
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = hw->m_apiResult.status;
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : set_CallBacks
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set callbacks for notify and data
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device     : ptr to camera device struct
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @notify_cb  : notify cb
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data_cb    : data cb
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data_cb_timestamp  : video data cd with timestamp
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @get_memory : ops table for request gralloc memory
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @user       : user data ptr
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::set_CallBacks(struct camera_device *device,
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera_notify_callback notify_cb,
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera_data_callback data_cb,
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera_data_timestamp_callback data_cb_timestamp,
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        camera_request_memory get_memory,
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        void *user)
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_sm_evt_setcb_payload_t payload;
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.notify_cb = notify_cb;
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.data_cb = data_cb;
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.data_cb_timestamp = data_cb_timestamp;
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.get_memory = get_memory;
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.user = user;
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = hw->processAPI(QCAMERA_SM_EVT_SET_CALLBACKS, (void *)&payload);
1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_SET_CALLBACKS);
1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : enable_msg_type
1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enable certain msg type
1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device     : ptr to camera device struct
1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type   : msg type mask
1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::enable_msg_type(struct camera_device *device, int32_t msg_type)
1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = hw->processAPI(QCAMERA_SM_EVT_ENABLE_MSG_TYPE, (void *)msg_type);
1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_ENABLE_MSG_TYPE);
1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : disable_msg_type
1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: disable certain msg type
1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device     : ptr to camera device struct
1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type   : msg type mask
1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::disable_msg_type(struct camera_device *device, int32_t msg_type)
2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = hw->processAPI(QCAMERA_SM_EVT_DISABLE_MSG_TYPE, (void *)msg_type);
2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_DISABLE_MSG_TYPE);
2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : msg_type_enabled
2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if certain msg type is enabled
2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device     : ptr to camera device struct
2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type   : msg type mask
2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : 1 -- enabled
2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0 -- not enabled
2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::msg_type_enabled(struct camera_device *device, int32_t msg_type)
2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_MSG_TYPE_ENABLED, (void *)msg_type);
2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_MSG_TYPE_ENABLED);
2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.enabled;
2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev   return ret;
2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : start_preview
2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start preview
2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::start_preview(struct camera_device *device)
2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
269fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: E", __func__);
2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_sm_evt_enum_t evt = QCAMERA_SM_EVT_START_PREVIEW;
2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (hw->isNoDisplayMode()) {
2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        evt = QCAMERA_SM_EVT_START_NODISPLAY_PREVIEW;
2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(evt, NULL);
2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(evt);
2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
281fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: X", __func__);
2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stop_preview
2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop preview
2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::stop_preview(struct camera_device *device)
2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
303fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: E", __func__);
3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = hw->processAPI(QCAMERA_SM_EVT_STOP_PREVIEW, NULL);
3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_STOP_PREVIEW);
3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
310fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: X", __func__);
3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : preview_enabled
3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if preview is running
3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : 1 -- running
3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0 -- not running
3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::preview_enabled(struct camera_device *device)
3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_PREVIEW_ENABLED, NULL);
3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_PREVIEW_ENABLED);
3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.enabled;
3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : store_meta_data_in_buffers
3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if need to store meta data in buffers for video frame
3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @enable  : flag if enable
3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::store_meta_data_in_buffers(
3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                struct camera_device *device, int enable)
3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS, (void *)enable);
3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_STORE_METADATA_IN_BUFS);
3736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
3816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : start_recording
3826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start recording
3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::start_recording(struct camera_device *device)
3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
401fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: E", __func__);
4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_START_RECORDING, NULL);
4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_START_RECORDING);
4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
409fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: X", __func__);
4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stop_recording
4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop recording
4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::stop_recording(struct camera_device *device)
4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
431fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: E", __func__);
4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = hw->processAPI(QCAMERA_SM_EVT_STOP_RECORDING, NULL);
4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_STOP_RECORDING);
4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
438fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: X", __func__);
4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : recording_enabled
4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if recording is running
4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : 1 -- running
4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              0 -- not running
4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::recording_enabled(struct camera_device *device)
4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_RECORDING_ENABLED, NULL);
4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_RECORDING_ENABLED);
4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.enabled;
4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : release_recording_frame
4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return recording frame back
4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @opaque  : ptr to frame to be returned
4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::release_recording_frame(
4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            struct camera_device *device, const void *opaque)
4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
492fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: E", __func__);
4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = hw->processAPI(QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME, (void *)opaque);
4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_RELEASE_RECORIDNG_FRAME);
4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
499fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: X", __func__);
5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : auto_focus
5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start auto focus
5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::auto_focus(struct camera_device *device)
5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
523fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s : E", __func__);
5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_START_AUTO_FOCUS, NULL);
5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_START_AUTO_FOCUS);
5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
531fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s : X", __func__);
5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : cancel_auto_focus
5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel auto focus
5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancel_auto_focus(struct camera_device *device)
5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_STOP_AUTO_FOCUS, NULL);
5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_STOP_AUTO_FOCUS);
5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : take_picture
5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: take picture
5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::take_picture(struct camera_device *device)
5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
589fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: E", __func__);
5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* Prepare snapshot in case LED needs to be flashed */
5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_PREPARE_SNAPSHOT, NULL);
5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_PREPARE_SNAPSHOT);
5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* Regardless what the result value for prepare_snapshot,
6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     * go ahead with capture anyway. Just like the way autofocus
6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     * is handled in capture case. */
6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* capture */
6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_TAKE_PICTURE, NULL);
6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_TAKE_PICTURE);
6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
611fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("[KPI Perf] %s: X", __func__);
6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : cancel_picture
6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel current take picture request
6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancel_picture(struct camera_device *device)
6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_CANCEL_PICTURE, NULL);
6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_CANCEL_PICTURE);
6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : set_parameters
6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set camera parameters
6516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @parms   : string of packed parameters
6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
6586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
6596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::set_parameters(struct camera_device *device,
6616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              const char *parms)
6626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
6646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
6656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
6666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
6676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
6686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
6696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
6716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_SET_PARAMS, (void *)parms);
6726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
6736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_SET_PARAMS);
6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : get_parameters
6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: query camera parameters
6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : packed parameters in a string
6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevchar* QCamera2HardwareInterface::get_parameters(struct camera_device *device)
6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char *ret = NULL;
6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = hw->processAPI(QCAMERA_SM_EVT_GET_PARAMS, NULL);
7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_GET_PARAMS);
7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.params;
7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : put_parameters
7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return camera parameters string back to HAL
7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @parm    : ptr to parameter string to be returned
7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::put_parameters(struct camera_device *device,
7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                               char *parm)
7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = hw->processAPI(QCAMERA_SM_EVT_PUT_PARAMS, (void *)parm);
7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_PUT_PARAMS);
7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : send_command
7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: command to be executed
7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cmd     : cmd to be executed
7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @arg1    : ptr to optional argument1
7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @arg2    : ptr to optional argument2
7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::send_command(struct camera_device *device,
7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            int32_t cmd,
7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            int32_t arg1,
7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            int32_t arg2)
7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_sm_evt_command_payload_t payload;
7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&payload, 0, sizeof(qcamera_sm_evt_command_payload_t));
7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.cmd = cmd;
7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.arg1 = arg1;
7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.arg2 = arg2;
7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_SEND_COMMAND, (void *)&payload);
7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_SEND_COMMAND);
7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : release
7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: release camera resource
7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::release(struct camera_device *device)
7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return;
8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = hw->processAPI(QCAMERA_SM_EVT_RELEASE, NULL);
8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_RELEASE);
8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : dump
8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: dump camera status
8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fd      : fd for status to be dumped to
8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::dump(struct camera_device *device, int fd)
8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_DUMP, (void *)fd);
8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_DUMP);
8356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.status;
8366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
8386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
8406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : close_camera_device
8446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: close camera device
8466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
8496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
8516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
8526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
8536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::close_camera_device(hw_device_t *hw_dev)
8556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
8576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
8586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(
8596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            reinterpret_cast<camera_device_t *>(hw_dev)->priv);
8606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
8616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
8626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
8636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    delete hw;
8656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
8666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
8676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
8686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
8696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : register_face_image
8706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: register a face image into imaging lib for face authenticatio/
8726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              face recognition
8736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
8756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @device  : ptr to camera device struct
8766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @img_ptr : ptr to image buffer
8776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @config  : ptr to config about input image, i.e., format, dimension, and etc.
8786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
8796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : >=0 unique ID of face registerd.
8806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              <0  failure.
8816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
8826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::register_face_image(struct camera_device *device,
8836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                   void *img_ptr,
8846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                   cam_pp_offline_src_config_t *config)
8856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
8866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
8876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *hw =
8886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        reinterpret_cast<QCamera2HardwareInterface *>(device->priv);
8896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!hw) {
8906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("NULL camera device");
8916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
8926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
8936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_sm_evt_reg_face_payload_t payload;
8946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&payload, 0, sizeof(qcamera_sm_evt_reg_face_payload_t));
8956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.img_ptr = img_ptr;
8966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    payload.config = config;
8976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->lockAPI();
8986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ret = hw->processAPI(QCAMERA_SM_EVT_REG_FACE_IMAGE, (void *)&payload);
8996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (ret == NO_ERROR) {
9006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        hw->waitAPIResult(QCAMERA_SM_EVT_REG_FACE_IMAGE);
9016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = hw->m_apiResult.handle;
9026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
9036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    hw->unlockAPI();
9046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
9066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
9076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
9096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : QCamera2HardwareInterface
9106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCamera2HardwareInterface
9126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
9146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cameraId  : camera ID
9156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
9176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
9186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCamera2HardwareInterface::QCamera2HardwareInterface(int cameraId)
9196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    : mCameraId(cameraId),
9206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      mCameraHandle(NULL),
9216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      mCameraOpened(false),
9226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      mPreviewWindow(NULL),
9236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      mMsgEnabled(0),
9246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      mStoreMetaDataInFrame(0),
9256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_stateMachine(this),
9266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_postprocessor(this),
9276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_thermalAdapter(QCameraThermalAdapter::getInstance()),
9286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_cbNotifier(this),
9296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_bShutterSoundPlayed(false),
9306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_currentFocusState(CAM_AF_NOT_FOCUSED),
9316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_bStartZSLSnapshotCalled(false),
9326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      m_pPowerModule(NULL),
9336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      mDumpFrmCnt(0),
9346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev      mDumpSkipCnt(0)
9356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
9366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraDevice.common.tag = HARDWARE_DEVICE_TAG;
9376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraDevice.common.version = HARDWARE_DEVICE_API_VERSION(1, 0);
9386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraDevice.common.close = close_camera_device;
9396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraDevice.ops = &mCameraOps;
9406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraDevice.priv = this;
9416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_init(&m_lock, NULL);
9446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_cond_init(&m_cond, NULL);
9456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&m_apiResult, 0, sizeof(qcamera_api_result_t));
9466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(m_channels, 0, sizeof(m_channels));
9486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef QCOM_POWER_H_EXTENDED
9506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (hw_get_module(POWER_HARDWARE_MODULE_ID, (const hw_module_t **)&m_pPowerModule)) {
9516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: %s module not found", __func__, POWER_HARDWARE_MODULE_ID);
9526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
9536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif
9546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
9566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
9586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : ~QCamera2HardwareInterface
9596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: destructor of QCamera2HardwareInterface
9616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
9636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
9656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
9666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCamera2HardwareInterface::~QCamera2HardwareInterface()
9676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
9686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    closeCamera();
9696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_destroy(&m_lock);
9706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_cond_destroy(&m_cond);
9716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
9726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
9746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : openCamera
9756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: open camera
9776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
9796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @hw_device  : double ptr for camera device struct
9806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
9816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
9826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
9836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
9846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
9856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::openCamera(struct hw_device_t **hw_device)
9866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
9876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
9886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mCameraOpened) {
9896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        *hw_device = NULL;
9906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return PERMISSION_DENIED;
9916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
9926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
9936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = openCamera();
9946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR)
9956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        *hw_device = &mCameraDevice.common;
9966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    else
9976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        *hw_device = NULL;
9986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
9996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
10006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
10026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : openCamera
10036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: open camera
10056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
10076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
10096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
10106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
10116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
10126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::openCamera()
10136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
10146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mCameraHandle) {
10156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("Failure: Camera already opened");
10166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return ALREADY_EXISTS;
10176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraHandle = camera_open(mCameraId);
10196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mCameraHandle) {
10206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("camera_open failed.");
10216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
10226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraHandle->ops->register_event_notify(mCameraHandle->camera_handle,
10256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              camEvtHandle,
10266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              (void *) this);
10276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = m_postprocessor.init(jpegEvtHandle, this);
10296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != 0) {
10306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("Init Postprocessor failed");
10316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
10326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // update padding info from jpeg
10356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_padding_info_t padding_info;
10366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_postprocessor.getJpegPaddingReq(padding_info);
10376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (gCamCapability[mCameraId]->padding_info.width_padding < padding_info.width_padding) {
10386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        gCamCapability[mCameraId]->padding_info.width_padding = padding_info.width_padding;
10396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (gCamCapability[mCameraId]->padding_info.height_padding < padding_info.height_padding) {
10416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        gCamCapability[mCameraId]->padding_info.height_padding = padding_info.height_padding;
10426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (gCamCapability[mCameraId]->padding_info.plane_padding < padding_info.plane_padding) {
10446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        gCamCapability[mCameraId]->padding_info.plane_padding = padding_info.plane_padding;
10456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = m_thermalAdapter.init(this);
10486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != 0) {
10496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("Init thermal adapter failed");
10506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParameters.init(gCamCapability[mCameraId], mCameraHandle);
10536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraOpened = true;
10546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
10566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
10576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
10596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : closeCamera
10606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: close camera
10626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
10646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
10656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
10666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
10676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
10686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
10696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::closeCamera()
10706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
10716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
10726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int i;
10736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // deinit Parameters
10756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParameters.deinit();
10766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // stop and deinit postprocessor
10786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_postprocessor.stop();
10796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_postprocessor.deinit();
10806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_thermalAdapter.deinit();
10826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // delete all channels if not already deleted
10846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (i = 0; i < QCAMERA_CH_TYPE_MAX; i++) {
10856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (m_channels[i] != NULL) {
10866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_channels[i]->stop();
10876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delete m_channels[i];
10886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_channels[i] = NULL;
10896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
10906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
10916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mCameraHandle->ops->close_camera(mCameraHandle->camera_handle);
10936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraHandle = NULL;
10946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCameraOpened = false;
10956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
10976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
10986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
10996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#define DATA_PTR(MEM_OBJ,INDEX) MEM_OBJ->getPtr( INDEX )
11006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
11026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : initCapabilities
11036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: initialize camera capabilities in static data struct
11056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
11076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cameraId  : camera Id
11086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
11106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
11116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
11126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
11136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::initCapabilities(int cameraId)
11146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
11156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
11166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_vtbl_t *cameraHandle = NULL;
11176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraHeapMemory *capabilityHeap = NULL;
11186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cameraHandle = camera_open(cameraId);
11206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!cameraHandle) {
11216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: camera_open failed", __func__);
11226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = UNKNOWN_ERROR;
11236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        goto open_failed;
11246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
11256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* Allocate memory for capability buffer */
11276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    capabilityHeap = new QCameraHeapMemory();
11286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = capabilityHeap->allocate(1, sizeof(cam_capability_t));
11296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc != OK) {
11306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No memory for cappability", __func__);
11316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        goto allocate_failed;
11326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
11336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* Map memory for capability buffer */
11356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(DATA_PTR(capabilityHeap,0), 0, sizeof(cam_capability_t));
11366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = cameraHandle->ops->map_buf(cameraHandle->camera_handle,
11376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                CAM_MAPPING_BUF_TYPE_CAPABILITY,
11386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                capabilityHeap->getFd(0),
11396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                sizeof(cam_capability_t));
11406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc < 0) {
11416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: failed to map capability buffer", __func__);
11426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        goto map_failed;
11436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
11446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    /* Query Capability */
11466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = cameraHandle->ops->query_capability(cameraHandle->camera_handle);
11476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc < 0) {
11486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: failed to query capability",__func__);
11496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        goto query_failed;
11506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
11516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    gCamCapability[cameraId] = (cam_capability_t *)malloc(sizeof(cam_capability_t));
11526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!gCamCapability[cameraId]) {
11536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: out of memory", __func__);
11546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        goto query_failed;
11556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
11566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memcpy(gCamCapability[cameraId], DATA_PTR(capabilityHeap,0),
11576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                        sizeof(cam_capability_t));
11586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = NO_ERROR;
11606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevquery_failed:
11626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cameraHandle->ops->unmap_buf(cameraHandle->camera_handle,
11636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            CAM_MAPPING_BUF_TYPE_CAPABILITY);
11646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevmap_failed:
11656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    capabilityHeap->deallocate();
11666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    delete capabilityHeap;
11676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevallocate_failed:
11686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cameraHandle->ops->close_camera(cameraHandle->camera_handle);
11696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cameraHandle = NULL;
11706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevopen_failed:
11716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
11726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
11736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
11756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getCapabilities
11766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: query camera capabilities
11786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
11806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cameraId  : camera Id
11816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @info      : camera info struct to be filled in with camera capabilities
11826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
11836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
11846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
11856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
11866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
11876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::getCapabilities(int cameraId,
11886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                    struct camera_info *info)
11896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
11906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
11916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
11926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&g_camlock);
11936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == gCamCapability[cameraId]) {
11946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = initCapabilities(cameraId);
11956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rc < 0) {
11966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pthread_mutex_unlock(&g_camlock);
11976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return rc;
11986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
11996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
12006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(gCamCapability[cameraId]->position) {
12026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_POSITION_BACK:
12036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        info->facing = CAMERA_FACING_BACK;
12046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_POSITION_FRONT:
12076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        info->facing = CAMERA_FACING_FRONT;
12086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
12116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s:Unknown position type for camera id:%d", __func__, cameraId);
12126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = BAD_VALUE;
12136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
12156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    info->orientation = gCamCapability[cameraId]->sensor_mount_angle;
12176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&g_camlock);
12186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
12196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
12206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
12226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getBufNumRequired
12236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return number of stream buffers needed for given stream type
12256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
12276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @stream_type  : type of stream
12286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
12296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : number of buffers needed
12306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
12316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevuint8_t QCamera2HardwareInterface::getBufNumRequired(cam_stream_type_t stream_type)
12326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
12336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int bufferCnt = 0;
12346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int minCaptureBuffers = mParameters.getNumOfSnapshots();
12356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int zslQBuffers = mParameters.getZSLQueueDepth() +
12376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                      mParameters.getMaxUnmatchedFramesInQueue();
12386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int minCircularBufNum = CAMERA_MIN_STREAMING_BUFFERS +
12406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            CAMERA_MIN_JPEG_ENCODING_BUFFERS +
12416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            mParameters.getMaxUnmatchedFramesInQueue() +
12426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            mParameters.getNumOfHDRBufsIfNeeded();
12436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
12446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // Get buffer count for the particular stream type
12456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (stream_type) {
12466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_PREVIEW:
12476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
12486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (mParameters.isZSLMode()) {
12496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                bufferCnt = zslQBuffers + minCircularBufNum;
12506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
12516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                bufferCnt = CAMERA_MIN_STREAMING_BUFFERS +
12526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            mParameters.getMaxUnmatchedFramesInQueue();
12536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
12546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_POSTVIEW:
12576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
12586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bufferCnt = minCaptureBuffers +
12596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getMaxUnmatchedFramesInQueue() +
12606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getNumOfExtraHDRBufsIfNeeded() +
12616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAMERA_MIN_STREAMING_BUFFERS;
12626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_SNAPSHOT:
12656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
12666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (mParameters.isZSLMode()) {
12676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                bufferCnt = zslQBuffers + minCircularBufNum;
12686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
12696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                bufferCnt = minCaptureBuffers +
12706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            mParameters.getMaxUnmatchedFramesInQueue() +
12716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            mParameters.getNumOfExtraHDRBufsIfNeeded() +
12726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            CAMERA_MIN_STREAMING_BUFFERS;
12736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
12746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_RAW:
12776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mParameters.isZSLMode()) {
12786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bufferCnt = zslQBuffers + CAMERA_MIN_STREAMING_BUFFERS;
12796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
12806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bufferCnt = minCaptureBuffers +
12816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getMaxUnmatchedFramesInQueue() +
12826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getNumOfExtraHDRBufsIfNeeded() +
12836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAMERA_MIN_STREAMING_BUFFERS;
12846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_VIDEO:
12876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
12886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bufferCnt = CAMERA_MIN_VIDEO_BUFFERS +
12896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getMaxUnmatchedFramesInQueue() +
12906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAMERA_MIN_STREAMING_BUFFERS;
12916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
12926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
12936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_METADATA:
12946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
12956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bufferCnt = minCaptureBuffers +
12966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getMaxUnmatchedFramesInQueue() +
12976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getNumOfExtraHDRBufsIfNeeded() +
12986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        CAMERA_MIN_STREAMING_BUFFERS;
12996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (bufferCnt < zslQBuffers + minCircularBufNum) {
13006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                bufferCnt = zslQBuffers + minCircularBufNum;
13016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
13026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_OFFLINE_PROC:
13056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
13066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            bufferCnt = minCaptureBuffers +
13076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mParameters.getMaxUnmatchedFramesInQueue();
13086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (bufferCnt < CAMERA_MIN_STREAMING_BUFFERS) {
13096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                bufferCnt = CAMERA_MIN_STREAMING_BUFFERS;
13106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
13116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_DEFAULT:
13146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_MAX:
13156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
13166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        bufferCnt = 0;
13176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
13196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return bufferCnt;
13216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
13226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
13246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : allocateStreamBuf
13256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: alocate stream buffers
13276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
13296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @stream_type  : type of stream
13306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @size         : size of buffer
13316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @bufferCnt    : [IN/OUT] minimum num of buffers to be allocated.
13326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                   could be modified during allocation if more buffers needed
13336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
13346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : ptr to a memory obj that holds stream buffers.
13356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NULL if failed
13366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
13376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraMemory *QCamera2HardwareInterface::allocateStreamBuf(cam_stream_type_t stream_type,
13386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                            int size,
13396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                            uint8_t &bufferCnt)
13406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
13416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
13426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraMemory *mem = NULL;
13436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // Allocate stream buffer memory object
13456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (stream_type) {
13466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_PREVIEW:
1347fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li        {
1348fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            if (isNoDisplayMode()) {
1349fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                mem = new QCameraStreamMemory(mGetMemory);
1350fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            } else {
1351fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                cam_dimension_t dim;
1352fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                QCameraGrallocMemory *grallocMemory = new QCameraGrallocMemory(mGetMemory);
1353fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li
1354fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                mParameters.getStreamDimension(stream_type, dim);
1355fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                if (grallocMemory)
1356fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                    grallocMemory->setWindowInfo(mPreviewWindow, dim.width, dim.height,
1357fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                            mParameters.getPreviewHalPixelFormat());
1358fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                mem = grallocMemory;
1359fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            }
1360fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li        }
1361fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li        break;
1362fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li    case CAM_STREAM_TYPE_POSTVIEW:
1363fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li        {
1364fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            cam_dimension_t dim;
1365fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            QCameraGrallocMemory *grallocMemory = new QCameraGrallocMemory(mGetMemory);
1366fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li
1367fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            mParameters.getStreamDimension(stream_type, dim);
1368fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            if (grallocMemory)
1369fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                grallocMemory->setWindowInfo(mPreviewWindow, dim.width, dim.height,
1370fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li                        mParameters.getPreviewHalPixelFormat());
1371fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li            mem = grallocMemory;
13726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_SNAPSHOT:
13756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_RAW:
13766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_METADATA:
13776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_OFFLINE_PROC:
13786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mem = new QCameraStreamMemory(mGetMemory);
13796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_VIDEO:
13816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mem = new QCameraVideoMemory(mGetMemory);
13826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_DEFAULT:
13846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_MAX:
13856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
13866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
13876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mem) {
13886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
13896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
13906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
13916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (bufferCnt > 0) {
13926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mem->allocate(bufferCnt, size);
13936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rc < 0) {
13946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delete mem;
13956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return NULL;
13966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
13976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        bufferCnt = mem->getCnt();
13986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
13996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mem;
14006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
14016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
14036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : allocateStreamInfoBuf
14046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: alocate stream info buffer
14066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
14086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @stream_type  : type of stream
14096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : ptr to a memory obj that holds stream info buffer.
14116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NULL if failed
14126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
14136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraHeapMemory *QCamera2HardwareInterface::allocateStreamInfoBuf(
14146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_stream_type_t stream_type)
14156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
14166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
14176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraHeapMemory *streamInfoBuf = new QCameraHeapMemory();
14196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!streamInfoBuf) {
14206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("allocateStreamInfoBuf: Unable to allocate streamInfo object");
14216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
14226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = streamInfoBuf->allocate(1, sizeof(cam_stream_info_t));
14256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc < 0) {
14266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("allocateStreamInfoBuf: Failed to allocate stream info memory");
14276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete streamInfoBuf;
14286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
14296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_stream_info_t *streamInfo = (cam_stream_info_t *)streamInfoBuf->getPtr(0);
14326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(streamInfo, 0, sizeof(cam_stream_info_t));
14336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfo->stream_type = stream_type;
14346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getStreamFormat(stream_type, streamInfo->fmt);
14356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getStreamDimension(stream_type, streamInfo->dim);
14366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
14386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (stream_type) {
14396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_SNAPSHOT:
14406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_RAW:
14416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mParameters.isZSLMode()) {
14426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
14436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
14446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST;
14456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->num_of_burst = mParameters.getNumOfSnapshots();
14466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_STREAM_TYPE_POSTVIEW:
14496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        streamInfo->streaming_mode = CAM_STREAMING_MODE_BURST;
14506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        streamInfo->num_of_burst = mParameters.getNumOfSnapshots();
14516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
14536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
14546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    //set flip mode based on Stream type;
14576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int flipMode = mParameters.getFlipMode(stream_type);
1458fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li    if (flipMode > 0) {
1459fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li        streamInfo->pp_config.feature_mask |= CAM_QCOM_FEATURE_FLIP;
1460fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li        streamInfo->pp_config.flip = flipMode;
1461fde009c21f68cbf3562e68b88603730f9d416f3cMuhua Li    }
14626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // set Rotation if need online rotation per stream in CPP
14646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (needOnlineRotation()) {
14656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        streamInfo->pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
14666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        int rotation = mParameters.getJpegRotation();
14676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rotation == 0) {
14686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->pp_config.rotation = ROTATE_0;
14696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else if (rotation == 90) {
14706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->pp_config.rotation = ROTATE_90;
14716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else if (rotation == 180) {
14726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->pp_config.rotation = ROTATE_180;
14736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else if (rotation == 270) {
14746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            streamInfo->pp_config.rotation = ROTATE_270;
14756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
14766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
14776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return streamInfoBuf;
14796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
14806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
14816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
14826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : setPreviewWindow
14836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set preview window impl
14856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
14876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @window  : ptr to window ops table struct
14886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
14896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
14906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
14916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
14926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
14936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::setPreviewWindow(
14946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        struct preview_stream_ops *window)
14956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
14966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mPreviewWindow = window;
14976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
14986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
14996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
15016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : setCallBacks
15026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set callbacks impl
15046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @notify_cb  : notify cb
15076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data_cb    : data cb
15086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data_cb_timestamp : data cb with time stamp
15096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @get_memory : request memory ops table
15106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @user       : user data ptr
15116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
15136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
15146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
15156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::setCallBacks(camera_notify_callback notify_cb,
15176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            camera_data_callback data_cb,
15186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            camera_data_timestamp_callback data_cb_timestamp,
15196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            camera_request_memory get_memory,
15206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            void *user)
15216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mNotifyCb        = notify_cb;
15236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mDataCb          = data_cb;
15246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mDataCbTimestamp = data_cb_timestamp;
15256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mGetMemory       = get_memory;
15266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mCallbackCookie  = user;
15276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_cbNotifier.setCallbacks(notify_cb, data_cb, data_cb_timestamp, user);
15286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
15296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
15306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
15326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : enableMsgType
15336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enable msg type impl
15356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type  : msg type mask to be enabled
15386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
15406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
15416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
15426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::enableMsgType(int32_t msg_type)
15446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mMsgEnabled |= msg_type;
15466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
15476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
15486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
15506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : disableMsgType
15516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: disable msg type impl
15536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type  : msg type mask to be disabled
15566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
15586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
15596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
15606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::disableMsgType(int32_t msg_type)
15626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mMsgEnabled &= ~msg_type;
15646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
15656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
15666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
15686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : msgTypeEnabled
15696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: impl to determine if certain msg_type is enabled
15716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type  : msg type mask
15746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : 0 -- not enabled
15766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none 0 -- enabled
15776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::msgTypeEnabled(int32_t msg_type)
15796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return (mMsgEnabled & msg_type);
15816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
15826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
15836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
15846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : msgTypeEnabledWithLock
15856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: impl to determine if certain msg_type is enabled with lock
15876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
15896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type  : msg type mask
15906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
15916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : 0 -- not enabled
15926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none 0 -- enabled
15936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
15946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::msgTypeEnabledWithLock(int32_t msg_type)
15956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
15966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int enabled = 0;
15976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    lockAPI();
15986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    enabled = mMsgEnabled & msg_type;
15996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    unlockAPI();
16006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return enabled;
16016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
16026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
16046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : startPreview
16056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start preview impl
16076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
16096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
16116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
16126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
16136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
16146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::startPreview()
16156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
16166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
1617fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: E", __func__);
16186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // start preview stream
16194faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab    if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) {
16206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = startChannel(QCAMERA_CH_TYPE_ZSL);
16216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
16226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = startChannel(QCAMERA_CH_TYPE_PREVIEW);
16236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1624fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: X", __func__);
16256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
16266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
16276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
16296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stopPreview
16306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop preview impl
16326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
16346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
16366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
16376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
16386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
16396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::stopPreview()
16406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1641fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: E", __func__);
16426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // stop preview stream
16434faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab    if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) {
16446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stopChannel(QCAMERA_CH_TYPE_ZSL);
16456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
16466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stopChannel(QCAMERA_CH_TYPE_PREVIEW);
16476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
16486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // delete all channels from preparePreview
16506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    unpreparePreview();
1651fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: X", __func__);
16526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
16536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
16546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
16566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : storeMetaDataInBuffers
16576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enable store meta data in buffers for video frames impl
16596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
16616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @enable  : flag if need enable
16626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
16646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
16656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
16666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
16676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::storeMetaDataInBuffers(int enable)
16686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
16696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mStoreMetaDataInFrame = enable;
16706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
16716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
16726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
16746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : startRecording
16756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start recording impl
16776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
16796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
16806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
16816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
16826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
16836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
16846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::startRecording()
16856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
16866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
1687fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: E", __func__);
16886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mParameters.getRecordingHintValue() == false) {
16896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: start recording when hint is false, stop preview first", __func__);
16906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stopChannel(QCAMERA_CH_TYPE_PREVIEW);
16916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delChannel(QCAMERA_CH_TYPE_PREVIEW);
16926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
16936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // Set local recording hint to TRUE
16946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mParameters.setRecordingHintValue(true);
16956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = preparePreview();
16966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rc == NO_ERROR) {
16976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = startChannel(QCAMERA_CH_TYPE_PREVIEW);
16986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
16996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
17006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
17026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = startChannel(QCAMERA_CH_TYPE_VIDEO);
17036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
17046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef QCOM_POWER_H_EXTENDED
17066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
17076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (m_pPowerModule) {
17086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (m_pPowerModule->powerHint) {
17096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, (void *)"state=1");
17106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
17116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
17136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif
1714fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: X", __func__);
17156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
17166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
17176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
17196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stopRecording
17206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop recording impl
17226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
17246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
17266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
17276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
17286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
17296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::stopRecording()
17306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
17316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = stopChannel(QCAMERA_CH_TYPE_VIDEO);
1732fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: E", __func__);
17336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#ifdef QCOM_POWER_H_EXTENDED
17346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_pPowerModule) {
17356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (m_pPowerModule->powerHint) {
17366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_pPowerModule->powerHint(m_pPowerModule, POWER_HINT_VIDEO_ENCODE, (void *)"state=0");
17376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
17396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif
1740fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: X", __func__);
17416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
17426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
17436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
17456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : releaseRecordingFrame
17466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return video frame impl
17486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
17506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @opaque  : ptr to video frame to be returned
17516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
17536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
17546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
17556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
17566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::releaseRecordingFrame(const void * opaque)
17576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
17586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = UNKNOWN_ERROR;
17596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraVideoChannel *pChannel =
17606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        (QCameraVideoChannel *)m_channels[QCAMERA_CH_TYPE_VIDEO];
1761fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: opaque data = %p", __func__,opaque);
17626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(pChannel != NULL) {
17636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = pChannel->releaseFrame(opaque, mStoreMetaDataInFrame > 0);
17646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
17656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
17666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
17676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
17696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : autoFocus
17706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start auto focus impl
17726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
17746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
17756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
17766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
17776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
17786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
17796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::autoFocus()
17806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
17816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
17826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_focus_mode_type focusMode = mParameters.getFocusMode();
17836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
17846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (focusMode) {
17856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_AUTO:
17866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_MACRO:
17876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
17886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mCameraHandle->ops->do_auto_focus(mCameraHandle->camera_handle);
17896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
17906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                mParameters.setAFRunning(true);
17916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
17926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
17936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
17946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_CONTINOUS_VIDEO:
17956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // According to Google API definition, the focus callback will immediately
17966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // return with a boolean that indicates whether the focus is sharp or not.
17976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // The focus position is locked after autoFocus call.
17986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // in this sense, the effect is the same as cancel_auto_focus
17996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
18006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mParameters.setLockCAF(true);
18016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // send evt notify that foucs is done
18036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            sendEvtNotify(CAMERA_MSG_FOCUS,
18046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          (m_currentFocusState == CAM_AF_FOCUSED)? true : false,
18056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          0);
18066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_CONTINOUS_PICTURE:
18096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // According to Google API definition, if the autofocus is in the middle
18106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // of scanning, the focus callback will return when it completes. If the
18116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // autofocus is not scanning, focus callback will immediately return with
18126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // a boolean that indicates whether the focus is sharp or not. The apps
18136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // can then decide if they want to take a picture immediately or to change
18146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // the focus mode to auto, and run a full autofocus cycle. The focus position
18156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // is locked after autoFocus call.
18166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (m_currentFocusState != CAM_AF_SCANNING) {
18176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // lock focus
18186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mParameters.setLockCAF(true);
18196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // send evt notify that foucs is done
18216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            sendEvtNotify(CAMERA_MSG_FOCUS,
18226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          (m_currentFocusState == CAM_AF_FOCUSED)? true : false,
18236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                          0);
18246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
18256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // set flag that lock CAF is needed once focus state becomes focsued/not focused
18266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mParameters.setLockCAFNeeded(true);
18276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = NO_ERROR;
18286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_INFINITY:
18316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_FIXED:
18326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_EDOF:
18336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
18346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No ops in focusMode (%d)", __func__, focusMode);
18356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = BAD_VALUE;
18366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
18386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
18396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
18406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
18426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : cancelAutoFocus
18436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel auto focus impl
18456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
18476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
18496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
18506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
18516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
18526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancelAutoFocus()
18536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
18546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
18556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_focus_mode_type focusMode = mParameters.getFocusMode();
18566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (focusMode) {
18586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_AUTO:
18596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_MACRO:
18606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mParameters.isAFRunning()) {
18616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mCameraHandle->ops->cancel_auto_focus(mCameraHandle->camera_handle);
18626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
18636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                mParameters.setAFRunning(false);
18646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
18656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_CONTINOUS_VIDEO:
18686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_CONTINOUS_PICTURE:
18696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mParameters.isCAFLocked()) {
18706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // resume CAF by unlock CAF
18716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = mParameters.setLockCAF(false);;
18726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mParameters.setLockCAFNeeded(false);
18736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
18746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_INFINITY:
18766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_FIXED:
18776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_EDOF:
18786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
18796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGI("%s: No ops in focusMode (%d)", __func__, focusMode);
18806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
18816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
18826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
18836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
18846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
18856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
18866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : takePicture
18876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: take picture impl
18896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
18916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
18926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
18936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
18946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
18956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
18966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::takePicture()
18976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
18986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
18996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t numSnapshots = mParameters.getNumOfSnapshots();
1900fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: E", __func__);
19016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mParameters.isZSLMode()) {
19026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        QCameraPicChannel *pZSLChannel =
19036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL];
19046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != pZSLChannel) {
19056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // start postprocessor
19066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_postprocessor.start(pZSLChannel);
19076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = pZSLChannel->takePicture(numSnapshots);
19096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc != NO_ERROR) {
19106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: cannot take ZSL picture", __func__);
19116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_postprocessor.stop();
19126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                return rc;
19136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
19146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
19156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: ZSL channel is NULL", __func__);
19166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return UNKNOWN_ERROR;
19176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
19196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // normal capture case
19206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // need to stop preview channel
19216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stopChannel(QCAMERA_CH_TYPE_PREVIEW);
19226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delChannel(QCAMERA_CH_TYPE_PREVIEW);
19236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // start snapshot
19257fde32d818742141a39fda194e66b84109182affEmilian Peev        if (mParameters.isJpegPictureFormat() ||
19267fde32d818742141a39fda194e66b84109182affEmilian Peev            mParameters.isNV16PictureFormat() ) {
19276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = addCaptureChannel();
19286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
19296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // start postprocessor
19306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_CAPTURE]);
19316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // start catpure channel
19336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = startChannel(QCAMERA_CH_TYPE_CAPTURE);
19346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (rc != NO_ERROR) {
19356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    ALOGE("%s: cannot start capture channel", __func__);
19366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_postprocessor.stop();
19376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    delChannel(QCAMERA_CH_TYPE_CAPTURE);
19386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    return rc;
19396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
19406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
19416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: cannot add capture channel", __func__);
19426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                return rc;
19436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
19446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
19456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = addRawChannel();
19466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc == NO_ERROR) {
19476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // start postprocessor
19486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_RAW]);
19496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                rc = startChannel(QCAMERA_CH_TYPE_RAW);
19506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if (rc != NO_ERROR) {
19516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    ALOGE("%s: cannot start raw channel", __func__);
19526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    m_postprocessor.stop();
19536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    delChannel(QCAMERA_CH_TYPE_RAW);
19546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    return rc;
19556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
19566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            } else {
19576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ALOGE("%s: cannot add raw channel", __func__);
19586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                return rc;
19596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
19606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1962fbe69a7ac63f99c63d50d9abaed766c81d2aab13Muhua Li    ALOGD("%s: X", __func__);
19636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
19646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
19656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
19676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : cancelPicture
19686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel picture impl
19706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
19726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
19736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
19746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
19756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
19766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
19776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancelPicture()
19786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
19796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    //stop post processor
19806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_postprocessor.stop();
19816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
19826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mParameters.isZSLMode()) {
19836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        QCameraPicChannel *pZSLChannel =
19846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            (QCameraPicChannel *)m_channels[QCAMERA_CH_TYPE_ZSL];
19856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != pZSLChannel) {
19866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (m_bStartZSLSnapshotCalled) {
19876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                mCameraHandle->ops->stop_zsl_snapshot(
19886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        mCameraHandle->camera_handle);
19896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                m_bStartZSLSnapshotCalled = false;
19906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
19916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pZSLChannel->cancelPicture();
19926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
19936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
19946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // normal capture case
19957fde32d818742141a39fda194e66b84109182affEmilian Peev        if (mParameters.isJpegPictureFormat() ||
19967fde32d818742141a39fda194e66b84109182affEmilian Peev            mParameters.isNV16PictureFormat() ) {
19976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stopChannel(QCAMERA_CH_TYPE_CAPTURE);
19986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delChannel(QCAMERA_CH_TYPE_CAPTURE);
19996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
20006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stopChannel(QCAMERA_CH_TYPE_RAW);
20016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delChannel(QCAMERA_CH_TYPE_RAW);
20026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
20036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
20046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
20056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
20066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
20086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : takeLiveSnapshot
20096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: take live snapshot during recording
20116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
20136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
20156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
20166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
20176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
20186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::takeLiveSnapshot()
20196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
20206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
20216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // start post processor
20236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = m_postprocessor.start(m_channels[QCAMERA_CH_TYPE_SNAPSHOT]);
20246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // start snapshot channel
20266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
20276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = startChannel(QCAMERA_CH_TYPE_SNAPSHOT);
20286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
20296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
20306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
20316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
20336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : cancelLiveSnapshot
20346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: cancel current live snapshot request
20366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
20386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
20406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
20416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
20426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
20436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::cancelLiveSnapshot()
20446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
20456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
20466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    //stop post processor
20486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_postprocessor.stop();
20496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // stop snapshot channel
20516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = stopChannel(QCAMERA_CH_TYPE_SNAPSHOT);
20526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
20546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
20556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
20576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getParameters
20586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get parameters impl
20606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
20626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : a string containing parameter pairs
20646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
20656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevchar* QCamera2HardwareInterface::getParameters()
20666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
20676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char* strParams = NULL;
20686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    String8 str;
20696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    str = mParameters.flatten( );
20706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    strParams = (char *)malloc(sizeof(char)*(str.length()+1));
20716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(strParams != NULL){
20726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        memset(strParams, 0, sizeof(char)*(str.length()+1));
20736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        strncpy(strParams, str.string(), str.length());
20746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        strParams[str.length()] = 0;
20756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
20766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return strParams;
20776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
20786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
20806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : putParameters
20816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: put parameters string impl
20836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
20856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @parms   : parameters string to be released
20866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
20876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
20886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
20896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
20906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
20916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::putParameters(char *parms)
20926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
20936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    free(parms);
20946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
20956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
20966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
20976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
20986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : sendCommand
20996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send command impl
21016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
21036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @command : command to be executed
21046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @arg1    : optional argument 1
21056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @arg2    : optional argument 2
21066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
21086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
21096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
21106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
21116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::sendCommand(int32_t command, int32_t /*arg1*/, int32_t /*arg2*/)
21126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
21136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
21146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (command) {
21166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAMERA_CMD_START_FACE_DETECTION:
21176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAMERA_CMD_STOP_FACE_DETECTION:
21186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = setFaceDetection(command == CAMERA_CMD_START_FACE_DETECTION? true : false);
21196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
21216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = NO_ERROR;
21226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
21236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
21256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
21266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
21286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : registerFaceImage
21296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: register face image impl
21316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
21336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @img_ptr : ptr to image buffer
21346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @config  : ptr to config struct about input image info
21356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @faceID  : [OUT] face ID to uniquely identifiy the registered face image
21366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
21376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
21386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
21396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
21406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
21416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::registerFaceImage(void *img_ptr,
21426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                 cam_pp_offline_src_config_t *config,
21436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                 int32_t &faceID)
21446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
21456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = NO_ERROR;
21466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    faceID = -1;
21476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (img_ptr == NULL || config == NULL) {
21496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: img_ptr or config is NULL", __func__);
21506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return BAD_VALUE;
21516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // allocate ion memory for source image
21546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraHeapMemory *imgBuf = new QCameraHeapMemory();
21556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (imgBuf == NULL) {
21566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Unable to new heap memory obj for image buf", __func__);
21576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
21586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = imgBuf->allocate(1, config->input_buf_planes.plane_info.frame_len);
21616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc < 0) {
21626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Unable to allocate heap memory for image buf", __func__);
21636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete imgBuf;
21646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
21656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    void *pBufPtr = imgBuf->getPtr(0);
21686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pBufPtr == NULL) {
21696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: image buf is NULL", __func__);
21706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        imgBuf->deallocate();
21716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete imgBuf;
21726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
21736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memcpy(pBufPtr, img_ptr, config->input_buf_planes.plane_info.frame_len);
21756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_pp_feature_config_t pp_feature;
21776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&pp_feature, 0, sizeof(cam_pp_feature_config_t));
21786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pp_feature.feature_mask = CAM_QCOM_FEATURE_REGISTER_FACE;
21796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraReprocessChannel *pChannel =
21806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        addOfflineReprocChannel(*config, pp_feature, NULL, NULL);
21816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pChannel == NULL) {
21836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: fail to add offline reprocess channel", __func__);
21846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        imgBuf->deallocate();
21856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete imgBuf;
21866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
21876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
218972594c0844ef2066190ecaddf73c9207a983ad90Muhua Li    rc = pChannel->start();
21906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
21916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Cannot start reprocess channel", __func__);
21926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        imgBuf->deallocate();
21936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete imgBuf;
21946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
21956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
21966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
21976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
21986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->doReprocess(imgBuf->getFd(0), imgBuf->getSize(0), faceID);
21996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // done with register face image, free imgbuf and delete reprocess channel
22016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    imgBuf->deallocate();
22026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    delete imgBuf;
22036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    imgBuf = NULL;
22046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel->stop();
22056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    delete pChannel;
22066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = NULL;
22076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
22096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : release
22136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: release camera resource impl
22156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
22176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
22196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
22206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
22216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
22226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::release()
22236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // stop and delete all channels
22256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i <QCAMERA_CH_TYPE_MAX ; i++) {
22266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (m_channels[i] != NULL) {
22276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            stopChannel((qcamera_ch_type_enum_t)i);
22286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delChannel((qcamera_ch_type_enum_t)i);
22296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
22306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
22316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
22336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : dump
22376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: camera status dump impl
22396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
22416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fd      : fd for the buffer to be dumped with camera status
22426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
22446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
22456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
22466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
22476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::dump(int /*fd*/)
22486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ALOGE("%s: not supported yet", __func__);
22506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return INVALID_OPERATION;
22516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processAPI
22556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process API calls from upper layer
22576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
22596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @api         : API to be processed
22606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @api_payload : ptr to API payload if any
22616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
22636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
22646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
22656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
22666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::processAPI(qcamera_sm_evt_enum_t api, void *api_payload)
22676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return m_stateMachine.procAPI(api, api_payload);
22696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processEvt
22736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process Evt from backend via mm-camera-interface
22756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
22776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt         : event type to be processed
22786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt_payload : ptr to event payload if any
22796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
22816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
22826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
22836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
22846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::processEvt(qcamera_sm_evt_enum_t evt, void *evt_payload)
22856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
22866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return m_stateMachine.procEvt(evt, evt_payload);
22876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
22886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
22896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
22906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : evtHandle
22916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Function registerd to mm-camera-interface to handle backend events
22936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
22956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @camera_handle : event type to be processed
22966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @evt           : ptr to event
22976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @user_data     : user data ptr
22986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
22996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
23006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
23016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::camEvtHandle(uint32_t /*camera_handle*/,
23026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                          mm_camera_event_t *evt,
23036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                          void *user_data)
23046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
23056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *obj = (QCamera2HardwareInterface *)user_data;
23066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (obj && evt) {
23076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mm_camera_event_t *payload =
23086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            (mm_camera_event_t *)malloc(sizeof(mm_camera_event_t));
23096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != payload) {
23106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            *payload = *evt;
23116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            obj->processEvt(QCAMERA_SM_EVT_EVT_NOTIFY, payload);
23126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
23146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: NULL user_data", __func__);
23156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
23166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
23176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
23186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
23196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : jpegEvtHandle
23206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Function registerd to mm-jpeg-interface to handle jpeg events
23226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
23246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @status    : status of jpeg job
23256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @client_hdl: jpeg client handle
23266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @jobId     : jpeg job Id
23276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @p_ouput   : ptr to jpeg output result struct
23286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userdata  : user data ptr
23296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
23316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
23326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::jpegEvtHandle(jpeg_job_status_t status,
23336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              uint32_t /*client_hdl*/,
23346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              uint32_t jobId,
23356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              mm_jpeg_output_t *p_output,
23366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              void *userdata)
23376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
23386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCamera2HardwareInterface *obj = (QCamera2HardwareInterface *)userdata;
23396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (obj) {
23406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        qcamera_jpeg_evt_payload_t *payload =
23416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            (qcamera_jpeg_evt_payload_t *)malloc(sizeof(qcamera_jpeg_evt_payload_t));
23426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != payload) {
23436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            memset(payload, 0, sizeof(qcamera_jpeg_evt_payload_t));
23446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            payload->status = status;
23456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            payload->jobId = jobId;
23466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (p_output != NULL) {
23476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                payload->out_data = *p_output;
23486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
23496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            obj->processEvt(QCAMERA_SM_EVT_JPEG_EVT_NOTIFY, payload);
23506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
23516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
23526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: NULL user_data", __func__);
23536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
23546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
23556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
23566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
23576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : thermalEvtHandle
23586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: routine to handle thermal event notification
23606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
23626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @level      : thermal level
23636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userdata   : userdata passed in during registration
23646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data       : opaque data from thermal client
23656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
23676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
23686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
23696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
23706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::thermalEvtHandle(
23716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        qcamera_thermal_level_enum_t level, void *userdata, void *data)
23726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
23736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // Make sure thermal events are logged
23746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ALOGI("%s: level = %d, userdata = %p, data = %p",
23756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        __func__, level, userdata, data);
23766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    //We don't need to lockAPI, waitAPI here. QCAMERA_SM_EVT_THERMAL_NOTIFY
23776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // becomes an aync call. This also means we can only pass payload
23786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // by value, not by address.
23796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return processAPI(QCAMERA_SM_EVT_THERMAL_NOTIFY, (void *)level);
23806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
23816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
23826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
23836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : sendEvtNotify
23846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send event notify to notify thread
23866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
23886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @msg_type: msg type to be sent
23896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ext1    : optional extension1
23906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ext2    : optional extension2
23916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
23926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
23936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
23946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
23956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
23966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::sendEvtNotify(int32_t msg_type,
23976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                 int32_t ext1,
23986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                 int32_t ext2)
23996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
24006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_callback_argm_t cbArg;
24016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&cbArg, 0, sizeof(qcamera_callback_argm_t));
24026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK;
24036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.msg_type = msg_type;
24046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.ext1 = ext1;
24056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.ext2 = ext2;
24066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return m_cbNotifier.notifyCallback(cbArg);
24076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
24086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
24106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processAutoFocusEvent
24116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process auto focus event
24136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
24156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @focus_data: struct containing auto focus result info
24166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
24186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
24196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
24206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
24216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processAutoFocusEvent(cam_auto_focus_data_t &focus_data)
24226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
24236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = NO_ERROR;
24246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_currentFocusState = focus_data.focus_state;
24266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_focus_mode_type focusMode = mParameters.getFocusMode();
24286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (focusMode) {
24296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_AUTO:
24306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_MACRO:
24316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mParameters.isAFRunning()) {
24326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (focus_data.focus_state == CAM_AF_SCANNING) {
24336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                // in the middle of focusing, just ignore it
24346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                break;
24356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
24366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // update focus distance
24386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mParameters.updateFocusDistances(&focus_data.focus_dist);
24396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ret = sendEvtNotify(CAMERA_MSG_FOCUS,
24406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                (focus_data.focus_state == CAM_AF_FOCUSED)? true : false,
24416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                0);
24426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mParameters.setAFRunning(false);
24436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else {
24446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ret = UNKNOWN_ERROR;
24456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: autoFocusEvent when no auto_focus running", __func__);
24466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_CONTINOUS_VIDEO:
24496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_CONTINOUS_PICTURE:
24506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (focus_data.focus_state == CAM_AF_FOCUSED ||
24516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            focus_data.focus_state == CAM_AF_NOT_FOCUSED) {
24526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // update focus distance
24536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            mParameters.updateFocusDistances(&focus_data.focus_dist);
24546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (mParameters.isLockCAFNeeded()) {
24556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                mParameters.setLockCAFNeeded(false);
24566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                ret = mParameters.setLockCAF(true);
24576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
24586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ret = sendEvtNotify(CAMERA_MSG_FOCUS,
24606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                  (focus_data.focus_state == CAM_AF_FOCUSED)? true : false,
24616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                  0);
24626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = sendEvtNotify(CAMERA_MSG_FOCUS_MOVE,
24646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                (focus_data.focus_state == CAM_AF_SCANNING)? true : false,
24656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                0);
24666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_INFINITY:
24686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_FIXED:
24696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case CAM_FOCUS_MODE_EDOF:
24706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
24716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGD("%s: no ops for autofocus event in focusmode %d", __func__, focusMode);
24726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
24736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
24746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
24766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
24776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
24796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processZoomEvent
24806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process zoom event
24826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
24846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @crop_info : crop info as a result of zoom operation
24856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
24866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
24876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
24886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
24896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
24906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processZoomEvent(cam_crop_data_t &crop_info)
24916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
24926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = NO_ERROR;
24936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
24946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for (int i = 0; i < QCAMERA_CH_TYPE_MAX; i++) {
24956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (m_channels[i] != NULL) {
24966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ret = m_channels[i]->processZoomDone(mPreviewWindow, crop_info);
24976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
24986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
24996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
25006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
25036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processPrepSnapshotDone
25046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process prep snapshot done event
25066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
25086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @prep_snapshot_state  : state of prepare snapshot done. In other words,
25096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *                           i.e. whether need future frames for capture.
25106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
25126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
25136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
25146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processPrepSnapshotDoneEvent(
25166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        cam_prep_snapshot_state_t prep_snapshot_state)
25176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t ret = NO_ERROR;
25196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_ZSL] &&
25216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        prep_snapshot_state == NEED_FUTURE_FRAME) {
25226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = mCameraHandle->ops->start_zsl_snapshot(
25246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            mCameraHandle->camera_handle);
25256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (ret < 0) {
25266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: start_led_zsl_capture failed %d",
25276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            __func__, ret);
25286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return ret;
25296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
25306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_bStartZSLSnapshotCalled = true;
25316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
25326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
25336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
25366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processJpegNotify
25376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process jpeg event
25396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
25416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @jpeg_evt: ptr to jpeg event payload
25426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
25446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
25456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
25466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processJpegNotify(qcamera_jpeg_evt_payload_t *jpeg_evt)
25486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return m_postprocessor.processJpegEvt(jpeg_evt);
25506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
25536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : lockAPI
25546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: lock to process API
25566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
25586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
25606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::lockAPI()
25626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&m_lock);
25646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
25676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : waitAPIResult
25686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: wait for API result coming back. This is a blocking call, it will
25706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              return only cerntain API event type arrives
25716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
25736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @api_evt : API event type
25746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
25766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::waitAPIResult(qcamera_sm_evt_enum_t api_evt)
25786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ALOGV("%s: wait for API result of evt (%d)", __func__, api_evt);
25806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&m_apiResult, 0, sizeof(qcamera_api_result_t));
25816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    while (m_apiResult.request_api != api_evt) {
25826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        pthread_cond_wait(&m_cond, &m_lock);
25836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
25846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ALOGV("%s: return (%d) from API result wait for evt (%d)",
25856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev          __func__, m_apiResult.status, api_evt);
25866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
25876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
25886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
25896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : unlockAPI
25906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: API processing is done, unlock
25926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
25946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
25956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
25966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
25976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::unlockAPI()
25986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
25996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&m_lock);
26006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
26016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
26026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
26036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : signalAPIResult
26046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: signal condition viarable that cerntain API event type arrives
26066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
26086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @result  : API result
26096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
26116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
26126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::signalAPIResult(qcamera_api_result_t *result)
26136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
26146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&m_lock);
26156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_apiResult = *result;
26166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_cond_signal(&m_cond);
26176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&m_lock);
26186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
26196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
26206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
26216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addStreamToChannel
26226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a stream into a channel
26246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
26266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @pChannel   : ptr to channel obj
26276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @streamType : type of stream to be added
26286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @streamCB   : callback of stream
26296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @userData   : user data ptr to callback
26306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
26326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
26336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
26346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
26356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addStreamToChannel(QCameraChannel *pChannel,
26366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                      cam_stream_type_t streamType,
26376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                      stream_cb_routine streamCB,
26386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                      void *userData)
26396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
26406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
26416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraHeapMemory *pStreamInfo = allocateStreamInfoBuf(streamType);
26426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pStreamInfo == NULL) {
26436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for stream info buf", __func__);
26446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
26456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
26466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t minStreamBufNum = getBufNumRequired(streamType);
26476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->addStream(*this,
26486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             pStreamInfo,
26496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             minStreamBufNum,
26506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             &gCamCapability[mCameraId]->padding_info,
26516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             streamCB, userData);
26526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
26536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add stream type (%d) failed, ret = %d",
26546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev              __func__, streamType, rc);
26556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        pStreamInfo->deallocate();
26566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pStreamInfo;
26576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
26586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
26596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
26606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
26616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
26626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
26636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
26646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addPreviewChannel
26656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a preview channel that contains a preview stream
26676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
26696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
26706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
26716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
26726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
26736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
26746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addPreviewChannel()
26756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
26766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
26776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel *pChannel = NULL;
26786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
26796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_PREVIEW] != NULL) {
26806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // if we had preview channel before, delete it first
26816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[QCAMERA_CH_TYPE_PREVIEW];
26826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[QCAMERA_CH_TYPE_PREVIEW] = NULL;
26836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
26846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
26856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraChannel(mCameraHandle->camera_handle,
26866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  mCameraHandle->ops);
26876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
26886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for preview channel", __func__);
26896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
26906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
26916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
26926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // preview only channel, don't need bundle attr and cb
26936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(NULL, NULL, NULL);
26946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
26956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init preview channel failed, ret = %d", __func__, rc);
26966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
26976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
26986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
26996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // meta data stream always coexists with preview if applicable
27016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA,
27026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            metadata_stream_cb_routine, this);
27036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
27046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc);
27056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
27066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
27076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (isNoDisplayMode()) {
27106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW,
27116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                nodisplay_preview_stream_cb_routine, this);
27126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
27136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW,
27146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                preview_stream_cb_routine, this);
27156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
27176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add preview stream failed, ret = %d", __func__, rc);
27186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
27196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
27206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_channels[QCAMERA_CH_TYPE_PREVIEW] = pChannel;
27236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
27246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
27256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
27276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addVideoChannel
27286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
27296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a video channel that contains a video stream
27306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
27316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
27326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
27336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
27346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
27356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
27366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
27376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addVideoChannel()
27386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
27396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
27406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraVideoChannel *pChannel = NULL;
27416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_VIDEO] != NULL) {
27436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // if we had video channel before, delete it first
27446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[QCAMERA_CH_TYPE_VIDEO];
27456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[QCAMERA_CH_TYPE_VIDEO] = NULL;
27466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraVideoChannel(mCameraHandle->camera_handle,
27496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                       mCameraHandle->ops);
27506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
27516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for video channel", __func__);
27526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
27536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // preview only channel, don't need bundle attr and cb
27566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(NULL, NULL, NULL);
27576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != 0) {
27586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init video channel failed, ret = %d", __func__, rc);
27596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
27606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
27616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_VIDEO,
27646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            video_stream_cb_routine, this);
27656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
27666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add video stream failed, ret = %d", __func__, rc);
27676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
27686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
27696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_channels[QCAMERA_CH_TYPE_VIDEO] = pChannel;
27726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
27736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
27746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
27766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addSnapshotChannel
27776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
27786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a snapshot channel that contains a snapshot stream
27796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
27806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
27816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
27826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
27836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
27846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
27856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : Add this channel for live snapshot usecase. Regular capture will
27866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              use addCaptureChannel.
27876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
27886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addSnapshotChannel()
27896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
27906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
27916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel *pChannel = NULL;
27926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_SNAPSHOT] != NULL) {
27946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // if we had ZSL channel before, delete it first
27956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[QCAMERA_CH_TYPE_SNAPSHOT];
27966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[QCAMERA_CH_TYPE_SNAPSHOT] = NULL;
27976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
27986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
27996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraChannel(mCameraHandle->camera_handle,
28006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  mCameraHandle->ops);
28016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
28026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for snapshot channel", __func__);
28036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
28046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(NULL, NULL, NULL);
28076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
28086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init snapshot channel failed, ret = %d", __func__, rc);
28096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
28106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
28116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT,
28146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            snapshot_stream_cb_routine, this);
28156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
28166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc);
28176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
28186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
28196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_channels[QCAMERA_CH_TYPE_SNAPSHOT] = pChannel;
28226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
28236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
28246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
28266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addRawChannel
28276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
28286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a raw channel that contains a raw image stream
28296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
28306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
28316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
28326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
28336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
28346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
28356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
28366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addRawChannel()
28376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
28386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
28396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel *pChannel = NULL;
28406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_RAW] != NULL) {
28426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // if we had raw channel before, delete it first
28436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[QCAMERA_CH_TYPE_RAW];
28446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[QCAMERA_CH_TYPE_RAW] = NULL;
28456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraChannel(mCameraHandle->camera_handle,
28486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  mCameraHandle->ops);
28496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
28506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for raw channel", __func__);
28516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
28526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(NULL, NULL, NULL);
28556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
28566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init raw channel failed, ret = %d", __func__, rc);
28576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
28586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
28596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // meta data stream always coexists with snapshot in regular RAW capture case
28626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA,
28636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            metadata_stream_cb_routine, this);
28646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
28656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc);
28666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
28676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
28686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_RAW,
28716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            raw_stream_cb_routine, this);
28726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
28736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc);
28746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
28756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
28766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
28776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_channels[QCAMERA_CH_TYPE_RAW] = pChannel;
28796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
28806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
28816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
28836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addZSLChannel
28846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
28856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a ZSL channel that contains a preview stream and
28866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              a snapshot stream
28876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
28886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
28896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
28906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
28916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
28926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
28936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
28946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addZSLChannel()
28956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
28966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
28976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraPicChannel *pChannel = NULL;
28986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
28996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_ZSL] != NULL) {
29006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // if we had ZSL channel before, delete it first
29016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[QCAMERA_CH_TYPE_ZSL];
29026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[QCAMERA_CH_TYPE_ZSL] = NULL;
29036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraPicChannel(mCameraHandle->camera_handle,
29066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                     mCameraHandle->ops);
29076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
29086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for ZSL channel", __func__);
29096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
29106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // ZSL channel, init with bundle attr and cb
29136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_channel_attr_t attr;
29146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
29156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_BURST;
29166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.look_back = mParameters.getZSLBackLookCount();
29176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.post_frame_skip = mParameters.getZSLBurstInterval();
29186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.water_mark = mParameters.getZSLQueueDepth();
29196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue();
29206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(&attr,
29216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        zsl_channel_cb,
29226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        this);
29236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != 0) {
29246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init ZSL channel failed, ret = %d", __func__, rc);
29256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
29266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
29276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // meta data stream always coexists with preview if applicable
29306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA,
29316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            metadata_stream_cb_routine, this);
29326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
29336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc);
29346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
29356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
29366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (isNoDisplayMode()) {
29396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW,
29406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                nodisplay_preview_stream_cb_routine, this);
29416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
29426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_PREVIEW,
29436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                preview_stream_cb_routine, this);
29446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
29466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add preview stream failed, ret = %d", __func__, rc);
29476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
29486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
29496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT,
29526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            NULL, this);
29536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
29546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc);
29556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
29566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
29576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_channels[QCAMERA_CH_TYPE_ZSL] = pChannel;
29606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
29616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
29626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
29646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addCaptureChannel
29656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
29666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a capture channel that contains a snapshot stream
29676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              and a postview stream
29686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
29696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
29706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
29716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
29726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
29736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
29746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : Add this channel for regular capture usecase.
29756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              For Live snapshot usecase, use addSnapshotChannel.
29766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
29776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addCaptureChannel()
29786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
29796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
29806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel *pChannel = NULL;
29816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_CAPTURE] != NULL) {
29836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[QCAMERA_CH_TYPE_CAPTURE];
29846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[QCAMERA_CH_TYPE_CAPTURE] = NULL;
29856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraChannel(mCameraHandle->camera_handle,
29886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  mCameraHandle->ops);
29896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
29906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for capture channel", __func__);
29916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
29926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
29936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
29946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // Capture channel, only need snapshot and postview streams start together
29956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_channel_attr_t attr;
29966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
29976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
29986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue();
29996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(&attr,
30016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        capture_channel_cb_routine,
30026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        this);
30036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
30046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init capture channel failed, ret = %d", __func__, rc);
30056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
30066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
30076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // meta data stream always coexists with snapshot in regular capture case
30116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA,
30126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            metadata_stream_cb_routine, this);
30136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
30146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc);
30156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
30166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
30176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // TODO: commented out for now
30206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#if 0
30216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_POSTVIEW,
30226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            postview_stream_cb_routine, this);
30236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
30256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add postview stream failed, ret = %d", __func__, rc);
30266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
30276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
30286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif
30306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_SNAPSHOT,
30326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            NULL, this);
30336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
30346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add snapshot stream failed, ret = %d", __func__, rc);
30356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
30366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
30376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_channels[QCAMERA_CH_TYPE_CAPTURE] = pChannel;
30406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
30416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
30426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
30446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addMetaDataChannel
30456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
30466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a meta data channel that contains a metadata stream
30476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
30486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
30496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
30506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
30516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
30526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
30536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
30546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addMetaDataChannel()
30556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
30566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
30576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraChannel *pChannel = NULL;
30586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[QCAMERA_CH_TYPE_METADATA] != NULL) {
30606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[QCAMERA_CH_TYPE_METADATA];
30616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[QCAMERA_CH_TYPE_METADATA] = NULL;
30626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraChannel(mCameraHandle->camera_handle,
30656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                  mCameraHandle->ops);
30666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
30676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for metadata channel", __func__);
30686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
30696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(NULL,
30726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        NULL,
30736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        NULL);
30746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
30756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init metadata channel failed, ret = %d", __func__, rc);
30766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
30776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
30786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = addStreamToChannel(pChannel, CAM_STREAM_TYPE_METADATA,
30816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                            metadata_stream_cb_routine, this);
30826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
30836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add metadata stream failed, ret = %d", __func__, rc);
30846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
30856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return rc;
30866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
30876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_channels[QCAMERA_CH_TYPE_METADATA] = pChannel;
30896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
30906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
30916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
30926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
30936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addOnlineReprocChannel
30946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
30956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a online reprocess channel that will do reprocess on frames
30966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              coming from input channel
30976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
30986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
30996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @pInputChannel : ptr to input channel whose frames will be post-processed
31006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
31016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : Ptr to the newly created channel obj. NULL if failed.
31026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
31036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel *QCamera2HardwareInterface::addOnlineReprocChannel(
31046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                      QCameraChannel *pInputChannel)
31056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
31066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
31076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraReprocessChannel *pChannel = NULL;
31086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pInputChannel == NULL) {
31106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: input channel obj is NULL", __func__);
31116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
31126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
31136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraReprocessChannel(mCameraHandle->camera_handle,
31156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                           mCameraHandle->ops);
31166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
31176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for reprocess channel", __func__);
31186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
31196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
31206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // Capture channel, only need snapshot and postview streams start together
31226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_camera_channel_attr_t attr;
31236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&attr, 0, sizeof(mm_camera_channel_attr_t));
31246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.notify_mode = MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS;
31256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    attr.max_unmatched_frames = mParameters.getMaxUnmatchedFramesInQueue();
31266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(&attr,
31276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        postproc_channel_cb_routine,
31286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                        this);
31296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
31306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
31316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
31326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
31336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
31346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // pp feature config
31366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_pp_feature_config_t pp_config;
31376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&pp_config, 0, sizeof(cam_pp_feature_config_t));
31386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mParameters.isZSLMode()) {
31396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (gCamCapability[mCameraId]->min_required_pp_mask & CAM_QCOM_FEATURE_SHARPNESS) {
31406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.feature_mask |= CAM_QCOM_FEATURE_SHARPNESS;
31416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.sharpness = mParameters.getInt(QCameraParameters::KEY_QC_SHARPNESS);
31426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
31436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (mParameters.isWNREnabled()) {
31456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.feature_mask |= CAM_QCOM_FEATURE_DENOISE2D;
31466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.denoise2d.denoise_enable = 1;
31476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.denoise2d.process_plates = mParameters.getWaveletDenoiseProcessPlate();
31486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
31496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
31506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (needRotationReprocess()) {
31516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        pp_config.feature_mask |= CAM_QCOM_FEATURE_ROTATION;
31526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        int rotation = mParameters.getJpegRotation();
31536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rotation == 0) {
31546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.rotation = ROTATE_0;
31556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else if (rotation == 90) {
31566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.rotation = ROTATE_90;
31576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else if (rotation == 180) {
31586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.rotation = ROTATE_180;
31596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        } else if (rotation == 270) {
31606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            pp_config.rotation = ROTATE_270;
31616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
31626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
31636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint8_t minStreamBufNum = mParameters.getNumOfSnapshots();
31656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->addReprocStreamsFromSource(*this,
31666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              pp_config,
31676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              pInputChannel,
31686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              minStreamBufNum,
31696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                              &gCamCapability[mCameraId]->padding_info);
31706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
31716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
31726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
31736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
31746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return pChannel;
31766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
31776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
31786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
31796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addOfflineReprocChannel
31806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
31816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a offline reprocess channel contains one reproc stream,
31826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              that will do reprocess on frames coming from external images
31836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
31846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
31856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @img_config  : offline reporcess image info
31866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @pp_feature  : pp feature config
31876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
31886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
31896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
31906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
31916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
31926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraReprocessChannel *QCamera2HardwareInterface::addOfflineReprocChannel(
31936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            cam_pp_offline_src_config_t &img_config,
31946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            cam_pp_feature_config_t &pp_feature,
31956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            stream_cb_routine stream_cb,
31966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                            void *userdata)
31976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
31986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
31996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraReprocessChannel *pChannel = NULL;
32006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pChannel = new QCameraReprocessChannel(mCameraHandle->camera_handle,
32026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                           mCameraHandle->ops);
32036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == pChannel) {
32046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for reprocess channel", __func__);
32056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
32066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
32076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->init(NULL, NULL, NULL);
32096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
32106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: init reprocess channel failed, ret = %d", __func__, rc);
32116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
32126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
32136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
32146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraHeapMemory *pStreamInfo = allocateStreamInfoBuf(CAM_STREAM_TYPE_OFFLINE_PROC);
32166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pStreamInfo == NULL) {
32176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: no mem for stream info buf", __func__);
32186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
32196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
32206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
32216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_stream_info_t *streamInfoBuf = (cam_stream_info_t *)pStreamInfo->getPtr(0);
32236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(streamInfoBuf, 0, sizeof(cam_stream_info_t));
32246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->stream_type = CAM_STREAM_TYPE_OFFLINE_PROC;
32256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->fmt = img_config.input_fmt;
32266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->dim = img_config.input_dim;
32276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->buf_planes = img_config.input_buf_planes;
32286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->streaming_mode = CAM_STREAMING_MODE_BURST;
32296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->num_of_burst = img_config.num_of_bufs;
32306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->reprocess_config.pp_type = CAM_OFFLINE_REPROCESS_TYPE;
32326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->reprocess_config.offline = img_config;
32336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    streamInfoBuf->reprocess_config.pp_feature_config = pp_feature;
32346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = pChannel->addStream(*this,
32366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             pStreamInfo, img_config.num_of_bufs,
32376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             &gCamCapability[mCameraId]->padding_info,
32386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                             stream_cb, userdata);
32396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc != NO_ERROR) {
32416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: add reprocess stream failed, ret = %d", __func__, rc);
32426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        pStreamInfo->deallocate();
32436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pStreamInfo;
32446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete pChannel;
32456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
32466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
32476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return pChannel;
32496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
32506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
32526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : addChannel
32536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
32546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add a channel by its type
32556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
32566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
32576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ch_type : channel type
32586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
32596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
32606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
32616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
32626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
32636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::addChannel(qcamera_ch_type_enum_t ch_type)
32646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
32656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = UNKNOWN_ERROR;
32666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch (ch_type) {
32676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_CH_TYPE_ZSL:
32686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addZSLChannel();
32696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_CH_TYPE_CAPTURE:
32716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addCaptureChannel();
32726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_CH_TYPE_PREVIEW:
32746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addPreviewChannel();
32756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_CH_TYPE_VIDEO:
32776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addVideoChannel();
32786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_CH_TYPE_SNAPSHOT:
32806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addSnapshotChannel();
32816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_CH_TYPE_RAW:
32836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addRawChannel();
32846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_CH_TYPE_METADATA:
32866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addMetaDataChannel();
32876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
32896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
32906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
32916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
32926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
32936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
32946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
32956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : delChannel
32966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
32976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: delete a channel by its type
32986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
32996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
33006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ch_type : channel type
33016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
33036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
33046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
33056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
33066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::delChannel(qcamera_ch_type_enum_t ch_type)
33076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
33086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[ch_type] != NULL) {
33096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delete m_channels[ch_type];
33106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        m_channels[ch_type] = NULL;
33116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
33126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
33146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
33156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
33176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : startChannel
33186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: start a channel by its type
33206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
33226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ch_type : channel type
33236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
33256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
33266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
33276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
33286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::startChannel(qcamera_ch_type_enum_t ch_type)
33296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
33306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = UNKNOWN_ERROR;
33316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[ch_type] != NULL) {
333272594c0844ef2066190ecaddf73c9207a983ad90Muhua Li        rc = m_channels[ch_type]->start();
33336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
33346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
33366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
33376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
33396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : stopChannel
33406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stop a channel by its type
33426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
33446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @ch_type : channel type
33456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
33476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
33486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
33496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
33506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::stopChannel(qcamera_ch_type_enum_t ch_type)
33516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
33526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = UNKNOWN_ERROR;
33536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (m_channels[ch_type] != NULL) {
33546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = m_channels[ch_type]->stop();
33556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
33566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
33586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
33596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
33616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : preparePreview
33626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: add channels needed for preview
33646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
33666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
33676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
33686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
33696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
33706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
33716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::preparePreview()
33726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
33736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
33746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33754faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab    if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) {
33766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addChannel(QCAMERA_CH_TYPE_ZSL);
33776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rc != NO_ERROR) {
33786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return rc;
33796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
33806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
33816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = addChannel(QCAMERA_CH_TYPE_PREVIEW);
33826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (rc != NO_ERROR) {
33836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return rc;
33846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
33856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
33866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(mParameters.getRecordingHintValue() == true) {
33876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = addChannel(QCAMERA_CH_TYPE_VIDEO);
33886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc != NO_ERROR) {
33896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                delChannel(QCAMERA_CH_TYPE_PREVIEW);
33906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                return rc;
33916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
33926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            rc = addChannel(QCAMERA_CH_TYPE_SNAPSHOT);
33936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if (rc != NO_ERROR) {
33946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                delChannel(QCAMERA_CH_TYPE_METADATA);
33956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                delChannel(QCAMERA_CH_TYPE_PREVIEW);
33966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                delChannel(QCAMERA_CH_TYPE_VIDEO);
33976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
33986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
33996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
34006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
34026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
34036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
34056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : unpreparePreview
34066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: delete channels for preview
34086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
34106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
34126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
34136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::unpreparePreview()
34146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
34154faf945bcfc04ead5b44da6468f8087618aa8741Mansoor Aftab    if (mParameters.isZSLMode() && mParameters.getRecordingHintValue() !=true) {
34166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delChannel(QCAMERA_CH_TYPE_ZSL);
34176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
34186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        delChannel(QCAMERA_CH_TYPE_PREVIEW);
34196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if(mParameters.getRecordingHintValue() == true) {
34206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delChannel(QCAMERA_CH_TYPE_VIDEO);
34216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            delChannel(QCAMERA_CH_TYPE_SNAPSHOT);
34226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
34236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
34246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
34256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
34276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : playShutter
34286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: send request to play shutter sound
34306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
34326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
34346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
34356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::playShutter(){
34366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     if (mNotifyCb == NULL ||
34376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         msgTypeEnabledWithLock(CAMERA_MSG_SHUTTER) == 0){
34386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         ALOGV("%s: shutter msg not enabled or NULL cb", __func__);
34396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         return;
34406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     }
34416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     qcamera_callback_argm_t cbArg;
34436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     memset(&cbArg, 0, sizeof(qcamera_callback_argm_t));
34446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     cbArg.cb_type = QCAMERA_NOTIFY_CALLBACK;
34456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     cbArg.msg_type = CAMERA_MSG_SHUTTER;
34466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     cbArg.ext1 = 0;
34476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     if(!m_bShutterSoundPlayed){
34496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         cbArg.ext2 = true;
34506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         m_cbNotifier.notifyCallback(cbArg);
34516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     }
34526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     cbArg.ext2 = false;
34536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     m_cbNotifier.notifyCallback(cbArg);
34546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev     m_bShutterSoundPlayed = false;
34556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
34566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
34586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getChannelByHandle
34596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return a channel by its handle
34616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
34636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @channelHandle : channel handle
34646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : a channel obj if found, NULL if not found
34666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
34676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraChannel *QCamera2HardwareInterface::getChannelByHandle(uint32_t channelHandle)
34686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
34696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    for(int i = 0; i < QCAMERA_CH_TYPE_MAX; i++) {
34706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (m_channels[i] != NULL &&
34716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            m_channels[i]->getMyHandle() == channelHandle) {
34726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return m_channels[i];
34736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
34746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
34756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NULL;
34776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
34786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
34806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processFaceDetectionReuslt
34816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process face detection reuslt
34836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
34856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @fd_data : ptr to face detection result struct
34866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
34876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
34886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
34896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
34906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
34916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processFaceDetectionResult(cam_face_detection_data_t *fd_data)
34926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
34936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mParameters.isFaceDetectionEnabled()) {
34946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGD("%s: FaceDetection not enabled, no ops here", __func__);
34956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_ERROR;
34966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
34976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
34986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ((NULL == mDataCb) || (msgTypeEnabledWithLock(CAMERA_MSG_PREVIEW_METADATA) == 0)) {
34996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGD("%s: prevew metadata msgtype not enabled, no ops here", __func__);
35006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_ERROR;
35016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
35026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_dimension_t display_dim;
35046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParameters.getStreamDimension(CAM_STREAM_TYPE_PREVIEW, display_dim);
35056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (display_dim.width <= 0 || display_dim.height <= 0) {
35066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Invalid preview width or height (%d x %d)",
35076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev              __func__, display_dim.width, display_dim.height);
35086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
35096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
35106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // process face detection result
35126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    size_t faceResultSize = sizeof(camera_frame_metadata_t);
35136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    faceResultSize += sizeof(camera_face_t) * MAX_ROI;
35146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    camera_memory_t *faceResultBuffer = mGetMemory(-1,
35156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                   faceResultSize,
35166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                   1,
35176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                   mCallbackCookie);
35186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL == faceResultBuffer ) {
35196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Not enough memory for face result data",
35206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev              __func__);
35216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
35226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
35236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
3524b971e1489cccffac4035c15eefdeff9ac892cce2Emilian Peev    unsigned char *faceData = ( unsigned char * ) faceResultBuffer->data;
35256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(faceData, 0, faceResultSize);
35266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    camera_frame_metadata_t *roiData = (camera_frame_metadata_t * ) faceData;
3527b971e1489cccffac4035c15eefdeff9ac892cce2Emilian Peev    camera_face_t *faces = (camera_face_t *) ( faceData + sizeof(camera_frame_metadata_t) );
35286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    roiData->number_of_faces = fd_data->num_faces_detected;
35306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    roiData->faces = faces;
35316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (roiData->number_of_faces > 0) {
35326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        for (int i = 0; i < roiData->number_of_faces; i++) {
35336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].id = fd_data->faces[i].face_id;
35346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].score = fd_data->faces[i].score;
35356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // left
35376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].rect[0] =
35386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.left, display_dim.width, 2000, -1000);
35396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // top
35416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].rect[1] =
35426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.top, display_dim.height, 2000, -1000);
35436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // right
35456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].rect[2] = faces[i].rect[0] +
35466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.width, display_dim.width, 2000, 0);
35476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev             // bottom
35496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].rect[3] = faces[i].rect[1] +
35506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].face_boundary.height, display_dim.height, 2000, 0);
35516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Center of left eye
35536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].left_eye[0] =
35546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].left_eye_center.x, display_dim.width, 2000, -1000);
35556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].left_eye[1] =
35576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].left_eye_center.y, display_dim.height, 2000, -1000);
35586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Center of right eye
35606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].right_eye[0] =
35616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].right_eye_center.x, display_dim.width, 2000, -1000);
35626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].right_eye[1] =
35646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].right_eye_center.y, display_dim.height, 2000, -1000);
35656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Center of mouth
35676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].mouth[0] =
35686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].mouth_center.x, display_dim.width, 2000, -1000);
35696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].mouth[1] =
35716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                MAP_TO_DRIVER_COORDINATE(fd_data->faces[i].mouth_center.y, display_dim.height, 2000, -1000);
35726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#if 0
35746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].smile_degree = fd_data->faces[i].smile_degree;
35756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].smile_score = fd_data->faces[i].smile_confidence;
35766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].blink_detected = fd_data->faces[i].blink_detected;
35776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].face_recognised = fd_data->faces[i].face_recognised;
35786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].gaze_angle = fd_data->faces[i].gaze_angle;
35796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // upscale by 2 to recover from demaen downscaling
35816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].updown_dir = fd_data->faces[i].updown_dir * 2;
35826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].leftright_dir = fd_data->faces[i].leftright_dir * 2;
35836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].roll_dir = fd_data->faces[i].roll_dir * 2;
35846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].leye_blink = fd_data->faces[i].left_blink;
35866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].reye_blink = fd_data->faces[i].right_blink;
35876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].left_right_gaze = fd_data->faces[i].left_right_gaze;
35886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            faces[i].top_bottom_gaze = fd_data->faces[i].top_bottom_gaze;
35896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#endif
35906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
35926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
35936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
35946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_callback_argm_t cbArg;
35956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(&cbArg, 0, sizeof(qcamera_callback_argm_t));
35966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.cb_type = QCAMERA_DATA_CALLBACK;
35976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.msg_type = CAMERA_MSG_PREVIEW_METADATA;
35986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.data = faceResultBuffer;
35996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.metadata = roiData;
36006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.user_data = faceResultBuffer;
36016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.cookie = this;
36026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cbArg.release_cb = releaseCameraMemory;
36036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    m_cbNotifier.notifyCallback(cbArg);
36046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
36066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
36076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
36096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : releaseCameraMemory
36106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: releases camera memory objects
36126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
36146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data    : buffer to be released
36156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cookie  : context data
36166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
36186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
36196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::releaseCameraMemory(void *data, void */*cookie*/)
36206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
36216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    camera_memory_t *mem = ( camera_memory_t * ) data;
36226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL != mem ) {
36236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mem->release(mem);
36246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
36256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
36266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
36286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : returnStreamBuffer
36296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: returns back a stream buffer
36316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
36336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @data    : buffer to be released
36346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @cookie  : context data
36356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : None
36376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
36386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::returnStreamBuffer(void *data, void *cookie)
36396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
36406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraStream *stream = ( QCameraStream * ) cookie;
36416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int idx = ( int ) data;
36426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( ( NULL != stream )) {
36436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        stream->bufDone(idx);
36446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
36456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
36466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
36486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : processHistogramStats
36496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: process histogram stats
36516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
36536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @hist_data : ptr to histogram stats struct
36546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
36566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
36576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
36586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
36596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::processHistogramStats(cam_hist_stats_t &/*stats_data*/)
36606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
36616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mParameters.isHistogramEnabled()) {
36626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGD("%s: Histogram not enabled, no ops here", __func__);
36636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_ERROR;
36646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
36656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    camera_memory_t *histBuffer = mGetMemory(-1,
36676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             sizeof(cam_histogram_data_t),
36686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             1,
36696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                             mCallbackCookie);
36706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if ( NULL == histBuffer ) {
36716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Not enough memory for histogram data",
36726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev              __func__);
36736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NO_MEMORY;
36746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
36756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_histogram_data_t *pHistData = (cam_histogram_data_t *)histBuffer->data;
36776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pHistData == NULL) {
36786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: memory data ptr is NULL", __func__);
36796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return UNKNOWN_ERROR;
36806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
36816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return NO_ERROR;
36846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
36856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
36866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
36876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : updateThermalLevel
36886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: update thermal level depending on thermal events
36906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
36926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @level   : thermal level
36936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
36946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
36956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
36966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
36976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
36986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::updateThermalLevel(
36996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            qcamera_thermal_level_enum_t level)
37006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
37016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int ret = NO_ERROR;
37026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_fps_range_t adjustedRange;
37036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int minFPS, maxFPS;
37046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    qcamera_thermal_mode thermalMode = mParameters.getThermalMode();
37056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    enum msm_vfe_frame_skip_pattern skipPattern;
37066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParameters.getPreviewFpsRange(&minFPS, &maxFPS);
37086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    switch(level) {
37106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_THERMAL_NO_ADJUSTMENT:
37116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
37126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.min_fps = minFPS/1000.0f;
37136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.max_fps = maxFPS/1000.0f;
37146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            skipPattern = NO_SKIP;
37156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
37166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
37176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_THERMAL_SLIGHT_ADJUSTMENT:
37186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
37196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.min_fps = minFPS/1000.0f;
37206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.max_fps = (maxFPS / 2 ) / 1000.0f;
37216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            if ( adjustedRange.max_fps < adjustedRange.min_fps ) {
37226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                adjustedRange.max_fps = adjustedRange.min_fps;
37236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
37246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            skipPattern = EVERY_2FRAME;
37256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
37266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
37276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_THERMAL_BIG_ADJUSTMENT:
37286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
37296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.min_fps = minFPS/1000.0f;
37306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.max_fps = adjustedRange.min_fps;
37316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            skipPattern = EVERY_4FRAME;
37326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
37336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
37346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    case QCAMERA_THERMAL_SHUTDOWN:
37356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
37366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Stop Preview?
37376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            // Set lowest min FPS for now
37386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.min_fps = minFPS/1000.0f;
37396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            adjustedRange.max_fps = minFPS/1000.0f;
37406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            for ( int i = 0 ; i < gCamCapability[mCameraId]->fps_ranges_tbl_cnt ; i++ ) {
37416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                if ( gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps < adjustedRange.min_fps ) {
37426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    adjustedRange.min_fps = gCamCapability[mCameraId]->fps_ranges_tbl[i].min_fps;
37436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                    adjustedRange.max_fps = adjustedRange.min_fps;
37446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                }
37456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            }
37466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            skipPattern = MAX_SKIP;
37476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
37486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
37496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    default:
37506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        {
37516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            ALOGE("%s: Invalid thermal level %d", __func__, level);
37526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            return BAD_VALUE;
37536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
37546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        break;
37556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
37566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    ALOGI("%s: Thermal level %d, FPS range [%3.2f,%3.2f], frameskip %d",
37586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev          __func__,
37596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev          level,
37606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev          adjustedRange.min_fps,
37616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev          adjustedRange.max_fps,
37626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev          skipPattern);
37636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (thermalMode == QCAMERA_THERMAL_ADJUST_FPS)
37656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = mParameters.adjustPreviewFpsRange(&adjustedRange);
37666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    else if (thermalMode == QCAMERA_THERMAL_ADJUST_FRAMESKIP)
37676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ret = mParameters.setFrameSkip(skipPattern);
37686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    else
37696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: Incorrect thermal mode %d", __func__, thermalMode);
37706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return ret;
37726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
37746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
37766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : updateParameters
37776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
37786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: update parameters
37796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
37806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
37816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @parms       : input parameters string
37826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @needRestart : output, flag to indicate if preview restart is needed
37836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
37846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
37856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
37866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
37876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
37886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::updateParameters(const char *parms, bool &needRestart)
37896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
37906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    String8 str = String8(parms);
37916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraParameters param(str);
37926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mParameters.updateParameters(param, needRestart);
37936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
37946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
37956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
37966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : commitParameterChanges
37976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
37986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: commit parameter changes to the backend to take effect
37996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
38016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
38036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
38046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
38056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NOTE       : This function must be called after updateParameters.
38066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              Otherwise, no change will be passed to backend to take effect.
38076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
38086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::commitParameterChanges()
38096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
38106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int rc = mParameters.commitParameters();
38116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
38126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // update number of snapshot based on committed parameters setting
38136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        rc = mParameters.setNumOfSnapshot();
38146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
38156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return rc;
38166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
38176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
38196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : needDebugFps
38206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if fps log info need to be printed out
38226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
38246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : true: need print out fps log
38266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              false: no need to print out fps log
38276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
38286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needDebugFps()
38296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
38306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mParameters.isFpsDebugEnabled();
38316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
38326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
38346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : needReprocess
38356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if reprocess is needed
38376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
38396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : true: needed
38416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              false: no need
38426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
38436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needReprocess()
38446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3845b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    // TODO: hack here to return false to avoid reprocess
3846b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    // Need to be enabled after PP is enabled
3847b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    return false;
3848b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li
38496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mParameters.isJpegPictureFormat()) {
38506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // RAW image, no need to reprocess
38516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return false;
38526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
38536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mParameters.isZSLMode() &&
38556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ((gCamCapability[mCameraId]->min_required_pp_mask > 0) ||
38566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         mParameters.isWNREnabled())) {
38576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // TODO: add for ZSL HDR later
38586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // pp module has min requirement for zsl reprocess, or WNR in ZSL mode
38596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGD("%s: need do reprocess for ZSL WNR or min PP reprocess", __func__);
38606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return true;
38616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
38626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return needRotationReprocess();
38646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
38656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
38676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : needRotationReprocess
38686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if rotation needs to be done by reprocess in pp
38706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
38726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
38736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : true: needed
38746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              false: no need
38756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
38766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needRotationReprocess()
38776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3878b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    // TODO: hack here to return false to avoid reprocess
3879b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    // Need to be enabled after PP is enabled
3880b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    return false;
3881b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li
38826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mParameters.isJpegPictureFormat()) {
38836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // RAW image, no need to reprocess
38846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return false;
38856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
38866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (mParameters.isZSLMode() &&
38886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        (gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
38896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mParameters.getJpegRotation() > 0) {
38906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // current rotation is not zero, and pp has the capability to process rotation
38916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGD("%s: need do reprocess for rotation", __func__);
38926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return true;
38936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
38946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return false;
38966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
38976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
38986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
38996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : needRotationReprocess
39006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: if online rotation needs to be done by cpp
39026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
39046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : true: needed
39066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              false: no need
39076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
39086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCamera2HardwareInterface::needOnlineRotation()
39096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
3910b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    // TODO: hack here to return false to avoid reprocess
3911b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    // Need to be enabled after PP is enabled
3912b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li    return false;
3913b62b9fe1b51cc4b36a69ff46fa486ae92a908406Muhua Li
39146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mParameters.isJpegPictureFormat()) {
39156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // RAW image, no need
39166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return false;
39176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
39186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (!mParameters.isZSLMode() &&
39206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        (gCamCapability[mCameraId]->qcom_supported_feature_mask & CAM_QCOM_FEATURE_ROTATION) > 0 &&
39216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        mParameters.getJpegRotation() > 0) {
39226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        // current rotation is not zero, and pp has the capability to process rotation
39236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGD("%s: need do online rotation", __func__);
39246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return true;
39256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
39266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return false;
39286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
39296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
39316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getThumbnailSize
39326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get user set thumbnail size
39346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
39366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @dim     : output of thumbnail dimension
39376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : none
39396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
39406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCamera2HardwareInterface::getThumbnailSize(cam_dimension_t &dim)
39416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
39426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mParameters.getThumbnailSize(&dim.width, &dim.height);
39436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
39446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
39466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getJpegQuality
39476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get user set jpeg quality
39496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
39516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : jpeg quality setting
39536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
39546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::getJpegQuality()
39556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
39566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mParameters.getJpegQuality();
39576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
39586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
39606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getJpegRotation
39616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get rotation information to be passed into jpeg encoding
39636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
39656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : rotation information
39676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
39686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint QCamera2HardwareInterface::getJpegRotation() {
39696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mParameters.getJpegRotation();
39706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
39716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
39736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : getExifData
39746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: get exif data to be passed into jpeg encoding
39766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : none
39786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
39796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : exif data from user setting and GPS
39806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
39816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraExif *QCamera2HardwareInterface::getExifData()
39826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
39836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    QCameraExif *exif = new QCameraExif();
39846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (exif == NULL) {
39856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: No memory for QCameraExif", __func__);
39866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return NULL;
39876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
39886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    int32_t rc = NO_ERROR;
39906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t count = 0;
39916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
39926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    // add exif entries
39936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char dateTime[20];
39946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(dateTime, 0, sizeof(dateTime));
39956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    count = 20;
39966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getExifDateTime(dateTime, count);
39976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc == NO_ERROR) {
39986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_EXIF_DATE_TIME_ORIGINAL,
39996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_ASCII,
40006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       count,
40016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)dateTime);
40026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
40036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: getExifDateTime failed", __func__);
40046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
40056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rat_t focalLength;
40076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getExifFocalLength(&focalLength);
40086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (rc == NO_ERROR) {
40096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_FOCAL_LENGTH,
40106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_RATIONAL,
40116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       1,
40126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)&(focalLength));
40136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
40146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: getExifFocalLength failed", __func__);
40156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
40166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint16_t isoSpeed = mParameters.getExifIsoSpeed();
40186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    exif->addEntry(EXIFTAGID_ISO_SPEED_RATING,
40196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   EXIF_SHORT,
40206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   1,
40216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                   (void *)&(isoSpeed));
40226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char gpsProcessingMethod[EXIF_ASCII_PREFIX_SIZE + GPS_PROCESSING_METHOD_SIZE];
40246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    count = 0;
40256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getExifGpsProcessingMethod(gpsProcessingMethod, count);
40266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc == NO_ERROR) {
40276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_PROCESSINGMETHOD,
40286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_ASCII,
40296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       count,
40306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)gpsProcessingMethod);
40316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
40326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: getExifGpsProcessingMethod failed", __func__);
40336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
40346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rat_t latitude[3];
40366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char latRef[2];
40376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getExifLatitude(latitude, latRef);
40386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc == NO_ERROR) {
40396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_LATITUDE,
40406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_RATIONAL,
40416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       3,
40426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)latitude);
40436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_LATITUDE_REF,
40446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_ASCII,
40456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       2,
40466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)latRef);
40476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
40486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: getExifLatitude failed", __func__);
40496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
40506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rat_t longitude[3];
40526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char lonRef[2];
40536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getExifLongitude(longitude, lonRef);
40546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc == NO_ERROR) {
40556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_LONGITUDE,
40566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_RATIONAL,
40576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       3,
40586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)longitude);
40596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_LONGITUDE_REF,
40616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_ASCII,
40626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       2,
40636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)lonRef);
40646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
40656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: getExifLongitude failed", __func__);
40666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
40676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rat_t altitude;
40696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char altRef;
40706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getExifAltitude(&altitude, &altRef);
40716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc == NO_ERROR) {
40726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_ALTITUDE,
40736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_RATIONAL,
40746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       1,
40756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)&(altitude));
40766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_ALTITUDE_REF,
40786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_BYTE,
40796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       1,
40806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)&altRef);
40816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
40826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: getExifAltitude failed", __func__);
40836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
40846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    char gpsDateStamp[20];
40866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rat_t gpsTimeStamp[3];
40876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    rc = mParameters.getExifGpsDateTimeStamp(gpsDateStamp, 20, gpsTimeStamp);
40886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if(rc == NO_ERROR) {
40896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_DATESTAMP,
40906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_ASCII,
40916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       strlen(gpsDateStamp) + 1,
40926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)gpsDateStamp);
40936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
40946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        exif->addEntry(EXIFTAGID_GPS_TIMESTAMP,
40956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       EXIF_RATIONAL,
40966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       3,
40976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                       (void *)gpsTimeStamp);
40986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    } else {
40996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        ALOGE("%s: getExifGpsDataTimeStamp failed", __func__);
41006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
41016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
41026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return exif;
41036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
41046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
41056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
41066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : setHistogram
41076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set if histogram should be enabled
41096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
41116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @histogram_en : bool flag if histogram should be enabled
41126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
41146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
41156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
41166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
41176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::setHistogram(bool histogram_en)
41186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
41196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mParameters.setHistogram(histogram_en);
41206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
41216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
41226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
41236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : setFaceDetection
41246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: set if face detection should be enabled
41266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
41286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @enabled : bool flag if face detection should be enabled
41296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
41316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
41326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
41336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
41346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::setFaceDetection(bool enabled)
41356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
41366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mParameters.setFaceDetection(enabled);
41376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
41386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
41396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*===========================================================================
41406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION   : prepareHardwareForSnapshot
41416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: prepare hardware for snapshot, such as LED
41436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS :
41456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *   @afNeeded: flag indicating if Auto Focus needs to be done during preparation
41466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *
41476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN     : int32_t type of status
41486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              NO_ERROR  -- success
41496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *              none-zero failure code
41506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/
41516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t QCamera2HardwareInterface::prepareHardwareForSnapshot(int32_t afNeeded)
41526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
41536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return mCameraHandle->ops->prepare_snapshot(mCameraHandle->camera_handle,
41546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev                                                afNeeded);
41556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
41566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
41576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera
4158