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