1a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
2a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *
3a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * Redistribution and use in source and binary forms, with or without
4a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * modification, are permitted provided that the following conditions are
5a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * met:
6a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *     * Redistributions of source code must retain the above copyright
7a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *       notice, this list of conditions and the following disclaimer.
8a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *     * Redistributions in binary form must reproduce the above
9a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *       copyright notice, this list of conditions and the following
10a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *       disclaimer in the documentation and/or other materials provided
11a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *       with the distribution.
12a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *     * Neither the name of Code Aurora Forum, Inc. nor the names of its
13a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *       contributors may be used to endorse or promote products derived
14a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *       from this software without specific prior written permission.
15a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *
16a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *
28a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang */
29a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/*#error uncomment this for compiler test!*/
30a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
31a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang//#define ALOG_NDEBUG 0
32a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define ALOG_NIDEBUG 0
33a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#define LOG_TAG "QualcommCamera"
34a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/Log.h>
35a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <utils/threads.h>
36a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <fcntl.h>
37a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <sys/mman.h>
38a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
39a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QCameraHAL.h"
40a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* include QCamera Hardware Interface Header*/
41a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include "QualcommCamera.h"
42a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
43a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" {
44a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#include <sys/time.h>
45a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
46a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
47a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/**
48a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * The functions need to be provided by the camera HAL.
49a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang *
50a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * If getNumberOfCameras() returns N, the valid cameraId for getCameraInfo()
51a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang * and openCameraHardware() is 0 to N-1.
52a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang */
53a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
54a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatic hw_module_methods_t camera_module_methods = {
55a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    open: camera_device_open,
56a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang};
57a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
58a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangstatic hw_module_t camera_common  = {
59a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    tag: HARDWARE_MODULE_TAG,
60a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    module_api_version: CAMERA_MODULE_API_VERSION_2_0,
61a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    hal_api_version: HARDWARE_HAL_API_VERSION,
62a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    id: CAMERA_HARDWARE_MODULE_ID,
63a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    name: "Qcamera",
64a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    author:"Qcom",
65a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    methods: &camera_module_methods,
66a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    dso: NULL,
67a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    reserved:  {0},
68a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang};
69a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
70a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangcamera_module_t HAL_MODULE_INFO_SYM = {
71a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    common: camera_common,
72a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    get_number_of_cameras: get_number_of_cameras,
73a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    get_camera_info: get_camera_info,
74a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang};
75a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
76a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangcamera2_device_ops_t camera_ops = {
77a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    set_request_queue_src_ops:           android::set_request_queue_src_ops,
78a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    notify_request_queue_not_empty:      android::notify_request_queue_not_empty,
79a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    set_frame_queue_dst_ops:             android::set_frame_queue_dst_ops,
80a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    get_in_progress_count:               android::get_in_progress_count,
81a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    flush_captures_in_progress:          android::flush_captures_in_progress,
82a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    construct_default_request:           android::construct_default_request,
83a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
84a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    allocate_stream:                     android::allocate_stream,
85a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    register_stream_buffers:             android::register_stream_buffers,
86a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    release_stream:                      android::release_stream,
87a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
88a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    allocate_reprocess_stream:           android::allocate_reprocess_stream,
89f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala    allocate_reprocess_stream_from_stream: android::allocate_reprocess_stream_from_stream,
90a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    release_reprocess_stream:            android::release_reprocess_stream,
91a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
92a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    trigger_action:                      android::trigger_action,
93a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    set_notify_callback:                 android::set_notify_callback,
94a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    get_metadata_vendor_tag_ops:         android::get_metadata_vendor_tag_ops,
95a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    dump:                                android::dump,
96a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang};
97a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
98a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangnamespace android {
99a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
100a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangtypedef struct {
101a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  camera2_device_t hw_dev;
102a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  QCameraHardwareInterface *hardware;
103a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int camera_released;
104a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  int cameraId;
105a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang} camera_hardware_t;
106a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
107a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen WangQCameraHardwareInterface *util_get_Hal_obj(const camera2_device_t * device)
108a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
109a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = NULL;
110a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(device && device->priv){
111a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
112a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware = camHal->hardware;
113a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
114a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return hardware;
115a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
116a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
117a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int get_number_of_cameras()
118a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
119a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* try to query every time we get the call!*/
120a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
121a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return android::HAL_getNumberOfCameras();
122a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
123a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
124a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int get_camera_info(int camera_id, struct camera_info *info)
125a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
126a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
127a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E, id = %d", __func__, camera_id);
128a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(info) {
129a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = android::HAL_getCameraInfo(camera_id, info);
130a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
131a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: X, id = %d", __func__, camera_id);
132a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
133a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
134a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
135a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
136a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang/* HAL should return NULL if it fails to open camera hardware. */
137a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int  camera_device_open(
138a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  const struct hw_module_t* module, const char* id,
139a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang          struct hw_device_t** hw_device)
140a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
141a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
142a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int mode = 0;
143a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    camera2_device_t *device = NULL;
144a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E, id = %s", __func__, id);
145a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(module && id && hw_device) {
146a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        int cameraId = atoi(id);
147a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
148a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if (!strcmp(module->name, camera_common.name)) {
149a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            camera_hardware_t *camHal =
150a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                (camera_hardware_t *) malloc(sizeof (camera_hardware_t));
151a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            if(!camHal) {
152a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                *hw_device = NULL;
153a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	        ALOGE("%s:  end in no mem", __func__);
154a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang		return rc;
155a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	    }
156a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            /* we have the camera_hardware obj malloced */
157a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            memset(camHal, 0, sizeof (camera_hardware_t));
158a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            camHal->hardware = new QCameraHardwareInterface(cameraId, mode);
159a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            if (camHal->hardware && camHal->hardware->isCameraReady()) {
160a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang		camHal->cameraId = cameraId;
161a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang	        device = &camHal->hw_dev;
162a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                device->common.close = close_camera_device;
163a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                device->common.version = CAMERA_DEVICE_API_VERSION_2_0;
164a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                device->ops = &camera_ops;
165a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                device->priv = (void *)camHal;
166a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                rc =  0;
167a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            } else {
168a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                if (camHal->hardware) {
169a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                    delete camHal->hardware;
170a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                    camHal->hardware = NULL;
171a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                }
172a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                free(camHal);
173a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                device = NULL;
174a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            }
175a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
176a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
177a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    /* pass actual hw_device ptr to framework. This amkes that we actally be use memberof() macro */
178a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    *hw_device = (hw_device_t*)&device->common;
179a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s:  end rc %d", __func__, rc);
180a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
181a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
182a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
183a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangextern "C" int close_camera_device(hw_device_t *hw_dev)
184a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
185a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: device =%p E", __func__, hw_dev);
186a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc =  -1;
187a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    camera2_device_t *device = (camera2_device_t *)hw_dev;
188a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
189a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(device) {
190a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
191a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        if(camHal ) {
192a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
193a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            if(!camHal->camera_released) {
194a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                if(hardware != NULL) {
195a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                    hardware->release( );
196a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                }
197a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            }
198a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            if(hardware != NULL)
199a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                delete hardware;
200a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            free(camHal);
201a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        }
202a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = 0;
203a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
204a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
205a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
206a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
207a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint set_request_queue_src_ops(const struct camera2_device *device,
208a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    const camera2_request_queue_src_ops_t *request_src_ops)
209a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
210a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
211a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
212a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
213a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
214a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->set_request_queue_src_ops(request_src_ops);
215a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
216a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
217a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
218a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
219a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint notify_request_queue_not_empty(const struct camera2_device *device)
220a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
221a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
222a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
223a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
224a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
225a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->notify_request_queue_not_empty();
226a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
227a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
228a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
229a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
230a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint set_frame_queue_dst_ops(const struct camera2_device *device,
231a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    const camera2_frame_queue_dst_ops_t *frame_dst_ops)
232a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
233a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
234a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
235a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
236a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
237a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->set_frame_queue_dst_ops(frame_dst_ops);
238a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
239a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
240a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
241a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
242a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint get_in_progress_count(const struct camera2_device *device)
243a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
244a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
245a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s:E",__func__);
246a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
247a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
248a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
249a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->get_in_progress_count();
250a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
251a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s:X",__func__);
252a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
253a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
254a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
255a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint flush_captures_in_progress(const struct camera2_device *)
256a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
257a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s:E",__func__);
258a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("%s:X",__func__);
259a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return INVALID_OPERATION;
260a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
261a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
262a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint construct_default_request(const struct camera2_device *device,
263a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int request_template,
264a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    camera_metadata_t **request)
265a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
266a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
267a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
268a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
269a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
270a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->construct_default_request(request_template, request);
271a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
272a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
273a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
274a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
275a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint allocate_stream(const struct camera2_device *device,
276a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t width,
277a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t height,
278a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        int      format,
279a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        const camera2_stream_ops_t *stream_ops,
280a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t *stream_id,
281a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t *format_actual,
282a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t *usage,
283a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t *max_buffers)
284a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
285a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
286a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
287a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
288a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
289a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->allocate_stream(width, height, format, stream_ops,
290a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            stream_id, format_actual, usage, max_buffers);
291a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
292a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
293a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
294a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
295a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint register_stream_buffers(
296a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        const struct camera2_device *device,
297a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t stream_id,
298a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        int num_buffers,
299a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        buffer_handle_t *buffers)
300a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
301a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
302a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
303a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
304a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
305a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->register_stream_buffers(stream_id, num_buffers, buffers);
306a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
307a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
308a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
309a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
310a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint release_stream(
311a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        const struct camera2_device *device,
312a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t stream_id)
313a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
314a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
315a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
316a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
317a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
318a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->release_stream(stream_id);
319a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
320a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
321a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
322a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
323a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint allocate_reprocess_stream(const struct camera2_device *,
324a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t width,
325a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t height,
326a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t format,
327a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        const camera2_stream_in_ops_t *reprocess_stream_ops,
328a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t *stream_id,
329a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t *consumer_usage,
330a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t *max_buffers)
331a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
332a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return INVALID_OPERATION;
333a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
334a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
335f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvalaint allocate_reprocess_stream_from_stream(const struct camera2_device *,
336f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala        uint32_t output_stream_id,
337f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala        const camera2_stream_in_ops_t *reprocess_stream_ops,
338f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala        uint32_t *stream_id)
339f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala{
340f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala    return INVALID_OPERATION;
341f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala}
342f9761fc5f713a47795f77e0cd8c6dfc23e166f70Eino-Ville Talvala
343a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint release_reprocess_stream(
344a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        const struct camera2_device *,
345a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t stream_id)
346a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
347a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return INVALID_OPERATION;
348a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
349a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
350a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint trigger_action(const struct camera2_device *,
351a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        uint32_t trigger_id,
352a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        int32_t ext1,
353a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        int32_t ext2)
354a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
355a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return INVALID_OPERATION;
356a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
357a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
358a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint set_notify_callback(const struct camera2_device *device,
359a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera2_notify_callback notify_cb,
360a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        void *user)
361a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
362a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
363a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
364a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
365a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
366a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->set_notify_callback(notify_cb, user);
367a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
368a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
369a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
370a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
371a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint get_metadata_vendor_tag_ops(const struct camera2_device *device,
372a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        vendor_tag_query_ops_t **ops)
373a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
374a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = INVALID_OPERATION;
375a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
376a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
377a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
378a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->get_metadata_vendor_tag_ops(ops);
379a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
380a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
381a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
382a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
383a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint dump(const struct camera2_device *, int fd)
384a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
385a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return INVALID_OPERATION;
386a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
387a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
388a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#if 0
389a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint set_preview_window(camera2_device_t * device,
390a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        struct preview_stream_ops *window)
391a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
392a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
393a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
394a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
395a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL) {
396a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->setPreviewWindow(window);
397a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
398a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
399a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
400a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
401a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid set_CallBacks(camera2_device_t * device,
402a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_notify_callback notify_cb,
403a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_data_callback data_cb,
404a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_data_timestamp_callback data_cb_timestamp,
405a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_request_memory get_memory,
406a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        void *user)
407a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
408a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
409a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
410a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
411a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->setCallbacks(notify_cb,data_cb, data_cb_timestamp, get_memory, user);
412a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
413a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
414a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
415a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid enable_msg_type(camera2_device_t * device, int32_t msg_type)
416a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
417a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
418a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
419a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->enableMsgType(msg_type);
420a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
421a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
422a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
423a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid disable_msg_type(camera2_device_t * device, int32_t msg_type)
424a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
425a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
426a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
427a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
428a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->disableMsgType(msg_type);
429a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
430a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
431a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
432a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint msg_type_enabled(camera2_device_t * device, int32_t msg_type)
433a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
434a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
435a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
436a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
437a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
438a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->msgTypeEnabled(msg_type);
439a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
440a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
441a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
442a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
443a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint start_preview(camera2_device_t * device)
444a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
445a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
446a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
447a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
448a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
449a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->startPreview( );
450a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
451a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: X", __func__);
452a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
453a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
454a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
455a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid stop_preview(camera2_device_t * device)
456a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
457a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
458a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
459a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
460a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->stopPreview( );
461a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
462a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
463a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
464a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint preview_enabled(camera2_device_t * device)
465a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
466a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
467a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
468a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
469a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
470a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->previewEnabled( );
471a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
472a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
473a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
474a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
475a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint store_meta_data_in_buffers(camera2_device_t *device, int enable)
476a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
477a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
478a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
479a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
480a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
481a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      rc = hardware->storeMetaDataInBuffers(enable);
482a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
483a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
484a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
485a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
486a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint start_recording(camera2_device_t *device)
487a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
488a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
489a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
490a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
491a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
492a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->startRecording( );
493a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
494a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
495a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
496a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
497a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid stop_recording(camera2_device_t *device)
498a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
499a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
500a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
501a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
502a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->stopRecording( );
503a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
504a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
505a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
506a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint recording_enabled(camera2_device_t *device)
507a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
508a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
509a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
510a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
511a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
512a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->recordingEnabled( );
513a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
514a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
515a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
516a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
517a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid release_recording_frame(camera2_device_t *device,
518a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang                const void *opaque)
519a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
520a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGV("Q%s: E", __func__);
521a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
522a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
523a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->releaseRecordingFrame(opaque);
524a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
525a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
526a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
527a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint auto_focus(camera2_device_t *device)
528a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
529a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
530a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
531a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
532a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
533a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->autoFocus( );
534a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
535a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
536a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
537a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
538a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint cancel_auto_focus(camera2_device_t *device)
539a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
540a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
541a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
542a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
543a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
544a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->cancelAutoFocus( );
545a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
546a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
547a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
548a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
549a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint take_picture(camera2_device_t *device)
550a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
551a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
552a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
553a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
554a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
555a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->takePicture( );
556a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
557a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
558a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
559a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
560a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint cancel_picture(camera2_device_t *device)
561a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
562a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
563a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
564a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
565a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
566a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
567a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->cancelPicture( );
568a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
569a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
570a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
571a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
572a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint set_parameters(camera2_device_t *device, const char *parms)
573a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
574a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
575a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
576a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
577a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
578a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL && parms){
579a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        //QCameraParameters param;// = util_get_HAL_parameter(device);
580a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        //String8 str = String8(parms);
581a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
582a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        //param.unflatten(str);
583a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->setParameters(parms);
584a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        //rc = 0;
585a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  }
586a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang  return rc;
587a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
588a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
589a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangchar* get_parameters(camera2_device_t *device)
590a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
591a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
592a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
593a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
594a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang		char *parms = NULL;
595a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->getParameters(&parms);
596a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang		return parms;
597a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
598a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return NULL;
599a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
600a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
601a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid put_parameters(camera2_device_t *device, char *parm)
602a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
603a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
604a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
605a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
606a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
607a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang      hardware->putParameters(parm);
608a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
609a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
610a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
611a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint send_command(camera2_device_t *device,
612a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang            int32_t cmd, int32_t arg1, int32_t arg2)
613a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
614a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
615a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
616a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
617a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
618a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->sendCommand( cmd, arg1, arg2);
619a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
620a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
621a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
622a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
623a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangvoid release(camera2_device_t *device)
624a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
625a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
626a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
627a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
628a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camera_hardware_t *camHal = (camera_hardware_t *)device->priv;
629a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        hardware->release( );
630a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        camHal->camera_released = true;
631a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
632a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
633a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
634a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wangint dump(camera2_device_t *device, int fd)
635a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang{
636a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    ALOGE("Q%s: E", __func__);
637a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    int rc = -1;
638a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    QCameraHardwareInterface *hardware = util_get_Hal_obj(device);
639a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    if(hardware != NULL){
640a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang        rc = hardware->dump( fd );
641a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    }
642a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang    return rc;
643a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}
644a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang#endif
645a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang
646a46eb3014aec9c8a6ed170f2a99b498100d6f392Shuzhen Wang}; // namespace android
647