166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-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 LOG_TAG "QCamera2Factory"
3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies
3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <stdlib.h>
3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h>
3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies
3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "camera.h"
3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "camera3.h"
3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "HAL/QCamera2HWI.h"
4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "HAL3/QCamera3HWI.h"
4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "util/QCameraFlash.h"
4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCamera2Factory.h"
4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraMuxer.h"
4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" {
4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h"
4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinusing namespace android;
5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera {
5266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
5366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2Factory *gQCamera2Factory = NULL;
5466f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraMuxer *gQCameraMuxer = NULL;
5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinpthread_mutex_t gCamLock = PTHREAD_MUTEX_INITIALIZER;
5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin//Total number of cameras opened simultaneously.
5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin//This variable updation is protected by gCamLock.
5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinuint8_t gNumCameraSessions = 0;
5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvolatile uint32_t gKpiDebugLevel = 1;
6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : QCamera2Factory
6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCamera2Factory
6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : None
7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
7166f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2Factory::QCamera2Factory()
7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
7366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_info info;
7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mHalDescriptors = NULL;
7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mCallbacks = NULL;
7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mNumOfCameras = get_num_of_cameras();
7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int bDualCamera = 0;
7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char propDefault[PROPERTY_VALUE_MAX];
7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char prop[PROPERTY_VALUE_MAX];
8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("persist.camera.HAL3.enabled", prop, "1");
8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int isHAL3Enabled = atoi(prop);
8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    // Signifies whether system has to enable dual camera mode
8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    snprintf(propDefault, PROPERTY_VALUE_MAX, "%d", isDualCamAvailable(isHAL3Enabled));
8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    property_get("persist.camera.dual.camera", prop, propDefault);
8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bDualCamera = atoi(prop);
8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("dualCamera:%d ", bDualCamera);
8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(bDualCamera) {
9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGI("Enabling QCamera Muxer");
9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!gQCameraMuxer) {
9266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCameraMuxer::getCameraMuxer(&gQCameraMuxer, mNumOfCameras);
9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (!gQCameraMuxer) {
9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Error !! Failed to get QCameraMuxer");
9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!gQCameraMuxer && (mNumOfCameras > 0) &&
9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (mNumOfCameras <= MM_CAMERA_MAX_NUM_SENSORS)) {
10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        mHalDescriptors = new hal_desc[mNumOfCameras];
10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if ( NULL != mHalDescriptors) {
10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            uint32_t cameraId = 0;
10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            for (int i = 0; i < mNumOfCameras ; i++, cameraId++) {
10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mHalDescriptors[i].cameraId = cameraId;
10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Set Device version to 3.x when both HAL3 is enabled & its BAYER sensor
10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                if (isHAL3Enabled && !(is_yuv_sensor(cameraId))) {
10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mHalDescriptors[i].device_version =
10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            CAMERA_DEVICE_API_VERSION_3_0;
11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                } else {
11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    mHalDescriptors[i].device_version =
11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                            CAMERA_DEVICE_API_VERSION_1_0;
11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                }
11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //Query camera at this point in order
11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //to avoid any delays during subsequent
11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                //calls to 'getCameraInfo()'
11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                getCameraInfo(i, &info);
11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else {
12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Not enough resources to allocate HAL descriptor table!");
12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGI("%d camera devices detected!", mNumOfCameras);
12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : ~QCamera2Factory
12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deconstructor of QCamera2Factory
13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : None
13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
13666f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCamera2Factory::~QCamera2Factory()
13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL != mHalDescriptors ) {
13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete [] mHalDescriptors;
14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (gQCameraMuxer) {
14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        delete gQCameraMuxer;
14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        gQCameraMuxer = NULL;
14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : get_number_of_cameras
14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to query number of cameras detected
15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : number of cameras detected
15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::get_number_of_cameras()
15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int numCameras = 0;
15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!gQCamera2Factory) {
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        gQCamera2Factory = new QCamera2Factory();
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!gQCamera2Factory) {
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Failed to allocate Camera2Factory object");
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return 0;
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        numCameras = gQCameraMuxer->get_number_of_cameras();
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        numCameras = gQCamera2Factory->getNumberOfCameras();
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("num of cameras: %d", numCameras);
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return numCameras;
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : get_camera_info
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to query camera information with its ID
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @info      : ptr to camera info struct
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::get_camera_info(int camera_id, struct camera_info *info)
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = gQCameraMuxer->get_camera_info(camera_id, info);
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCamera2Factory->getCameraInfo(camera_id, info);
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : set_callbacks
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to set callbacks function to camera module
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @callbacks : ptr to callback functions
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NO_ERROR  -- success
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_callbacks(const camera_module_callbacks_t *callbacks)
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = gQCameraMuxer->set_callbacks(callbacks);
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCamera2Factory->setCallbacks(callbacks);
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : open_legacy
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @halVersion: Based on camera_module_t.common.module_api_version
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::open_legacy(const struct hw_module_t* module,
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const char* id, uint32_t halVersion, struct hw_device_t** device)
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (module != &HAL_MODULE_INFO_SYM.common) {
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid module. Trying to open %p, expect %p",
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            module, &HAL_MODULE_INFO_SYM.common);
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return INVALID_OPERATION;
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!id) {
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid camera id");
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCameraMuxer->open_legacy(module, id, halVersion, device);
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCamera2Factory->openLegacy(atoi(id), halVersion, device);
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : set_torch_mode
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit.
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @on        : Indicates whether to turn the flash on or off
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_torch_mode(const char* camera_id, bool on)
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return gQCamera2Factory->setTorchMode(camera_id, on);
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getNumberOfCameras
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query number of cameras detected
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : number of cameras detected
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getNumberOfCameras()
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return mNumOfCameras;
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getCameraInfo
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query camera information with its ID
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @info      : ptr to camera info struct
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getCameraInfo(int camera_id, struct camera_info *info)
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc;
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_sync_type_t cam_type = CAM_TYPE_MAIN;
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mNumOfCameras || camera_id >= mNumOfCameras || !info ||
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        (camera_id < 0)) {
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error getting camera info!! mNumOfCameras = %d,"
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                "camera_id = %d, info = %p",
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 mNumOfCameras, camera_id, info);
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -ENODEV;
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL == mHalDescriptors ) {
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Hal descriptor table is not initialized!");
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( mHalDescriptors[camera_id].device_version ==
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAMERA_DEVICE_API_VERSION_3_0 ) {
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = QCamera3HardwareInterface::getCamInfo(
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mHalDescriptors[camera_id].cameraId, info);
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (mHalDescriptors[camera_id].device_version ==
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAMERA_DEVICE_API_VERSION_1_0) {
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = QCamera2HardwareInterface::getCapabilities(
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mHalDescriptors[camera_id].cameraId, info, &cam_type);
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Device version for camera id %d invalid %d",
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              camera_id,
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              mHalDescriptors[camera_id].device_version);
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setCallbacks
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set callback functions to send asynchronous notifications to
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              frameworks.
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @callbacks : callback function pointer
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     :
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setCallbacks(const camera_module_callbacks_t *callbacks)
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mCallbacks = callbacks;
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCameraFlash::getInstance().registerCallbacks(callbacks);
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Failed to register callbacks with flash module!");
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : cameraDeviceOpen
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: open a camera device with its ID
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::cameraDeviceOpen(int camera_id,
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    struct hw_device_t **hw_device)
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (camera_id < 0 || camera_id >= mNumOfCameras)
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -ENODEV;
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL == mHalDescriptors ) {
38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Hal descriptor table is not initialized!");
38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGI("Open camera id %d API version %d",
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            camera_id, mHalDescriptors[camera_id].device_version);
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_3_0 ) {
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3HardwareInterface *hw = new QCamera3HardwareInterface(mHalDescriptors[camera_id].cameraId,
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mCallbacks);
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!hw) {
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Allocation of hardware interface failed");
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return NO_MEMORY;
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hw->openCamera(hw_device);
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != 0) {
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            delete hw;
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_1_0) {
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera2HardwareInterface *hw = new QCamera2HardwareInterface((uint32_t)camera_id);
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!hw) {
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Allocation of hardware interface failed");
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return NO_MEMORY;
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hw->openCamera(hw_device);
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            delete hw;
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Device version for camera id %d invalid %d",
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              camera_id,
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              mHalDescriptors[camera_id].device_version);
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : camera_device_open
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to open a camera device by its ID
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::camera_device_open(
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const struct hw_module_t *module, const char *id,
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    struct hw_device_t **hw_device)
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (module != &HAL_MODULE_INFO_SYM.common) {
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid module. Trying to open %p, expect %p",
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            module, &HAL_MODULE_INFO_SYM.common);
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return INVALID_OPERATION;
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!id) {
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid camera id");
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCameraMuxer->camera_device_open(module, id, hw_device);
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = gQCamera2Factory->cameraDeviceOpen(atoi(id), hw_device);
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstruct hw_module_methods_t QCamera2Factory::mModuleMethods = {
4601687b440bcda598006d1950f74915f0cea3b66a3Mekala Natarajan    .open = QCamera2Factory::camera_device_open,
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : openLegacy
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @halVersion: Based on camera_module_t.common.module_api_version
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::openLegacy(
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t cameraId, uint32_t halVersion, struct hw_device_t** hw_device)
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGI("openLegacy halVersion: %d", halVersion);
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Assumption: all cameras can support legacy API version
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (cameraId < 0 || cameraId >= gQCamera2Factory->getNumberOfCameras())
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -ENODEV;
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    switch(halVersion)
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    {
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case CAMERA_DEVICE_API_VERSION_1_0:
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        {
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera2HardwareInterface *hw =
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                new QCamera2HardwareInterface((uint32_t)cameraId);
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (!hw) {
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Allocation of hardware interface failed");
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return NO_MEMORY;
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = hw->openCamera(hw_device);
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc != NO_ERROR) {
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                delete hw;
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        default:
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Device API version: %d for camera id %d invalid",
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 halVersion, cameraId);
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return BAD_VALUE;
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setTorchMode
51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit.
51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @on        : Indicates whether to turn the flash on or off
51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setTorchMode(const char* camera_id, bool on)
52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int retVal(0);
52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    long cameraIdLong(-1);
52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int cameraIdInt(-1);
52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char* endPointer = NULL;
52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    errno = 0;
53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraFlash& flash = QCameraFlash::getInstance();
53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cameraIdLong = strtol(camera_id, &endPointer, 10);
53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((errno == ERANGE) ||
53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (cameraIdLong < 0) ||
53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (cameraIdLong >= static_cast<long>(get_number_of_cameras())) ||
53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (endPointer == camera_id) ||
53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (*endPointer != '\0')) {
53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        retVal = -EINVAL;
54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (on) {
54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cameraIdInt = static_cast<int>(cameraIdLong);
54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        retVal = flash.initFlash(cameraIdInt);
54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (retVal == 0) {
54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            retVal = flash.setFlashMode(cameraIdInt, on);
54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((retVal == 0) && (mCallbacks != NULL)) {
54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mCallbacks->torch_mode_status_change(mCallbacks,
54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        camera_id,
54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        TORCH_MODE_STATUS_AVAILABLE_ON);
55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else if (retVal == -EALREADY) {
55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Flash is already on, so treat this as a success.
55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                retVal = 0;
55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cameraIdInt = static_cast<int>(cameraIdLong);
55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        retVal = flash.setFlashMode(cameraIdInt, on);
55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (retVal == 0) {
56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            retVal = flash.deinitFlash(cameraIdInt);
56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((retVal == 0) && (mCallbacks != NULL)) {
56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mCallbacks->torch_mode_status_change(mCallbacks,
56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        camera_id,
56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        TORCH_MODE_STATUS_AVAILABLE_OFF);
56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else if (retVal == -EALREADY) {
56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Flash is already off, so treat this as a success.
56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            retVal = 0;
56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return retVal;
57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : isDualCamAvailable
57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to check whether we have dual Camera HW available
57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hal3Enabled : HAL3 enable flag
58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : bool - true : have Dual Camera HW available
58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *                           false : not have Dual Camera HW available
58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2Factory::isDualCamAvailable(int hal3Enabled)
58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool rc = FALSE;
58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int i = 0;
59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_info info;
59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_sync_type_t cam_type = CAM_TYPE_MAIN;
59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (i = 0; i < mNumOfCameras; i++) {
59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!hal3Enabled) {
59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera2HardwareInterface::getCapabilities(i, &info, &cam_type);
59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(cam_type == CAM_TYPE_AUX) {
59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGH("Have Dual Camera HW Avaiable.");
60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = TRUE;
60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera
60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
610