166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2011-2014, 2016, The Linux Foundation. All rights reserved.
266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * Redistribution and use in source and binary forms, with or without
466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * modification, are permitted provided that the following conditions are
566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * met:
666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Redistributions of source code must retain the above copyright
766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       notice, this list of conditions and the following disclaimer.
866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Redistributions in binary form must reproduce the above
966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       copyright notice, this list of conditions and the following
1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       disclaimer in the documentation and/or other materials provided
1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       with the distribution.
1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *     * Neither the name of The Linux Foundation nor the names of its
1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       contributors may be used to endorse or promote products derived
1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *       from this software without specific prior written permission.
1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */
2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define ALOG_NIDEBUG 0
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define LOG_TAG "QualcommCamera"
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/threads.h>
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <binder/IMemory.h>
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <binder/MemoryBase.h>
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <binder/MemoryHeapBase.h>
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/RefBase.h>
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" {
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#define TIME_H <SYSTEM_HEADER_PREFIX/time.h>
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include TIME_H
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QualcommCamera.h"
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2Factory.h"
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2HWI.h"
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* HAL function implementation goes here*/
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/**
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * The functions need to be provided by the camera HAL.
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo()
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * and openCameraHardware() is 0 to N-1.
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin */
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic hw_module_methods_t camera_module_methods = {
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    open: camera_device_open,
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstatic hw_module_t camera_common = {
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    tag: HARDWARE_MODULE_TAG,
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    module_api_version: CAMERA_MODULE_API_VERSION_1_0,
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    hal_api_version: HARDWARE_HAL_API_VERSION,
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    id: CAMERA_HARDWARE_MODULE_ID,
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    name: "QCamera Module",
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    author: "Quic on behalf of CAF",
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    methods: &camera_module_methods,
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    dso: NULL,
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    reserved:  {0},
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinusing namespace qcamera;
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace android {
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef struct {
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_device hw_dev;
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware;
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int camera_released;
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int cameraId;
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} camera_hardware_t;
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjintypedef struct {
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  camera_memory_t mem;
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  int32_t msgType;
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  sp<IMemory> dataPtr;
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  void* user;
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  unsigned int index;
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} q_cam_memory_t;
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2HardwareInterface *util_get_Hal_obj( struct camera_device * device)
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = NULL;
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(device && device->priv){
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware = camHal->hardware;
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return hardware;
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" int get_number_of_cameras()
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* try to query every time we get the call!*/
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return QCamera2Factory::get_number_of_cameras();
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" int get_camera_info(int camera_id, struct camera_info *info)
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(info) {
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera2Factory::get_camera_info(camera_id, info);
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Q%s: X");
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* HAL should return NULL if it fails to open camera hardware. */
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" int  camera_device_open(
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  const struct hw_module_t* module, const char* id,
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin          struct hw_device_t** hw_device)
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_device *device = NULL;
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(module && id && hw_device) {
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!strcmp(module->name, camera_common.name)) {
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int cameraId = atoi(id);
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            camera_hardware_t *camHal =
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                (camera_hardware_t *) malloc(sizeof (camera_hardware_t));
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if(!camHal) {
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                *hw_device = NULL;
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                ALOGE("  end in no mem");
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return rc;
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            /* we have the camera_hardware obj malloced */
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            memset(camHal, 0, sizeof (camera_hardware_t));
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            camHal->hardware = new QCamera2HardwareInterface((uint32_t)cameraId);
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (camHal->hardware) {
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                camHal->cameraId = cameraId;
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                device = &camHal->hw_dev;
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                device->common.close = close_camera_device;
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                device->ops = &QCamera2HardwareInterface::mCameraOps;
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                device->priv = (void *)camHal;
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                rc =  0;
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else {
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (camHal->hardware) {
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    delete camHal->hardware;
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    camHal->hardware = NULL;
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                free(camHal);
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                device = NULL;
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                goto EXIT;
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    /* pass actual hw_device ptr to framework. This amkes that we actally be use memberof() macro */
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    *hw_device = (hw_device_t*)&device->common;
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinEXIT:
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("  end rc %d",  rc);
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C"  int close_camera_device( hw_device_t *hw_dev)
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: device =%p E",  hw_dev);
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc =  -1;
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_device_t *device = (camera_device_t *)hw_dev;
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(device) {
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(camHal ) {
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera2HardwareInterface *hardware = util_get_Hal_obj( device);
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if(!camHal->camera_released) {
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if(hardware != NULL) {
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    hardware->release(device);
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if(hardware != NULL)
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                delete hardware;
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            free(camHal);
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = 0;
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint set_preview_window(struct camera_device * device,
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        struct preview_stream_ops *window)
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL) {
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->set_preview_window(device, window);
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid set_CallBacks(struct camera_device * device,
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_notify_callback notify_cb,
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_data_callback data_cb,
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_data_timestamp_callback data_cb_timestamp,
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_request_memory get_memory,
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        void *user)
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware->set_CallBacks(device, notify_cb,data_cb, data_cb_timestamp, get_memory, user);
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid enable_msg_type(struct camera_device * device, int32_t msg_type)
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware->enable_msg_type(device, msg_type);
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid disable_msg_type(struct camera_device * device, int32_t msg_type)
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware->disable_msg_type(device, msg_type);
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint msg_type_enabled(struct camera_device * device, int32_t msg_type)
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->msg_type_enabled(device, msg_type);
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint start_preview(struct camera_device * device)
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->start_preview(device);
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: X");
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid stop_preview(struct camera_device * device)
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware->stop_preview(device);
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint preview_enabled(struct camera_device * device)
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->preview_enabled(device);
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint store_meta_data_in_buffers(struct camera_device * device, int enable)
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      rc = hardware->store_meta_data_in_buffers(device, enable);
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint start_recording(struct camera_device * device)
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->start_recording(device);
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid stop_recording(struct camera_device * device)
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware->stop_recording(device);
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint recording_enabled(struct camera_device * device)
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->recording_enabled(device);
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid release_recording_frame(struct camera_device * device,
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                const void *opaque)
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGD("Q%s: E");
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware->release_recording_frame(device, opaque);
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint auto_focus(struct camera_device * device)
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->auto_focus(device);
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint cancel_auto_focus(struct camera_device * device)
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->cancel_auto_focus(device);
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint take_picture(struct camera_device * device)
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->take_picture(device);
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint cancel_picture(struct camera_device * device)
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->cancel_picture(device);
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint set_parameters(struct camera_device * device, const char *parms)
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL && parms){
38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->set_parameters(device, parms);
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  }
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin  return rc;
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinchar* get_parameters(struct camera_device * device)
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        char *parms = NULL;
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        parms = hardware->get_parameters(device);
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return parms;
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return NULL;
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid put_parameters(struct camera_device * device, char *parm)
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin      hardware->put_parameters(device, parm);
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint send_command(struct camera_device * device,
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            int32_t cmd, int32_t arg1, int32_t arg2)
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->send_command(device, cmd, arg1, arg2);
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid release(struct camera_device * device)
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        hardware->release(device);
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        camHal->camera_released = true;
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint dump(struct camera_device * device, int fd)
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    ALOGE("Q%s: E");
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = -1;
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCamera2HardwareInterface *hardware = util_get_Hal_obj(device);
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(hardware != NULL){
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hardware->dump(device, fd);
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace android
451