QCamera2Factory.cpp revision 66f9976540f830b0090ff2ca557b0364a53f2008
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    int rc = NO_ERROR;
16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!gQCamera2Factory) {
16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        gQCamera2Factory = new QCamera2Factory();
16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!gQCamera2Factory) {
16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Failed to allocate Camera2Factory object");
16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return 0;
16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        numCameras = gQCameraMuxer->get_number_of_cameras();
17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        numCameras = gQCamera2Factory->getNumberOfCameras();
17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGH("num of cameras: %d", numCameras);
17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return numCameras;
17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : get_camera_info
18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to query camera information with its ID
18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @info      : ptr to camera info struct
18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::get_camera_info(int camera_id, struct camera_info *info)
19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = gQCameraMuxer->get_camera_info(camera_id, info);
19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCamera2Factory->getCameraInfo(camera_id, info);
19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : set_callbacks
20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to set callbacks function to camera module
20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @callbacks : ptr to callback functions
21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : NO_ERROR  -- success
21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_callbacks(const camera_module_callbacks_t *callbacks)
21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = gQCameraMuxer->set_callbacks(callbacks);
21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCamera2Factory->setCallbacks(callbacks);
22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : open_legacy
22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation
22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @halVersion: Based on camera_module_t.common.module_api_version
23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::open_legacy(const struct hw_module_t* module,
23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            const char* id, uint32_t halVersion, struct hw_device_t** device)
24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (module != &HAL_MODULE_INFO_SYM.common) {
24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid module. Trying to open %p, expect %p",
24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            module, &HAL_MODULE_INFO_SYM.common);
24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return INVALID_OPERATION;
24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!id) {
24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid camera id");
24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCameraMuxer->open_legacy(module, id, halVersion, device);
25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCamera2Factory->openLegacy(atoi(id), halVersion, device);
25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : set_torch_mode
26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit.
26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @on        : Indicates whether to turn the flash on or off
26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::set_torch_mode(const char* camera_id, bool on)
27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return gQCamera2Factory->setTorchMode(camera_id, on);
27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getNumberOfCameras
27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query number of cameras detected
28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : none
28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : number of cameras detected
28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getNumberOfCameras()
28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return mNumOfCameras;
28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : getCameraInfo
29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: query camera information with its ID
29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @info      : ptr to camera info struct
29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::getCameraInfo(int camera_id, struct camera_info *info)
30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc;
30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_sync_type_t cam_type = CAM_TYPE_MAIN;
30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!mNumOfCameras || camera_id >= mNumOfCameras || !info ||
30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        (camera_id < 0)) {
31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Error getting camera info!! mNumOfCameras = %d,"
31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                "camera_id = %d, info = %p",
31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 mNumOfCameras, camera_id, info);
31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -ENODEV;
31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL == mHalDescriptors ) {
31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Hal descriptor table is not initialized!");
31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( mHalDescriptors[camera_id].device_version ==
32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAMERA_DEVICE_API_VERSION_3_0 ) {
32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = QCamera3HardwareInterface::getCamInfo(
32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mHalDescriptors[camera_id].cameraId, info);
32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (mHalDescriptors[camera_id].device_version ==
32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            CAMERA_DEVICE_API_VERSION_1_0) {
32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = QCamera2HardwareInterface::getCapabilities(
32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mHalDescriptors[camera_id].cameraId, info, &cam_type);
32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Device version for camera id %d invalid %d",
33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              camera_id,
33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              mHalDescriptors[camera_id].device_version);
33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setCallbacks
34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: set callback functions to send asynchronous notifications to
34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              frameworks.
34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @callbacks : callback function pointer
34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     :
34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setCallbacks(const camera_module_callbacks_t *callbacks)
35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    mCallbacks = callbacks;
35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    rc = QCameraFlash::getInstance().registerCallbacks(callbacks);
35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (rc != 0) {
35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Failed to register callbacks with flash module!");
36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : cameraDeviceOpen
36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: open a camera device with its ID
36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::cameraDeviceOpen(int camera_id,
37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                    struct hw_device_t **hw_device)
38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (camera_id < 0 || camera_id >= mNumOfCameras)
38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -ENODEV;
38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( NULL == mHalDescriptors ) {
38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Hal descriptor table is not initialized!");
38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return NO_INIT;
38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGI("Open camera id %d API version %d",
39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            camera_id, mHalDescriptors[camera_id].device_version);
39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ( mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_3_0 ) {
39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera3HardwareInterface *hw = new QCamera3HardwareInterface(mHalDescriptors[camera_id].cameraId,
39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mCallbacks);
39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!hw) {
39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Allocation of hardware interface failed");
39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return NO_MEMORY;
39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hw->openCamera(hw_device);
40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != 0) {
40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            delete hw;
40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (mHalDescriptors[camera_id].device_version == CAMERA_DEVICE_API_VERSION_1_0) {
40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        QCamera2HardwareInterface *hw = new QCamera2HardwareInterface((uint32_t)camera_id);
40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!hw) {
40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Allocation of hardware interface failed");
40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return NO_MEMORY;
40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = hw->openCamera(hw_device);
41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (rc != NO_ERROR) {
41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            delete hw;
41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Device version for camera id %d invalid %d",
41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              camera_id,
41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin              mHalDescriptors[camera_id].device_version);
41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : camera_device_open
42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: static function to open a camera device by its ID
42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : int32_t type of status
43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              NO_ERROR  -- success
43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::camera_device_open(
43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    const struct hw_module_t *module, const char *id,
43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    struct hw_device_t **hw_device)
44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (module != &HAL_MODULE_INFO_SYM.common) {
44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid module. Trying to open %p, expect %p",
44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            module, &HAL_MODULE_INFO_SYM.common);
44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return INVALID_OPERATION;
44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (!id) {
44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        LOGE("Invalid camera id");
44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return BAD_VALUE;
45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if(gQCameraMuxer)
45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc =  gQCameraMuxer->camera_device_open(module, id, hw_device);
45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    else
45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        rc = gQCamera2Factory->cameraDeviceOpen(atoi(id), hw_device);
45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinstruct hw_module_methods_t QCamera2Factory::mModuleMethods = {
46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    open: QCamera2Factory::camera_device_open,
46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin};
46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
46566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : openLegacy
46666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
46766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to open older hal version implementation
46866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
46966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
47066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
47166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @halVersion: Based on camera_module_t.common.module_api_version
47266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hw_device : ptr to struct storing camera hardware device info
47366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
47466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
47566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
47666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
47766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::openLegacy(
47866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        int32_t cameraId, uint32_t halVersion, struct hw_device_t** hw_device)
47966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
48066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int rc = NO_ERROR;
48166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
48266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    LOGI("openLegacy halVersion: %d", halVersion);
48366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    //Assumption: all cameras can support legacy API version
48466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if (cameraId < 0 || cameraId >= gQCamera2Factory->getNumberOfCameras())
48566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        return -ENODEV;
48666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
48766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    switch(halVersion)
48866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    {
48966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        case CAMERA_DEVICE_API_VERSION_1_0:
49066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        {
49166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera2HardwareInterface *hw =
49266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                new QCamera2HardwareInterface((uint32_t)cameraId);
49366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (!hw) {
49466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                LOGE("Allocation of hardware interface failed");
49566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                return NO_MEMORY;
49666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
49766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = hw->openCamera(hw_device);
49866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if (rc != NO_ERROR) {
49966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                delete hw;
50066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
50166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
50266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
50366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        default:
50466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGE("Device API version: %d for camera id %d invalid",
50566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                 halVersion, cameraId);
50666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            return BAD_VALUE;
50766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
50866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
50966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
51066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
51166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
51266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
51366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : setTorchMode
51466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
51566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Attempt to turn on or off the torch mode of the flash unit.
51666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
51766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
51866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @camera_id : camera ID
51966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @on        : Indicates whether to turn the flash on or off
52066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
52166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : 0  -- success
52266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *              none-zero failure code
52366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
52466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinint QCamera2Factory::setTorchMode(const char* camera_id, bool on)
52566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
52666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int retVal(0);
52766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    long cameraIdLong(-1);
52866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int cameraIdInt(-1);
52966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    char* endPointer = NULL;
53066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    errno = 0;
53166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    QCameraFlash& flash = QCameraFlash::getInstance();
53266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cameraIdLong = strtol(camera_id, &endPointer, 10);
53466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
53566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    if ((errno == ERANGE) ||
53666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (cameraIdLong < 0) ||
53766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (cameraIdLong >= static_cast<long>(get_number_of_cameras())) ||
53866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (endPointer == camera_id) ||
53966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            (*endPointer != '\0')) {
54066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        retVal = -EINVAL;
54166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else if (on) {
54266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cameraIdInt = static_cast<int>(cameraIdLong);
54366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        retVal = flash.initFlash(cameraIdInt);
54466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
54566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (retVal == 0) {
54666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            retVal = flash.setFlashMode(cameraIdInt, on);
54766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((retVal == 0) && (mCallbacks != NULL)) {
54866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mCallbacks->torch_mode_status_change(mCallbacks,
54966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        camera_id,
55066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        TORCH_MODE_STATUS_AVAILABLE_ON);
55166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            } else if (retVal == -EALREADY) {
55266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                // Flash is already on, so treat this as a success.
55366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                retVal = 0;
55466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
55566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
55666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    } else {
55766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        cameraIdInt = static_cast<int>(cameraIdLong);
55866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        retVal = flash.setFlashMode(cameraIdInt, on);
55966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
56066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (retVal == 0) {
56166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            retVal = flash.deinitFlash(cameraIdInt);
56266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            if ((retVal == 0) && (mCallbacks != NULL)) {
56366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                mCallbacks->torch_mode_status_change(mCallbacks,
56466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        camera_id,
56566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin                        TORCH_MODE_STATUS_AVAILABLE_OFF);
56666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            }
56766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        } else if (retVal == -EALREADY) {
56866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            // Flash is already off, so treat this as a success.
56966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            retVal = 0;
57066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
57166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
57266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return retVal;
57466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
57566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
57666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*===========================================================================
57766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION   : isDualCamAvailable
57866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
57966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Function to check whether we have dual Camera HW available
58066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS :
58266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *   @hal3Enabled : HAL3 enable flag
58366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *
58466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN     : bool - true : have Dual Camera HW available
58566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *                           false : not have Dual Camera HW available
58666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/
58766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCamera2Factory::isDualCamAvailable(int hal3Enabled)
58866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{
58966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    bool rc = FALSE;
59066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    int i = 0;
59166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    camera_info info;
59266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    cam_sync_type_t cam_type = CAM_TYPE_MAIN;
59366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
59466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    for (i = 0; i < mNumOfCameras; i++) {
59566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if (!hal3Enabled) {
59666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            QCamera2HardwareInterface::getCapabilities(i, &info, &cam_type);
59766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
59866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
59966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        if(cam_type == CAM_TYPE_AUX) {
60066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            LOGH("Have Dual Camera HW Avaiable.");
60166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            rc = TRUE;
60266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin            break;
60366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin        }
60466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    }
60566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin    return rc;
60766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}
60866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
60966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera
61066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin
611