13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2011-2014, 2016, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define ALOG_NIDEBUG 0
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QualcommCamera"
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/threads.h>
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <binder/IMemory.h>
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <binder/MemoryBase.h>
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <binder/MemoryHeapBase.h>
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/RefBase.h>
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" {
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define TIME_H <SYSTEM_HEADER_PREFIX/time.h>
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include TIME_H
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QualcommCamera.h"
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera2Factory.h"
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera2HWI.h"
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* HAL function implementation goes here*/
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/**
533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * The functions need to be provided by the camera HAL.
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo()
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * and openCameraHardware() is 0 to N-1.
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic hw_module_methods_t camera_module_methods = {
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    open: camera_device_open,
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatic hw_module_t camera_common = {
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    tag: HARDWARE_MODULE_TAG,
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    module_api_version: CAMERA_MODULE_API_VERSION_1_0,
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    hal_api_version: HARDWARE_HAL_API_VERSION,
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    id: CAMERA_HARDWARE_MODULE_ID,
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    name: "QCamera Module",
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    author: "Quic on behalf of CAF",
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    methods: &camera_module_methods,
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    dso: NULL,
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    reserved:  {0},
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace qcamera;
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace android {
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera_device hw_dev;
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware;
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int camera_released;
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int cameraId;
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} camera_hardware_t;
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudeltypedef struct {
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  camera_memory_t mem;
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  int32_t msgType;
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  sp<IMemory> dataPtr;
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  void* user;
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  unsigned int index;
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} q_cam_memory_t;
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
943d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCamera2HardwareInterface *util_get_Hal_obj( struct camera_device * device)
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = NULL;
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(device && device->priv){
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware = camHal->hardware;
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return hardware;
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" int get_number_of_cameras()
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* try to query every time we get the call!*/
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return QCamera2Factory::get_number_of_cameras();
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" int get_camera_info(int camera_id, struct camera_info *info)
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(info) {
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2Factory::get_camera_info(camera_id, info);
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("Q%s: X");
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* HAL should return NULL if it fails to open camera hardware. */
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" int  camera_device_open(
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  const struct hw_module_t* module, const char* id,
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel          struct hw_device_t** hw_device)
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera_device *device = NULL;
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(module && id && hw_device) {
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (!strcmp(module->name, camera_common.name)) {
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int cameraId = atoi(id);
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camera_hardware_t *camHal =
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                (camera_hardware_t *) malloc(sizeof (camera_hardware_t));
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if(!camHal) {
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                *hw_device = NULL;
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ALOGE("  end in no mem");
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            /* we have the camera_hardware obj malloced */
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            memset(camHal, 0, sizeof (camera_hardware_t));
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            camHal->hardware = new QCamera2HardwareInterface((uint32_t)cameraId);
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (camHal->hardware) {
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                camHal->cameraId = cameraId;
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                device = &camHal->hw_dev;
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                device->common.close = close_camera_device;
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                device->ops = &QCamera2HardwareInterface::mCameraOps;
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                device->priv = (void *)camHal;
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc =  0;
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            } else {
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (camHal->hardware) {
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    delete camHal->hardware;
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    camHal->hardware = NULL;
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                free(camHal);
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                device = NULL;
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                goto EXIT;
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    /* pass actual hw_device ptr to framework. This amkes that we actally be use memberof() macro */
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    *hw_device = (hw_device_t*)&device->common;
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelEXIT:
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("  end rc %d",  rc);
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C"  int close_camera_device( hw_device_t *hw_dev)
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: device =%p E",  hw_dev);
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc =  -1;
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera_device_t *device = (camera_device_t *)hw_dev;
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(device) {
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if(camHal ) {
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hardware = util_get_Hal_obj( device);
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if(!camHal->camera_released) {
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if(hardware != NULL) {
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    hardware->release(device);
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if(hardware != NULL)
1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                delete hardware;
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            free(camHal);
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = 0;
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint set_preview_window(struct camera_device * device,
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct preview_stream_ops *window)
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL) {
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->set_preview_window(device, window);
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid set_CallBacks(struct camera_device * device,
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_notify_callback notify_cb,
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_data_callback data_cb,
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_data_timestamp_callback data_cb_timestamp,
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_request_memory get_memory,
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *user)
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware->set_CallBacks(device, notify_cb,data_cb, data_cb_timestamp, get_memory, user);
2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid enable_msg_type(struct camera_device * device, int32_t msg_type)
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware->enable_msg_type(device, msg_type);
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid disable_msg_type(struct camera_device * device, int32_t msg_type)
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware->disable_msg_type(device, msg_type);
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint msg_type_enabled(struct camera_device * device, int32_t msg_type)
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->msg_type_enabled(device, msg_type);
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint start_preview(struct camera_device * device)
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->start_preview(device);
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: X");
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid stop_preview(struct camera_device * device)
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware->stop_preview(device);
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint preview_enabled(struct camera_device * device)
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->preview_enabled(device);
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint store_meta_data_in_buffers(struct camera_device * device, int enable)
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      rc = hardware->store_meta_data_in_buffers(device, enable);
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint start_recording(struct camera_device * device)
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->start_recording(device);
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid stop_recording(struct camera_device * device)
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware->stop_recording(device);
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint recording_enabled(struct camera_device * device)
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->recording_enabled(device);
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid release_recording_frame(struct camera_device * device,
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                const void *opaque)
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("Q%s: E");
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware->release_recording_frame(device, opaque);
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint auto_focus(struct camera_device * device)
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->auto_focus(device);
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint cancel_auto_focus(struct camera_device * device)
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->cancel_auto_focus(device);
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint take_picture(struct camera_device * device)
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->take_picture(device);
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint cancel_picture(struct camera_device * device)
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->cancel_picture(device);
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint set_parameters(struct camera_device * device, const char *parms)
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL && parms){
3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->set_parameters(device, parms);
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  }
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  return rc;
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelchar* get_parameters(struct camera_device * device)
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        char *parms = NULL;
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        parms = hardware->get_parameters(device);
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return parms;
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid put_parameters(struct camera_device * device, char *parm)
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      hardware->put_parameters(device, parm);
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint send_command(struct camera_device * device,
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            int32_t cmd, int32_t arg1, int32_t arg2)
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->send_command(device, cmd, arg1, arg2);
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid release(struct camera_device * device)
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hardware->release(device);
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camHal->camera_released = true;
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint dump(struct camera_device * device, int fd)
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    ALOGE("Q%s: E");
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = -1;
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(hardware != NULL){
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hardware->dump(device, fd);
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace android
451