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