1683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda/* Copyright (c) 2013-2014, The Linux Foundataion. All rights reserved. 2584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * 3584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * Redistribution and use in source and binary forms, with or without 4584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * modification, are permitted provided that the following conditions are 5584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * met: 6584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * * Redistributions of source code must retain the above copyright 7584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * notice, this list of conditions and the following disclaimer. 8584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * * Redistributions in binary form must reproduce the above 9584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * copyright notice, this list of conditions and the following 10584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * disclaimer in the documentation and/or other materials provided 11584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * with the distribution. 12584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * * Neither the name of The Linux Foundation nor the names of its 13584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * contributors may be used to endorse or promote products derived 14584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * from this software without specific prior written permission. 15584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * 16584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang * 28584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang */ 29584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 30584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#define LOG_TAG "QCameraThermalAdapter" 31584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 32584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include <dlfcn.h> 33584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include <stdlib.h> 34584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include <utils/Errors.h> 35584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 3677e92b071f7205f74322e3afe3d60814e7bd22ceEmilian Peev#include "QCamera2HWI.h" 37584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang#include "QCameraThermalAdapter.h" 38584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 39584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangusing namespace android; 40584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 41584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangnamespace qcamera { 42584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 43584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 44584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen WangQCameraThermalAdapter& QCameraThermalAdapter::getInstance() 45584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{ 46584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang static QCameraThermalAdapter instance; 47584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang return instance; 48584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang} 49584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 50584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen WangQCameraThermalAdapter::QCameraThermalAdapter() : 51584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang mCallback(NULL), 52584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang mHandle(NULL), 53584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang mRegister(NULL), 540825db66074e616f12933dc3499685555fc837ecShuzhen Wang mUnregister(NULL), 550825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCameraHandle(0), 560825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCamcorderHandle(0) 57584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{ 58584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang} 59584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 60584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangint QCameraThermalAdapter::init(QCameraThermalCallback *thermalCb) 61584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{ 62584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang const char *error = NULL; 630825db66074e616f12933dc3499685555fc837ecShuzhen Wang int rc = NO_ERROR; 64584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 65683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda CDBG("%s E", __func__); 669ec8a88d88712c52c7f8c6ef0e757a856ca620c9Satya Durga Srinivasu Prabhala mHandle = dlopen("/vendor/lib/libthermalclient.so", RTLD_NOW); 67584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang if (!mHandle) { 68584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang error = dlerror(); 69584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang ALOGE("%s: dlopen failed with error %s", 70584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang __func__, error ? error : ""); 71584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang rc = UNKNOWN_ERROR; 72584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang goto error; 73584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang } 740825db66074e616f12933dc3499685555fc837ecShuzhen Wang *(void **)&mRegister = dlsym(mHandle, "thermal_client_register_callback"); 75584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang if (!mRegister) { 76584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang error = dlerror(); 77584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang ALOGE("%s: dlsym failed with error code %s", 78584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang __func__, error ? error: ""); 79584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang rc = UNKNOWN_ERROR; 80584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang goto error2; 81584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang } 820825db66074e616f12933dc3499685555fc837ecShuzhen Wang *(void **)&mUnregister = dlsym(mHandle, "thermal_client_unregister_callback"); 83584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang if (!mUnregister) { 84584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang error = dlerror(); 85584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang ALOGE("%s: dlsym failed with error code %s", 86584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang __func__, error ? error: ""); 87584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang rc = UNKNOWN_ERROR; 88584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang goto error2; 89584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang } 90584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 91e47699dd33bcd1c7c594c4efbb6ed2241968982bEmilian Peev mCallback = thermalCb; 92e47699dd33bcd1c7c594c4efbb6ed2241968982bEmilian Peev 93584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang // Register camera and camcorder callbacks 940825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCameraHandle = mRegister(mStrCamera, thermalCallback, NULL); 950825db66074e616f12933dc3499685555fc837ecShuzhen Wang if (mCameraHandle < 0) { 960825db66074e616f12933dc3499685555fc837ecShuzhen Wang ALOGE("%s: thermal_client_register_callback failed %d", 970825db66074e616f12933dc3499685555fc837ecShuzhen Wang __func__, mCameraHandle); 980825db66074e616f12933dc3499685555fc837ecShuzhen Wang rc = UNKNOWN_ERROR; 99584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang goto error2; 100584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang } 1010825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCamcorderHandle = mRegister(mStrCamcorder, thermalCallback, NULL); 1020825db66074e616f12933dc3499685555fc837ecShuzhen Wang if (mCamcorderHandle < 0) { 1030825db66074e616f12933dc3499685555fc837ecShuzhen Wang ALOGE("%s: thermal_client_register_callback failed %d", 1040825db66074e616f12933dc3499685555fc837ecShuzhen Wang __func__, mCamcorderHandle); 1050825db66074e616f12933dc3499685555fc837ecShuzhen Wang rc = UNKNOWN_ERROR; 106584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang goto error3; 107584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang } 108584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 109683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda CDBG("%s X", __func__); 110584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang return rc; 111584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 112584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangerror3: 1130825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCamcorderHandle = 0; 1140825db66074e616f12933dc3499685555fc837ecShuzhen Wang mUnregister(mCameraHandle); 115584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangerror2: 1160825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCameraHandle = 0; 117584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang dlclose(mHandle); 118e248dceae7a5ba50bbf72f60e04d1dad8f095346David Ng mHandle = NULL; 119584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangerror: 120683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda CDBG("%s X", __func__); 121584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang return rc; 122584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang} 123584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 124584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangvoid QCameraThermalAdapter::deinit() 125584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{ 126683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda CDBG("%s E", __func__); 127584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang if (mUnregister) { 1280825db66074e616f12933dc3499685555fc837ecShuzhen Wang if (mCameraHandle) { 1290825db66074e616f12933dc3499685555fc837ecShuzhen Wang mUnregister(mCameraHandle); 1300825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCameraHandle = 0; 1310825db66074e616f12933dc3499685555fc837ecShuzhen Wang } 1320825db66074e616f12933dc3499685555fc837ecShuzhen Wang if (mCamcorderHandle) { 1330825db66074e616f12933dc3499685555fc837ecShuzhen Wang mUnregister(mCamcorderHandle); 1340825db66074e616f12933dc3499685555fc837ecShuzhen Wang mCamcorderHandle = 0; 1350825db66074e616f12933dc3499685555fc837ecShuzhen Wang } 136584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang } 137584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang if (mHandle) 138584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang dlclose(mHandle); 139584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 140584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang mHandle = NULL; 141584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang mRegister = NULL; 142584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang mUnregister = NULL; 143584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang mCallback = NULL; 144683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda CDBG("%s X", __func__); 145584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang} 146584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 147584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangchar QCameraThermalAdapter::mStrCamera[] = "camera"; 148584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wangchar QCameraThermalAdapter::mStrCamcorder[] = "camcorder"; 149584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 1500825db66074e616f12933dc3499685555fc837ecShuzhen Wangint QCameraThermalAdapter::thermalCallback(int level, 1510825db66074e616f12933dc3499685555fc837ecShuzhen Wang void *userdata, void *data) 152584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang{ 153584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang int rc = 0; 154683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda CDBG("%s E", __func__); 155584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang QCameraThermalAdapter& instance = getInstance(); 156c1b98233ec8545ed96ac13378e251118127561a9Emilian Peev qcamera_thermal_level_enum_t lvl = (qcamera_thermal_level_enum_t) level; 157584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang if (instance.mCallback) 1580825db66074e616f12933dc3499685555fc837ecShuzhen Wang rc = instance.mCallback->thermalEvtHandle(lvl, userdata, data); 159683033d93e48733b87a7bdcee6861c192c332a76Ranjith Kagathi Ananda CDBG("%s X", __func__); 160584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang return rc; 161584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang} 162584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang 163584931a9f7152204b290a97324b4de0f32f48ca2Shuzhen Wang}; //namespace qcamera 164