13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
23d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
33d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * Redistribution and use in source and binary forms, with or without
43d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * modification, are permitted provided that the following conditions are
53d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * met:
63d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions of source code must retain the above copyright
73d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       notice, this list of conditions and the following disclaimer.
83d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Redistributions in binary form must reproduce the above
93d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       copyright notice, this list of conditions and the following
103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       disclaimer in the documentation and/or other materials provided
113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       with the distribution.
123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *     * Neither the name of The Linux Foundation nor the names of its
133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       contributors may be used to endorse or promote products derived
143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *       from this software without specific prior written permission.
153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel */
293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define LOG_TAG "QCameraMuxer"
313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// System dependencies
333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <fcntl.h>
343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdio.h>
353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <stdlib.h>
363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Errors.h>
373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define STAT_H <SYSTEM_HEADER_PREFIX/stat.h>
383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include STAT_H
393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Camera dependencies
413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCameraMuxer.h"
423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera2HWI.h"
433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "QCamera3HWI.h"
443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelextern "C" {
463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h"
473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Muxer implementation */
503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace android;
513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera {
523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
533d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraMuxer *gMuxer = NULL;
543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel//Error Check Macros
563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CHECK_MUXER() \
573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!gMuxer) { \
583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error getting muxer "); \
593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return; \
603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } \
613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CHECK_MUXER_ERROR() \
633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!gMuxer) { \
643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error getting muxer "); \
653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENODEV; \
663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } \
673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CHECK_CAMERA(pCam) \
693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!pCam) { \
703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error getting physical camera"); \
713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return; \
723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } \
733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CHECK_CAMERA_ERROR(pCam) \
753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!pCam) { \
763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error getting physical camera"); \
773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENODEV; \
783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } \
793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CHECK_HWI(hwi) \
813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!hwi) { \
823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error !! HWI not found!!"); \
833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return; \
843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } \
853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define CHECK_HWI_ERROR(hwi) \
873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!hwi) { \
883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error !! HWI not found!!"); \
893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENODEV; \
903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } \
913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION         : getCameraMuxer
953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION     : Creates Camera Muxer if not created
973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS:
993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @pMuxer               : Pointer to retrieve Camera Muxer
1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @num_of_cameras  : Number of Physical Cameras on device
1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN             :  NONE
1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::getCameraMuxer(
1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCameraMuxer** pMuxer, uint32_t num_of_cameras)
1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    *pMuxer = NULL;
1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!gMuxer) {
1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        gMuxer = new QCameraMuxer(num_of_cameras);
1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    *pMuxer = gMuxer;
1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("gMuxer: %p ", gMuxer);
1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION         : QCameraMuxer
1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION     : QCameraMuxer Constructor
1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS:
1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @num_of_cameras  : Number of Physical Cameras on device
1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1263d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraMuxer::QCameraMuxer(uint32_t num_of_cameras)
1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    : mJpegClientHandle(0),
1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_pPhyCamera(NULL),
1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_pLogicalCamera(NULL),
1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_pCallbacks(NULL),
1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_bAuxCameraExposed(FALSE),
1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_nPhyCameras(num_of_cameras),
1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_nLogicalCameras(0),
1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_MainJpegQ(releaseJpegInfo, this),
1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_AuxJpegQ(releaseJpegInfo, this),
1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_pRelCamMpoJpeg(NULL),
1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_pMpoCallbackCookie(NULL),
1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_pJpegCallbackCookie(NULL),
1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_bDumpImages(FALSE),
1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_bMpoEnabled(TRUE),
1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_bFrameSyncEnabled(FALSE),
1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel      m_bRecordingHintInternallySet(FALSE)
1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    setupLogicalCameras();
1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&mJpegOps, 0, sizeof(mJpegOps));
1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&mJpegMpoOps, 0, sizeof(mJpegMpoOps));
1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&mGetMemoryCb, 0, sizeof(mGetMemoryCb));
1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(&mDataCb, 0, sizeof(mDataCb));
1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // initialize mutex for MPO composition
1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_init(&m_JpegLock, NULL);
1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // launch MPO composition thread
1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_ComposeMpoTh.launch(composeMpoRoutine, this);
1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Check whether dual camera images need to be dumped
1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char prop[PROPERTY_VALUE_MAX];
1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.dual.camera.dump", prop, "0");
1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bDumpImages = atoi(prop);
1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("dualCamera dump images:%d ", m_bDumpImages);
1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION         : ~QCameraMuxer
1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION     : QCameraMuxer Desctructor
1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
1683d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelQCameraMuxer::~QCameraMuxer() {
1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_pLogicalCamera) {
1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete [] m_pLogicalCamera;
1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pLogicalCamera = NULL;
1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_pPhyCamera) {
1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete [] m_pPhyCamera;
1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pPhyCamera = NULL;
1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL != m_pRelCamMpoJpeg) {
1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pRelCamMpoJpeg->release(m_pRelCamMpoJpeg);
1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pRelCamMpoJpeg = NULL;
1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // flush Jpeg Queues
1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_MainJpegQ.flush();
1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_AuxJpegQ.flush();
1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // stop and exit MPO composition thread
1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_ComposeMpoTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, TRUE, FALSE);
1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_ComposeMpoTh.exit();
1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_destroy(&m_JpegLock);
1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION         : get_number_of_cameras
1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION     : Provide number of Logical Cameras
1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN             :  Number of logical Cameras
1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::get_number_of_cameras()
2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return gMuxer->getNumberOfCameras();
2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION         : get_camera_info
2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION     : get logical camera info
2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS:
2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @camera_id     : Logical Camera ID
2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @info              : Logical Main Camera Info
2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              ENODEV : Camera not found
2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::get_camera_info(int camera_id, struct camera_info *info)
2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
2223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_sync_type_t type;
2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ((camera_id < 0) || (camera_id >= gMuxer->getNumberOfCameras())) {
2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Camera id %d not found!", camera_id);
2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENODEV;
2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(info) {
2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = gMuxer->getCameraInfo(camera_id, info, &type);
2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X, rc: %d", rc);
2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION         : set_callbacks
2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION     : Not Implemented
2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS:
2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @callbacks      : Camera Module Callbacks
2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::set_callbacks(__unused const camera_module_callbacks_t *callbacks)
2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Not implemented
2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : camera_device_open
2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: static function to open a camera device by its ID
2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @modue: hw module
2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @id : camera ID
2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @hw_device : ptr to struct storing camera hardware device info
2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              BAD_VALUE : Invalid Camera ID
2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::camera_device_open(
2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        __unused const struct hw_module_t *module, const char *id,
2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct hw_device_t **hw_device)
2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("id= %d",atoi(id));
2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!id) {
2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid camera id");
2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc =  gMuxer->cameraDeviceOpen(atoi(id), hw_device);
2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("id= %d, rc: %d", atoi(id), rc);
2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : open_legacy
2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: static function to open a camera device by its ID
2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @modue: hw module
2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @id : camera ID
2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @halVersion: hal version
2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @hw_device : ptr to struct storing camera hardware device info
2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              BAD_VALUE : Invalid Camera ID
2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::open_legacy(__unused const struct hw_module_t* module,
3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        const char* id, __unused uint32_t halVersion, struct hw_device_t** hw_device)
3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("id= %d", atoi(id));
3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!id) {
3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Invalid camera id");
3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc =  gMuxer->cameraDeviceOpen(atoi(id), hw_device);
3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("id= %d, rc: %d", atoi(id), rc);
3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : set_preview_window
3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Set Preview window for main camera
3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @window: Preview window ops
3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::set_preview_window(struct camera_device * device,
3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct preview_stream_ops *window)
3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Set preview window only for primary camera
3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->set_preview_window(pCam->dev, window);
3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error!! setting preview window");
3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : set_callBacks
3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Set Framework callbacks to notify various frame data asynchronously
3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @notify_cb: Notification callback
3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data_cb: data callback
3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data_cb_timestamp: data timestamp callback
3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @get_memory: callback to obtain memory
3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @user : userdata
3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None
3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::set_callBacks(struct camera_device * device,
3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_notify_callback notify_cb,
3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_data_callback data_cb,
3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_data_timestamp_callback data_cb_timestamp,
3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_request_memory get_memory,
3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *user)
3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Set callbacks to HWI
3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hwi->set_CallBacks(pCam->dev, notify_cb, data_cb, data_cb_timestamp,
3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                get_memory, user);
3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Set JPG callbacks
3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // sending the physical camera description with the Jpeg callback
3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // this will be retrieved in callbacks to get the cam instance
4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // delivering JPEGs
4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hwi->setJpegCallBacks(jpeg_data_callback, (void*)pCam);
4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = gMuxer->setMainJpegCallbackCookie((void*)(pCam));
4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if(rc != NO_ERROR) {
4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGW("Error setting Jpeg callback cookie");
4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Store callback in Muxer to send data callbacks
4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = gMuxer->setDataCallback(data_cb);
4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(rc != NO_ERROR) {
4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Error setting data callback");
4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // memory callback stored to allocate memory for MPO buffer
4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = gMuxer->setMemoryCallback(get_memory);
4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(rc != NO_ERROR) {
4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Error setting memory callback");
4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // actual user callback cookie is saved in Muxer
4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // this will be used to deliver final MPO callback to the framework
4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = gMuxer->setMpoCallbackCookie(user);
4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(rc != NO_ERROR) {
4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGW("Error setting mpo cookie");
4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : enable_msg_type
4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enable msg_type to send callbacks
4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @msg_type: callback Message type to be enabled
4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None
4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::enable_msg_type(struct camera_device * device, int32_t msg_type)
4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hwi->enable_msg_type(pCam->dev, msg_type);
4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : disable_msg_type
4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: disable msg_type to send callbacks
4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @msg_type: callback Message type to be disabled
4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None
4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::disable_msg_type(struct camera_device * device, int32_t msg_type)
4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hwi->disable_msg_type(pCam->dev, msg_type);
4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : msg_type_enabled
4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Check if message type enabled
4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @msg_type: message type
4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : true/false
4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::msg_type_enabled(struct camera_device * device, int32_t msg_type)
5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return hwi->msg_type_enabled(pCam->dev, msg_type);
5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return false;
5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : start_preview
5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Starts logical camera preview
5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::start_preview(struct camera_device * device)
5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // prepare preview first for all cameras
5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hwi->prepare_preview(pCam->dev);
5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error preparing preview !! ");
5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
5583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (cam->numCameras > 1) {
5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        uint sessionId = 0;
5613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Set up sync for camera sessions
5623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if(pCam->mode == CAM_MODE_PRIMARY) {
5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // bundle primary cam with all aux cameras
5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                for (uint32_t j = 0; j < cam->numCameras; j++) {
5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (j == cam->nPrimaryPhyCamIndex) {
5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        continue;
5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    sessionId = cam->sId[j];
5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGH("Related cam id: %d, server id: %d sync ON"
5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            " related session_id %d",
5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            cam->pId[i], cam->sId[i], sessionId);
579295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                    rc = hwi->bundleRelatedCameras(true);
5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (rc != NO_ERROR) {
5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        LOGE("Error Bundling physical cameras !! ");
5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        return rc;
5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (pCam->mode == CAM_MODE_SECONDARY) {
5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // bundle all aux cam with primary cams
5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                sessionId = cam->sId[cam->nPrimaryPhyCamIndex];
5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("Related cam id: %d, server id: %d sync ON"
5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        " related session_id %d",
5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        cam->pId[i], cam->sId[i], sessionId);
593295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                rc = hwi->bundleRelatedCameras(true);
5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("Error Bundling physical cameras !! ");
5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    return rc;
5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Remember Sync is ON
6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam->bSyncOn = true;
6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Start Preview for all cameras
6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hwi->start_preview(pCam->dev);
6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error starting preview !! ");
6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stop_preview
6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Stops logical camera preview
6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : None
6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::stop_preview(struct camera_device * device)
6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
6443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface::stop_preview(pCam->dev);
6473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Flush JPEG Queues. Nodes in Main and Aux JPEGQ are not valid after preview stopped.
6503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_MainJpegQ.flush();
6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_AuxJpegQ.flush();
6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH(" X");
6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : preview_enabled
6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Checks preview enabled
6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true/false
6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::preview_enabled(struct camera_device * device)
6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return hwi->preview_enabled(pCam->dev);
6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return false;
6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : store_meta_data_in_buffers
6903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Stores metadata in buffers
6923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
6943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
6953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @enable: Enable/disable metadata
6963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
6973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
6983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
6993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
7003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
7013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::store_meta_data_in_buffers(struct camera_device * device, int enable)
7023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
7033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
7043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
7053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
7063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
7073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
7083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
7093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
7113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
7123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
7133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
7153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
7163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hwi->store_meta_data_in_buffers(pCam->dev, enable);
7183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
7193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error storing metat data !! ");
7203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
7213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
7233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
7243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
7253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
7263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
7283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : start_recording
7293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Starts recording on camcorder
7313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
7333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
7343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
7353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
7363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
7373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
7383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
7393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::start_recording(struct camera_device * device)
7403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
7413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
7423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
7433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
7443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    bool previewRestartNeeded = false;
7453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
7463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
7473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
7483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // In cases where recording hint is not set, hwi->start_recording will
7503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // internally restart the preview.
7513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // To take the preview restart control in muxer,
7523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 1. call pre_start_recording first
7533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
7543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
7553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
7563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
7583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
7593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hwi->pre_start_recording(pCam->dev);
7613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
7623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error preparing recording start!! ");
7633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
7643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
7663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 2. Check if preview restart is needed. Check all cameras.
7683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
7693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
7703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
7713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
7733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
7743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (hwi->isPreviewRestartNeeded()) {
7763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            previewRestartNeeded = hwi->isPreviewRestartNeeded();
7773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
7783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (previewRestartNeeded) {
7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // 3. if preview restart needed. stop the preview first
7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
7893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->restart_stop_preview(pCam->dev);
7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in restart stop preview!! ");
7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        //4. Update the recording hint value to TRUE
7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->setRecordingHintValue(TRUE);
8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in setting recording hint value!! ");
8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            gMuxer->m_bRecordingHintInternallySet = TRUE;
8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // 5. start the preview
8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
8193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->restart_start_preview(pCam->dev);
8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in restart start preview!! ");
8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
8373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->start_recording(pCam->dev);
8383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
8393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error starting recording!! ");
8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : stop_recording
8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Stops recording on camcorder
8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : None
8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
8583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::stop_recording(struct camera_device * device)
8593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
8603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
8633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
8673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
8703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface::stop_recording(pCam->dev);
8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // If recording hint is set internally to TRUE,
8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // we need to set it to FALSE.
8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // preview restart is needed in between
8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (gMuxer->m_bRecordingHintInternallySet) {
8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // stop the preview first
8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA(pCam);
8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI(hwi);
8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
8943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->restart_stop_preview(pCam->dev);
8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in restart stop preview!! ");
8973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return;
8983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Update the recording hint value to FALSE
9023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
9033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
9043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA(pCam);
9053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
9073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI(hwi);
9083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->setRecordingHintValue(FALSE);
9103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
9113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in setting recording hint value!! ");
9123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return;
9133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
9143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            gMuxer->m_bRecordingHintInternallySet = FALSE;
9153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // start the preview
9183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
9193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
9203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA(pCam);
9213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
9233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI(hwi);
9243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->restart_start_preview(pCam->dev);
9263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
9273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in restart start preview!! ");
9283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return;
9293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
9303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
9323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
9333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : recording_enabled
9373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Checks for recording enabled
9393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
9413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
9423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true/false
9443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::recording_enabled(struct camera_device * device)
9463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
9483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
9493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
9513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
9523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
9543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
9553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
9563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
9583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
9593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
9613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return hwi->recording_enabled(pCam->dev);
9623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
9643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
9653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return false;
9663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
9673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
9693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : release_recording_frame
9703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Release the recording frame
9723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
9743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
9753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @opaque: Frame to be released
9763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
9773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  * RETURN     : None
9783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
9793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::release_recording_frame(struct camera_device * device,
9803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                const void *opaque)
9813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
9823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
9833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
9843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
9853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
9863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
9873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
9893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
9903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
9913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface::release_recording_frame(pCam->dev, opaque);
9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : auto_focus
10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Performs auto focus on camera
10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::auto_focus(struct camera_device * device)
10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
10183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
10193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
10203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
10213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
10223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
10233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
10253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
10263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
10273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
10293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
10303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Call auto focus on main camera
10313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
10323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = QCamera2HardwareInterface::auto_focus(pCam->dev);
10333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
10343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error auto focusing !! ");
10353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
10363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
10373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
10383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
10403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
10413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
10423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : cancel_auto_focus
10463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Cancels auto focus
10483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
10503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
10513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
10533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
10543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
10553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::cancel_auto_focus(struct camera_device * device)
10573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
10593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
10603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
10613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
10623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
10633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
10643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
10663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
10673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
10683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
10703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
10713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Cancel auto focus on primary camera
10723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
10733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = QCamera2HardwareInterface::cancel_auto_focus(pCam->dev);
10743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
10753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error cancelling auto focus !! ");
10763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
10773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
10783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : take_picture
10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Take snapshots on device
10893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
10913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
10923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::take_picture(struct camera_device * device)
10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
11013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
11023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    bool previewRestartNeeded = false;
11033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
11043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char prop[PROPERTY_VALUE_MAX];
11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.dual.camera.mpo", prop, "1");
11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_bMpoEnabled = atoi(prop);
11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // If only one Physical Camera included in Logical, disable MPO
11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int numOfAcitvePhyCam = 0;
11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->getActiveNumOfPhyCam(cam, numOfAcitvePhyCam);
11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (gMuxer->m_bMpoEnabled && numOfAcitvePhyCam <= 1) {
11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        gMuxer->m_bMpoEnabled = 0;
11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("dualCamera MPO Enabled:%d ", gMuxer->m_bMpoEnabled);
11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!gMuxer->mJpegClientHandle) {
11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // set up jpeg handles
11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, 0);
11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hwi->getJpegHandleInfo(&gMuxer->mJpegOps, &gMuxer->mJpegMpoOps,
11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                &gMuxer->mJpegClientHandle);
11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error retrieving jpeg handle!");
11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 1; i < cam->numCameras; i++) {
11343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->setJpegHandleInfo(&gMuxer->mJpegOps, &gMuxer->mJpegMpoOps,
11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    gMuxer->mJpegClientHandle);
11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error setting jpeg handle %d!", i);
11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // prepare snapshot for main camera
11503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
11523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
11553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
11563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
11583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->prepare_snapshot(pCam->dev);
11593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
11603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error preparing for snapshot !! ");
11613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
11623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // set Mpo composition for each session
11653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = hwi->setMpoComposition(gMuxer->m_bMpoEnabled);
11663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        //disable MPO if AOST features are enabled
11673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            gMuxer->m_bMpoEnabled = 0;
11693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // initialize Jpeg Queues
11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_MainJpegQ.init();
11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_AuxJpegQ.init();
11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_ComposeMpoTh.sendCmd(
11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CAMERA_CMD_TYPE_START_DATA_PROC, FALSE, FALSE);
11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // In cases where recording hint is set, preview is running,
11803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // hwi->take_picture will internally restart the preview.
11813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // To take the preview restart control in muxer,
11823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 1. call pre_take_picture first
11833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
11843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
11853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
11863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
11883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
11893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
11903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // no need to call pre_take_pic on Aux if not MPO (for AOST,liveshot...etc.)
11913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ( (gMuxer->m_bMpoEnabled == 1) || (pCam->mode == CAM_MODE_PRIMARY) ) {
11923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->pre_take_picture(pCam->dev);
11933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
11943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error preparing take_picture!! ");
11953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
11963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
11973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
11983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
11993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // 2. Check if preview restart is needed. Check all cameras.
12013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
12023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (hwi->isPreviewRestartNeeded()) {
12093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            previewRestartNeeded = hwi->isPreviewRestartNeeded();
12103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (previewRestartNeeded) {
12153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // 3. if preview restart needed. stop the preview first
12163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
12173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
12183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
12193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
12213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->restart_stop_preview(pCam->dev);
12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
12253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in restart stop preview!! ");
12263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
12273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        //4. Update the recording hint value to FALSE
12313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
12323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
12333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
12343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
12363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
12373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->setRecordingHintValue(FALSE);
12393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
12403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in setting recording hint value!! ");
12413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
12423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // 5. start the preview
12463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
12473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
12483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
12493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
12513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
12523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hwi->restart_start_preview(pCam->dev);
12543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
12553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error in restart start preview!! ");
12563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
12573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
12603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // As frame sync for dual cameras is enabled, the take picture call
12623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // for secondary camera is handled only till HAL level to init corresponding
12633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // pproc channel and update statemachine.
12643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // This call is forwarded to mm-camera-intf only for primary camera
12653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Primary camera should receive the take picture call after all secondary
12663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // camera statemachines are updated
12673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (int32_t i = cam->numCameras-1 ; i >= 0; i--) {
12683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
12693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
12703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
12723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
12733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // no need to call take_pic on Aux if not MPO (for AOST)
12753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if ( (gMuxer->m_bMpoEnabled == 1) || (pCam->mode == CAM_MODE_PRIMARY) ) {
12763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = QCamera2HardwareInterface::take_picture(pCam->dev);
12773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
12783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error taking picture !! ");
12793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
12803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
12813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
12823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
12833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
12843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
12853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
12863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
12873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
12883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : cancel_picture
12893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
12903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Cancel the take picture call
12913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
12923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
12933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
12943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
12953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
12963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
12973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
12983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
12993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::cancel_picture(struct camera_device * device)
13003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = QCamera2HardwareInterface::cancel_picture(pCam->dev);
13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error cancelling picture !! ");
13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_ComposeMpoTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC, FALSE, FALSE);
13223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // flush Jpeg Queues
13233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_MainJpegQ.flush();
13243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->m_AuxJpegQ.flush();
13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
13273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
13293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : set_parameters
13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Sets the parameters on camera
13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @parms : Parameters to be set on camera
13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
13433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::set_parameters(struct camera_device * device,
13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        const char *parms)
13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
13493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
13503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
13513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
13523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    bool needRestart = false;
13533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
13543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
13563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
13573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
13583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
13603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
13613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = QCamera2HardwareInterface::set_parameters(pCam->dev, parms);
13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
13643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error setting parameters !! ");
13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        needRestart |= hwi->getNeedRestart();
13693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (needRestart) {
13723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
13733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
13743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
13753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
13773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("stopping preview for cam %d", i);
13803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = QCamera2HardwareInterface::stop_after_set_params(pCam->dev);
13813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
13823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error stopping camera rc=%d!! ", rc);
13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
13853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
13863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
13873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
13903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
13913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("commiting parameters for cam %d", i);
13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = QCamera2HardwareInterface::commit_params(pCam->dev);
13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error committing parameters rc=%d!! ", rc);
13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (needRestart) {
14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pCam = gMuxer->getPhysicalCamera(cam, i);
14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_CAMERA_ERROR(pCam);
14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hwi = pCam->hwi;
14093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CHECK_HWI_ERROR(hwi);
14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("restarting preview for cam %d", i);
14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = QCamera2HardwareInterface::restart_after_set_params(pCam->dev);
14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Error restarting camera rc=%d!! ", rc);
14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
14163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH(" X");
14213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
14223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : get_parameters
14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Gets the parameters on camera
14283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
14313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : Parameter string or NULL
14333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelchar* QCameraMuxer::get_parameters(struct camera_device * device)
14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!gMuxer)
14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char* ret = NULL;
14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!cam) {
14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error getting logical camera");
14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (!pCam) {
14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error getting physical camera");
14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return NULL;
14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (!hwi) {
14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Allocation of hardware interface failed");
14583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return NULL;
14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Get only primary camera parameters
14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ret = QCamera2HardwareInterface::get_parameters(pCam->dev);
14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
14643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
14653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return ret;
14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
14723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : put_parameters
14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Puts parameters on camera
14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
14783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @parm : parameters
14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : None
14813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
14823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::put_parameters(struct camera_device * device, char *parm)
14833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
14863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (pCam->mode == CAM_MODE_PRIMARY) {
14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Parameters are not used in HWI and hence freed
14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface::put_parameters(pCam->dev, parm);
15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
15043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : send_command
15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Send command to camera
15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cmd : Command
15143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @arg1/arg2 : command arguments
15153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::send_command(struct camera_device * device,
15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t cmd, int32_t arg1, int32_t arg2)
15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
15253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
15263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
15273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
15323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
15333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
15353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
15363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = QCamera2HardwareInterface::send_command(pCam->dev, cmd, arg1, arg2);
15383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
15393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error sending command !! ");
15403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
15413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
15433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        switch (cmd) {
15453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef VANILLA_HAL
15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAMERA_CMD_LONGSHOT_ON:
15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            for (uint32_t i = 0; i < cam->numCameras; i++) {
15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pCam = gMuxer->getPhysicalCamera(cam, i);
15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                CHECK_CAMERA_ERROR(pCam);
15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                QCamera2HardwareInterface *hwi = pCam->hwi;
15523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                CHECK_HWI_ERROR(hwi);
15533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                rc = QCamera2HardwareInterface::send_command_restart(pCam->dev,
15553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        cmd, arg1, arg2);
15563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (rc != NO_ERROR) {
15573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGE("Error sending command restart !! ");
15583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    return rc;
15593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
15603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
15613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
15623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAMERA_CMD_LONGSHOT_OFF:
15633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            gMuxer->m_ComposeMpoTh.sendCmd(CAMERA_CMD_TYPE_STOP_DATA_PROC,
15643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    FALSE, FALSE);
15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // flush Jpeg Queues
15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            gMuxer->m_MainJpegQ.flush();
15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            gMuxer->m_AuxJpegQ.flush();
15683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
15693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif
15703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        default:
15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // do nothing
15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = NO_ERROR;
15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        break;
15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
15793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : release
15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Release the camera
15843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : None
15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::release(struct camera_device * device)
15913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
15923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
15933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
15943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
15953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
15963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA(cam);
15973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
15983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
15993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
16003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA(pCam);
16013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
16033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI(hwi);
16043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface::release(pCam->dev);
16063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
16113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : dump
16123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Dump the camera info
16143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
16163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
16173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @fd : fd
16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
16203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
16223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
16233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::dump(struct camera_device * device, int fd)
16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
16253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
16263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
16283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
16293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(device);
16303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
16313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
16333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
16343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
16353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        QCamera2HardwareInterface *hwi = pCam->hwi;
16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_HWI_ERROR(hwi);
16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = QCamera2HardwareInterface::dump(pCam->dev, fd);
16403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
16413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error dumping");
16423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return rc;
16433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
16443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
16453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
16483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : close_camera_device
16513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Close the camera
16533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
16553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @hw_dev : camera hardware device info
16563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
16573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
16583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
16593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::close_camera_device(hw_device_t *hw_dev)
16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    camera_device_t *cam_dev = (camera_device_t*)hw_dev;
16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = gMuxer->getLogicalCamera(cam_dev);
16693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(cam);
16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Unlink camera sessions
16723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (cam->bSyncOn) {
16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (cam->numCameras > 1) {
16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            uint sessionId = 0;
16753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // unbundle primary camera with all aux cameras
16763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            for (uint32_t i = 0; i < cam->numCameras; i++) {
16773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pCam = gMuxer->getPhysicalCamera(cam, i);
16783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                CHECK_CAMERA_ERROR(pCam);
16793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                QCamera2HardwareInterface *hwi = pCam->hwi;
16813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                CHECK_HWI_ERROR(hwi);
16823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if(pCam->mode == CAM_MODE_PRIMARY) {
16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // bundle primary cam with all aux cameras
16853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    for (uint32_t j = 0; j < cam->numCameras; j++) {
16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (j == cam->nPrimaryPhyCamIndex) {
16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            continue;
16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        sessionId = cam->sId[j];
16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        LOGH("Related cam id: %d, server id: %d sync OFF"
16913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                " related session_id %d",
16923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                cam->pId[i], cam->sId[i], sessionId);
1693295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                        rc = hwi->bundleRelatedCameras(false);
16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (rc != NO_ERROR) {
16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGE("Error Bundling physical cameras !! ");
16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            break;
16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (pCam->mode == CAM_MODE_SECONDARY) {
17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    // unbundle all aux cam with primary cams
17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    sessionId = cam->sId[cam->nPrimaryPhyCamIndex];
17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGH("Related cam id: %d, server id: %d sync OFF"
17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            " related session_id %d",
17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            cam->pId[i], cam->sId[i], sessionId);
1707295a0ca3b68291081f46052e545d5b0dec308710Thierry Strudel                    rc = hwi->bundleRelatedCameras(false);
17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    if (rc != NO_ERROR) {
17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        LOGE("Error Bundling physical cameras !! ");
17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        break;
17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam->bSyncOn = false;
17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Attempt to close all cameras regardless of unbundle results
17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (uint32_t i = 0; i < cam->numCameras; i++) {
17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam = gMuxer->getPhysicalCamera(cam, i);
17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        CHECK_CAMERA_ERROR(pCam);
17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hw_device_t *dev = (hw_device_t*)(pCam->dev);
17243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGH("hw device %x, hw %x", dev, pCam->hwi);
17253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = QCamera2HardwareInterface::close_camera_device(dev);
17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (rc != NO_ERROR) {
17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Error closing camera");
17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam->hwi = NULL;
17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pCam->dev = NULL;
17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Reset JPEG client handle
17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    gMuxer->setJpegHandle(0);
17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X, rc: %d", rc);
17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
17383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
17393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION         : setupLogicalCameras
17423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION     : Creates Camera Muxer if not created
17443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
17453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
17463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  : success
17473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              other: non-zero failure code
17483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::setupLogicalCameras()
17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
17523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char prop[PROPERTY_VALUE_MAX];
17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int i = 0;
17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int primaryType = CAM_TYPE_MAIN;
17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("[%d] E: rc = %d", rc);
17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Signifies whether AUX camera has to be exposed as physical camera
17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.aux.camera", prop, "0");
17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bAuxCameraExposed = atoi(prop);
17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Signifies whether AUX camera needs to be swapped
17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.auxcamera.swap", prop, "0");
17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int swapAux = atoi(prop);
17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (swapAux != 0) {
17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        primaryType = CAM_TYPE_AUX;
17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Check for number of camera present on device
17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_nPhyCameras || (m_nPhyCameras > MM_CAMERA_MAX_NUM_SENSORS)) {
17703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error!! Invalid number of cameras: %d",
17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 m_nPhyCameras);
17723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
17733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_pPhyCamera = new qcamera_physical_descriptor_t[m_nPhyCameras];
17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_pPhyCamera) {
17773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error allocating camera info buffer!!");
17783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_MEMORY;
17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
17803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(m_pPhyCamera, 0x00,
17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (m_nPhyCameras * sizeof(qcamera_physical_descriptor_t)));
17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t cameraId = 0;
17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_nLogicalCameras = 0;
17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Enumerate physical cameras and logical
17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0; i < m_nPhyCameras ; i++, cameraId++) {
17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_info *info = &m_pPhyCamera[i].cam_info;
17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        rc = QCamera2HardwareInterface::getCapabilities(cameraId,
17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                info, &m_pPhyCamera[i].type);
17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pPhyCamera[i].id = cameraId;
17913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pPhyCamera[i].device_version = CAMERA_DEVICE_API_VERSION_1_0;
17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pPhyCamera[i].mode = CAM_MODE_PRIMARY;
17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (!m_bAuxCameraExposed && (m_pPhyCamera[i].type != primaryType)) {
17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pPhyCamera[i].mode = CAM_MODE_SECONDARY;
17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGH("Camera ID: %d, Aux Camera, type: %d, facing: %d",
17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cameraId, m_pPhyCamera[i].type,
17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pPhyCamera[i].cam_info.facing);
17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        else {
18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_nLogicalCameras++;
18023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGH("Camera ID: %d, Main Camera, type: %d, facing: %d",
18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel cameraId, m_pPhyCamera[i].type,
18043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pPhyCamera[i].cam_info.facing);
18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_nLogicalCameras) {
18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // No Main camera detected, return from here
18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error !!!! detecting main camera!!");
18113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete [] m_pPhyCamera;
18123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pPhyCamera = NULL;
18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENODEV;
18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Allocate Logical Camera descriptors
18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_pLogicalCamera = new qcamera_logical_descriptor_t[m_nLogicalCameras];
18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_pLogicalCamera) {
18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error !!!! allocating camera info buffer!!");
18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        delete [] m_pPhyCamera;
18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pPhyCamera = NULL;
18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return  NO_MEMORY;
18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(m_pLogicalCamera, 0x00,
18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (m_nLogicalCameras * sizeof(qcamera_logical_descriptor_t)));
18253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Assign MAIN cameras for each logical camera
18263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int index = 0;
18273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0; i < m_nPhyCameras ; i++) {
18283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (m_pPhyCamera[i].mode == CAM_MODE_PRIMARY) {
18293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].nPrimaryPhyCamIndex = 0;
18303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].id = index;
18313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].device_version = CAMERA_DEVICE_API_VERSION_1_0;
18323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].pId[0] = i;
18333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].type[0] = CAM_TYPE_MAIN;
18343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].mode[0] = CAM_MODE_PRIMARY;
1835269c81ab7298bf38a22ab4376cf97297c0902b7eThierry Strudel            m_pLogicalCamera[index].sync_3a[0] = CAM_3A_SYNC_FOLLOW;
18363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].facing = m_pPhyCamera[i].cam_info.facing;
18373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[index].numCameras++;
18383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGH("Logical Main Camera ID: %d, facing: %d,"
18393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    "Phy Id: %d type: %d mode: %d",
18403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel m_pLogicalCamera[index].id,
18413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[index].facing,
18423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[index].pId[0],
18433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[index].type[0],
18443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[index].mode[0]);
18453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            index++;
18473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Now assign AUX cameras to logical camera
18503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0; i < m_nPhyCameras ; i++) {
18513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (m_pPhyCamera[i].mode == CAM_MODE_SECONDARY) {
18523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            for (int j = 0; j < m_nLogicalCameras; j++) {
18533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                int n = m_pLogicalCamera[j].numCameras;
18543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                ///@note n can only be 1 at this point
18553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if ((n < MAX_NUM_CAMERA_PER_BUNDLE) &&
18563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        (m_pLogicalCamera[j].facing ==
18573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_pPhyCamera[i].cam_info.facing)) {
18583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[j].pId[n] = i;
18593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[j].type[n] = CAM_TYPE_AUX;
18603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[j].mode[n] = CAM_MODE_SECONDARY;
1861269c81ab7298bf38a22ab4376cf97297c0902b7eThierry Strudel                    m_pLogicalCamera[j].sync_3a[n] = CAM_3A_SYNC_FOLLOW;
18623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[j].numCameras++;
18633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGH("Aux %d for Logical Camera ID: %d,"
18643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        "aux phy id:%d, type: %d mode: %d",
18653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel n, j, m_pLogicalCamera[j].pId[n],
18663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        m_pLogicalCamera[j].type[n], m_pLogicalCamera[j].mode[n]);
18673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
18683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
18693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    //Print logical and physical camera tables
18723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    for (i = 0; i < m_nLogicalCameras ; i++) {
18733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint8_t j = 0; j < m_pLogicalCamera[i].numCameras; j++) {
18743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGH("Logical Camera ID: %d, index: %d, "
18753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    "facing: %d, Phy Id: %d type: %d mode: %d",
18763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel i, j, m_pLogicalCamera[i].facing,
18773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[i].pId[j], m_pLogicalCamera[i].type[j],
18783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pLogicalCamera[i].mode[j]);
18793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
18803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
18813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("[%d] X: rc = %d", rc);
18823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
18833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
18843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
18863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getNumberOfCameras
18873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: query number of logical cameras detected
18893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
18903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : number of cameras detected
18913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
18923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::getNumberOfCameras()
18933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
18943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return m_nLogicalCameras;
18953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
18963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
18973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
18983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getCameraInfo
18993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: query camera information with its ID
19013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
19033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @camera_id : camera ID
19043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @info      : ptr to camera info struct
19053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
19073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
19083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
19093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::getCameraInfo(int camera_id,
19113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct camera_info *info, __unused cam_sync_type_t *p_cam_type)
19123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
19133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
19143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E, camera_id = %d", camera_id);
19153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_nLogicalCameras || (camera_id >= m_nLogicalCameras) ||
19173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            !info || (camera_id < 0)) {
19183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("m_nLogicalCameras: %d, camera id: %d",
19193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_nLogicalCameras, camera_id);
19203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENODEV;
19213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_pLogicalCamera || !m_pPhyCamera) {
19243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error! Cameras not initialized!");
19253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
19263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t phy_id =
19283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[camera_id].pId[
19293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pLogicalCamera[camera_id].nPrimaryPhyCamIndex];
19303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Call HAL3 getCamInfo to get the flash light info through static metatdata
19313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // regardless of HAL version
19323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    rc = QCamera3HardwareInterface::getCamInfo(phy_id, info);
19333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    info->device_version = CAMERA_DEVICE_API_VERSION_1_0; // Hardcode the HAL to HAL1
19343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
19353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
19363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
19373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
19393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setCallbacks
19403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: set callback functions to send asynchronous notifications to
19423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              frameworks.
19433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
19453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @callbacks : callback function pointer
19463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
19483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
19493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
19503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::setCallbacks(const camera_module_callbacks_t *callbacks)
19523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
19533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(callbacks) {
19543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pCallbacks = callbacks;
19553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
19563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
19573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_TYPE;
19583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
19603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
19623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setDataCallback
19633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: set data callback function for snapshots
19653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
19673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data_cb : callback function pointer
19683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
19703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
19713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
19723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::setDataCallback(camera_data_callback data_cb)
19743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
19753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(data_cb) {
19763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mDataCb = data_cb;
19773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
19783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
19793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_TYPE;
19803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
19813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
19823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
19833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
19843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setMemoryCallback
19853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: set get memory callback for memory allocations
19873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
19893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @get_memory : callback function pointer
19903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
19913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
19923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
19933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
19943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
19953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::setMemoryCallback(camera_request_memory get_memory)
19963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
19973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(get_memory) {
19983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        mGetMemoryCb = get_memory;
19993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
20003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
20013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_TYPE;
20023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
20033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setMpoCallbackCookie
20073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: set mpo callback cookie. will be used for sending final MPO callbacks
20093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                     to framework
20103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
20123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @mpoCbCookie : callback function pointer
20133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
20153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
20163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
20173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
20183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::setMpoCallbackCookie(void* mpoCbCookie)
20193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
20203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(mpoCbCookie) {
20213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pMpoCallbackCookie = mpoCbCookie;
20223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
20233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
20243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_TYPE;
20253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
20263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getMpoCallbackCookie
20303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: gets the mpo callback cookie. will be used for sending final MPO callbacks
20323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                     to framework
20333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :none
20353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :void ptr to the mpo callback cookie
20373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
20383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid* QCameraMuxer::getMpoCallbackCookie(void)
20393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
20403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return m_pMpoCallbackCookie;
20413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : setMainJpegCallbackCookie
20453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: set jpeg callback cookie.
20473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                     set to phy cam instance of the primary related cam instance
20483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
20503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @jpegCbCookie : ptr to jpeg cookie
20513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
20533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
20543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
20553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
20563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::setMainJpegCallbackCookie(void* jpegCbCookie)
20573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
20583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(jpegCbCookie) {
20593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pJpegCallbackCookie = jpegCbCookie;
20603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
20613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
20623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_TYPE;
20633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
20643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getMainJpegCallbackCookie
20683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: gets the jpeg callback cookie for primary related cam instance
20703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                     set to phy cam instance of the primary related cam instance
20713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :none
20733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :void ptr to the jpeg callback cookie
20753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
20763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid* QCameraMuxer::getMainJpegCallbackCookie(void)
20773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
20783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return m_pJpegCallbackCookie;
20793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
20803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
20813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
20823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : cameraDeviceOpen
20833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: open a camera device with its ID
20853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
20873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @camera_id : camera ID
20883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @hw_device : ptr to struct storing camera hardware device info
20893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
20903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
20913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
20923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
20933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
20943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint QCameraMuxer::cameraDeviceOpen(int camera_id,
20953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct hw_device_t **hw_device)
20963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
20973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int rc = NO_ERROR;
20983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t phyId = 0;
20993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_logical_descriptor_t *cam = NULL;
21003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (camera_id < 0 || camera_id >= m_nLogicalCameras) {
21023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Camera id %d not found!", camera_id);
21033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return -ENODEV;
21043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if ( NULL == m_pLogicalCamera) {
21073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Hal descriptor table is not initialized!");
21083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_INIT;
21093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    char prop[PROPERTY_VALUE_MAX];
21123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    property_get("persist.camera.dc.frame.sync", prop, "1");
21133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_bFrameSyncEnabled = atoi(prop);
21143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // Get logical camera
21163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam = &m_pLogicalCamera[camera_id];
21173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (m_pLogicalCamera[camera_id].device_version ==
21193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            CAMERA_DEVICE_API_VERSION_1_0) {
21203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // HW Dev Holders
21213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        hw_device_t *hw_dev[cam->numCameras];
21223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (m_pPhyCamera[cam->pId[0]].type != CAM_TYPE_MAIN) {
21243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Physical camera at index 0 is not main!");
21253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return UNKNOWN_ERROR;
21263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // Open all physical cameras
21293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        for (uint32_t i = 0; i < cam->numCameras; i++) {
21303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            phyId = cam->pId[i];
21313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            QCamera2HardwareInterface *hw =
21323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    new QCamera2HardwareInterface((uint32_t)phyId);
21333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (!hw) {
21343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("Allocation of hardware interface failed");
21353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return NO_MEMORY;
21363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
21373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            hw_dev[i] = NULL;
21383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // Make Camera HWI aware of its mode
21403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cam_sync_related_sensors_event_info_t info;
21413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            info.sync_control = CAM_SYNC_RELATED_SENSORS_ON;
21423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            info.mode = m_pPhyCamera[phyId].mode;
21433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            info.type = m_pPhyCamera[phyId].type;
21443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hw->setRelatedCamSyncInfo(&info);
21453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            hw->setFrameSyncEnabled(m_bFrameSyncEnabled);
21463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
21473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("setRelatedCamSyncInfo failed %d", rc);
21483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                delete hw;
21493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
21503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
21513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            rc = hw->openCamera(&hw_dev[i]);
21533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (rc != NO_ERROR) {
21543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                delete hw;
21553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return rc;
21563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
21573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            hw->getCameraSessionId(&m_pPhyCamera[phyId].camera_server_id);
21583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pPhyCamera[phyId].dev = reinterpret_cast<camera_device_t*>(hw_dev[i]);
21593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pPhyCamera[phyId].hwi = hw;
21603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            cam->sId[i] = m_pPhyCamera[phyId].camera_server_id;
21613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGH("camera id %d server id : %d hw device %x, hw %x",
21623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     phyId, cam->sId[i], hw_dev[i], hw);
21633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
21643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
21653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Device version for camera id %d invalid %d",
21663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 camera_id, m_pLogicalCamera[camera_id].device_version);
21673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return BAD_VALUE;
21683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam->dev.common.tag = HARDWARE_DEVICE_TAG;
21713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam->dev.common.version = HARDWARE_DEVICE_API_VERSION(1, 0);
21723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam->dev.common.close = close_camera_device;
21733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam->dev.ops = &mCameraMuxerOps;
21743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam->dev.priv = (void*)cam;
21753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    *hw_device = &cam->dev.common;
21763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return rc;
21773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
21783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
21813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getLogicalCamera
21823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Get logical camera descriptor
21843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
21863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @device : camera hardware device info
21873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
21883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : logical camera descriptor or NULL
21893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
21903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelqcamera_logical_descriptor_t* QCameraMuxer::getLogicalCamera(
21913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        struct camera_device * device)
21923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
21933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(device && device->priv){
21943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return (qcamera_logical_descriptor_t*)(device->priv);
21953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
21963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
21973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
21983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
21993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
22003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getPhysicalCamera
22013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Get physical camera descriptor
22033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
22053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @log_cam : Logical camera descriptor
22063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @index : physical camera index
22073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : physical camera descriptor or NULL
22093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
22103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelqcamera_physical_descriptor_t* QCameraMuxer::getPhysicalCamera(
22113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_logical_descriptor_t* log_cam, uint32_t index)
22123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(!log_cam){
22143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
22153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return &m_pPhyCamera[log_cam->pId[index]];
22173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
22203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : getActiveNumOfPhyCam
22213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Get active physical camera number in Logical Camera
22233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
22253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @log_cam :   Logical camera descriptor
22263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @numOfAcitvePhyCam :  number of active physical camera in Logical Camera.
22273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     :
22293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                NO_ERROR  : success
22303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                ENODEV : Camera not found
22313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                other: non-zero failure code
22323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
22333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::getActiveNumOfPhyCam(
22343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        qcamera_logical_descriptor_t* log_cam, int& numOfAcitvePhyCam)
22353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(log_cam);
22373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    numOfAcitvePhyCam = log_cam->numCameras;
22393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
22403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
22443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : sendEvtNotify
22453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: send event notify to HWI for error callbacks
22473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
22493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @msg_type: msg type to be sent
22503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @ext1    : optional extension1
22513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @ext2    : optional extension2
22523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
22543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
22553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
22563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
22573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::sendEvtNotify(int32_t msg_type, int32_t ext1,
22583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t ext2)
22593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
22613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
22633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    qcamera_physical_descriptor_t *pCam = NULL;
22653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pCam = (qcamera_physical_descriptor_t*)(gMuxer->getMainJpegCallbackCookie());
22663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_CAMERA_ERROR(pCam);
22683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCamera2HardwareInterface *hwi = pCam->hwi;
22703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_HWI_ERROR(hwi);
22713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
22733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return pCam->hwi->sendEvtNotify(msg_type, ext1, ext2);
22743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
22753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
22773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : composeMpo
22783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Composition of the 2 MPOs
22803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none
22823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @main_Jpeg: pointer to info to Main Jpeg
22833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @aux_Jpeg : pointer to info to Aux JPEG
22843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
22853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel  * RETURN : none
22863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
22873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::composeMpo(cam_compose_jpeg_info_t* main_Jpeg,
22883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        cam_compose_jpeg_info_t* aux_Jpeg)
22893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
22903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E Main Jpeg %p Aux Jpeg %p", main_Jpeg, aux_Jpeg);
22913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
22933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(main_Jpeg == NULL || aux_Jpeg == NULL) {
22943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("input buffers invalid, ret = NO_MEMORY");
22953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        gMuxer->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0);
22963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
22973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
22983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
22993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_lock(&m_JpegLock);
23003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    m_pRelCamMpoJpeg = mGetMemoryCb(-1, main_Jpeg->buffer->size +
23023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            aux_Jpeg->buffer->size, 1, m_pMpoCallbackCookie);
23033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL == m_pRelCamMpoJpeg) {
23043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("getMemory for mpo, ret = NO_MEMORY");
23053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        gMuxer->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0);
23063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pthread_mutex_unlock(&m_JpegLock);
23073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
23083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
23093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    // fill all structures to send for composition
23113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mm_jpeg_mpo_info_t mpo_compose_info;
23123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.num_of_images = 2;
23133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.primary_image.buf_filled_len = main_Jpeg->buffer->size;
23143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.primary_image.buf_vaddr =
23153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (uint8_t*)(main_Jpeg->buffer->data);
23163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.aux_images[0].buf_filled_len = aux_Jpeg->buffer->size;
23173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.aux_images[0].buf_vaddr =
23183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (uint8_t*)(aux_Jpeg->buffer->data);
23193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.output_buff.buf_vaddr =
23203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (uint8_t*)m_pRelCamMpoJpeg->data;
23213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.output_buff.buf_filled_len = 0;
23223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mpo_compose_info.output_buff_size = main_Jpeg->buffer->size +
23233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            aux_Jpeg->buffer->size;
23243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("MPO buffer size %d\n"
23263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            "expected size %d, mpo_compose_info.output_buff_size %d",
23273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             m_pRelCamMpoJpeg->size,
23283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            main_Jpeg->buffer->size + aux_Jpeg->buffer->size,
23293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mpo_compose_info.output_buff_size);
23303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("MPO primary buffer filled lengths\n"
23323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            "mpo_compose_info.primary_image.buf_filled_len %d\n"
23333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            "mpo_compose_info.primary_image.buf_vaddr %p",
23343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mpo_compose_info.primary_image.buf_filled_len,
23353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mpo_compose_info.primary_image.buf_vaddr);
23363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("MPO aux buffer filled lengths\n"
23383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            "mpo_compose_info.aux_images[0].buf_filled_len %d"
23393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            "mpo_compose_info.aux_images[0].buf_vaddr %p",
23403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mpo_compose_info.aux_images[0].buf_filled_len,
23413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mpo_compose_info.aux_images[0].buf_vaddr);
23423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(m_bDumpImages) {
23443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("Dumping Main Image for MPO");
23453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        char buf_main[QCAMERA_MAX_FILEPATH_LENGTH];
23463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(buf_main, 0, sizeof(buf_main));
23473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buf_main, sizeof(buf_main),
23483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                QCAMERA_DUMP_FRM_LOCATION "Main.jpg");
23493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int file_fd_main = open(buf_main, O_RDWR | O_CREAT, 0777);
23513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (file_fd_main >= 0) {
23523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ssize_t written_len = write(file_fd_main,
23533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mpo_compose_info.primary_image.buf_vaddr,
23543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mpo_compose_info.primary_image.buf_filled_len);
23553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            fchmod(file_fd_main, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
23563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("written number of bytes for main Image %zd\n",
23573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     written_len);
23583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            close(file_fd_main);
23593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
23603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGD("Dumping Aux Image for MPO");
23623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        char buf_aux[QCAMERA_MAX_FILEPATH_LENGTH];
23633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(buf_aux, 0, sizeof(buf_aux));
23643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buf_aux, sizeof(buf_aux),
23653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                QCAMERA_DUMP_FRM_LOCATION "Aux.jpg");
23663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int file_fd_aux = open(buf_aux, O_RDWR | O_CREAT, 0777);
23683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (file_fd_aux >= 0) {
23693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ssize_t written_len = write(file_fd_aux,
23703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mpo_compose_info.aux_images[0].buf_vaddr,
23713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    mpo_compose_info.aux_images[0].buf_filled_len);
23723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            fchmod(file_fd_aux, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
23733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("written number of bytes for Aux Image %zd\n",
23743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     written_len);
23753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            close(file_fd_aux);
23763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
23773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
23783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int32_t rc = mJpegMpoOps.compose_mpo(&mpo_compose_info);
23803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGD("Compose mpo returned %d", rc);
23813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(rc != NO_ERROR) {
23833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("ComposeMpo failed, ret = %d", rc);
23843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        gMuxer->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0);
23853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        pthread_mutex_unlock(&m_JpegLock);
23863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return;
23873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
23883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(m_bDumpImages) {
23903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        char buf_mpo[QCAMERA_MAX_FILEPATH_LENGTH];
23913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        memset(buf_mpo, 0, sizeof(buf_mpo));
23923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        snprintf(buf_mpo, sizeof(buf_mpo),
23933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                QCAMERA_DUMP_FRM_LOCATION "Composed.MPO");
23943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
23953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int file_fd_mpo = open(buf_mpo, O_RDWR | O_CREAT, 0777);
23963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (file_fd_mpo >= 0) {
23973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ssize_t written_len = write(file_fd_mpo,
23983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pRelCamMpoJpeg->data,
23993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pRelCamMpoJpeg->size);
24003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            fchmod(file_fd_mpo, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
24013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("written number of bytes for MPO Image %zd\n",
24023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                     written_len);
24033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            close(file_fd_mpo);
24043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
24063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    mDataCb(main_Jpeg->msg_type,
24083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pRelCamMpoJpeg,
24093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            main_Jpeg->index,
24103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            main_Jpeg->metadata,
24113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            m_pMpoCallbackCookie);
24123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (NULL != m_pRelCamMpoJpeg) {
24143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pRelCamMpoJpeg->release(m_pRelCamMpoJpeg);
24153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        m_pRelCamMpoJpeg = NULL;
24163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
24173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pthread_mutex_unlock(&m_JpegLock);
24193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
24203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
24213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
24223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
24243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : matchFrameId
24253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: function to match frame ids within queue nodes
24273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
24293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data: pointer to queue node to be matched for condition
24303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @user_data: caller can add more info here
24313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @match_data : value to be matched against
24323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true or false based on whether match was successful or not
24343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
24353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraMuxer::matchFrameId(void *data, __unused void *user_data,
24363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *match_data)
24373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
24383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
24393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!data || !match_data) {
24413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return false;
24423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
24433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_compose_jpeg_info_t * node = (cam_compose_jpeg_info_t *) data;
24453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_idx = *((uint32_t *) match_data);
24463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
24473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return node->frame_idx == frame_idx;
24483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
24493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
24513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : findPreviousJpegs
24523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Finds Jpegs in the queue with index less than delivered one
24543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
24563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data: pointer to queue node to be matched for condition
24573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @user_data: caller can add more info here
24583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @match_data : value to be matched against
24593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : true or false based on whether match was successful or not
24613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
24623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelbool QCameraMuxer::findPreviousJpegs(void *data, __unused void *user_data,
24633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *match_data)
24643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
24653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
24663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!data || !match_data) {
24683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return false;
24693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
24703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_compose_jpeg_info_t * node = (cam_compose_jpeg_info_t *) data;
24713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint32_t frame_idx = *((uint32_t *) match_data);
24723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
24733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return node->frame_idx < frame_idx;
24743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
24753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
24773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : releaseJpegInfo
24783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: callback function for the release of individual nodes
24803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *                     in the JPEG queues.
24813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
24833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data      : ptr to the data to be released
24843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @user_data : caller can add more info here
24853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
24863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : None
24873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
24883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::releaseJpegInfo(void *data, __unused void *user_data)
24893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
24903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
24913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
24923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_compose_jpeg_info_t *jpegInfo = (cam_compose_jpeg_info_t *)data;
24933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(jpegInfo && jpegInfo->release_cb) {
24943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (jpegInfo->release_data != NULL) {
24953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            jpegInfo->release_cb(jpegInfo->release_data,
24963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    jpegInfo->release_cookie,
24973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    NO_ERROR);
24983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
24993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
25003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
25013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
25023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
25043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : composeMpoRoutine
25053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: specialized thread for MPO composition
25073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
25093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data   : pointer to the thread owner
25103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
25113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : void* to thread
25123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
25133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid* QCameraMuxer::composeMpoRoutine(__unused void *data)
25143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
25153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
25163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!gMuxer) {
25173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Error getting muxer ");
25183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NULL;
25193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
25203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int running = 1;
25223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    int ret;
25233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    uint8_t is_active = FALSE;
25243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    QCameraCmdThread *cmdThread = &gMuxer->m_ComposeMpoTh;
25253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cmdThread->setName("CAM_ComposeMpo");
25263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    do {
25283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        do {
25293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            ret = cam_sem_wait(&cmdThread->cmd_sem);
25303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (ret != 0 && errno != EINVAL) {
25313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGE("cam_sem_wait error (%s)", strerror(errno));
25323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                return NULL;
25333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
25343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } while (ret != 0);
25353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        // we got notified about new cmd avail in cmd queue
25373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_cmd_type_t cmd = cmdThread->getCmd();
25383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        switch (cmd) {
25393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAMERA_CMD_TYPE_START_DATA_PROC:
25403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            {
25413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("start ComposeMpo processing");
25423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                is_active = TRUE;
25433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // signal cmd is completed
25453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_sem_post(&cmdThread->sync_sem);
25463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
25473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
25483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAMERA_CMD_TYPE_STOP_DATA_PROC:
25493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            {
25503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGH("stop ComposeMpo processing");
25513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                is_active = FALSE;
25523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
25533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // signal cmd is completed
25543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                cam_sem_post(&cmdThread->sync_sem);
25553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
25563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
25573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAMERA_CMD_TYPE_DO_NEXT_JOB:
25583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            {
25593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                if (is_active == TRUE) {
25603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    LOGH("Mpo Composition Requested");
25613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_compose_jpeg_info_t *main_jpeg_node = NULL;
25623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    cam_compose_jpeg_info_t *aux_jpeg_node = NULL;
25633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    bool foundMatch = false;
25643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    while (!gMuxer->m_MainJpegQ.isEmpty() &&
25653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            !gMuxer->m_AuxJpegQ.isEmpty()) {
25663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        main_jpeg_node = (cam_compose_jpeg_info_t *)
25673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                gMuxer->m_MainJpegQ.dequeue();
25683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (main_jpeg_node != NULL) {
25693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGD("main_jpeg_node found frame idx %d"
25703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    "ptr %p buffer_ptr %p buffer_size %d",
25713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                     main_jpeg_node->frame_idx,
25723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    main_jpeg_node,
25733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    main_jpeg_node->buffer->data,
25743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    main_jpeg_node->buffer->size);
25753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            // find matching aux node in Aux Jpeg Queue
25763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            aux_jpeg_node =
25773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    (cam_compose_jpeg_info_t *) gMuxer->
25783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                    m_AuxJpegQ.dequeue();
25793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            if (aux_jpeg_node != NULL) {
25803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                LOGD("aux_jpeg_node found frame idx %d"
25813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        "ptr %p buffer_ptr %p buffer_size %d",
25823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                         aux_jpeg_node->frame_idx,
25833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        aux_jpeg_node,
25843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        aux_jpeg_node->buffer->data,
25853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        aux_jpeg_node->buffer->size);
25863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                foundMatch = true;
25873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                // start MPO composition
25883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                gMuxer->composeMpo(main_jpeg_node,
25893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        aux_jpeg_node);
25903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            }
25913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
25923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (main_jpeg_node != NULL) {
25933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            if ( main_jpeg_node->release_cb ) {
25943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                main_jpeg_node->release_cb(
25953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        main_jpeg_node->release_data,
25963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        main_jpeg_node->release_cookie,
25973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        NO_ERROR);
25983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            }
25993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            free(main_jpeg_node);
26003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            main_jpeg_node = NULL;
26013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        } else {
26023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGH("Mpo Match not found");
26033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
26043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        if (aux_jpeg_node != NULL) {
26053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            if (aux_jpeg_node->release_cb) {
26063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                aux_jpeg_node->release_cb(
26073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        aux_jpeg_node->release_data,
26083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        aux_jpeg_node->release_cookie,
26093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                                        NO_ERROR);
26103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            }
26113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            free(aux_jpeg_node);
26123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            aux_jpeg_node = NULL;
26133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        } else {
26143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                            LOGH("Mpo Match not found");
26153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        }
26163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    }
26173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                }
26183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
26193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
26203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        case CAMERA_CMD_TYPE_EXIT:
26213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGH("ComposeMpo thread exit");
26223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            running = 0;
26233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
26243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        default:
26253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            break;
26263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } while (running);
26283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
26293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NULL;
26303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
26313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
26333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : jpeg_data_callback
26343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: JPEG data callback for snapshot
26363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
26383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @msg_type : callback msg type
26393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data : data ptr of the buffer
26403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @index : index of the frame
26413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @metadata : metadata associated with the buffer
26423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @user : callback cookie returned back to the user
26433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame_idx : frame index for matching frames
26443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @release_cb : callback function for releasing the data memory
26453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @release_cookie : cookie for the release callback function
26463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @release_data :pointer indicating what needs to be released
26473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none
26493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
26503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid QCameraMuxer::jpeg_data_callback(int32_t msg_type,
26513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           const camera_memory_t *data, unsigned int index,
26523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           camera_frame_metadata_t *metadata, void *user,
26533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           uint32_t frame_idx, camera_release_callback release_cb,
26543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel           void *release_cookie, void *release_data)
26553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
26563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E");
26573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER();
26583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(data != NULL) {
26603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGH("jpeg received: data %p size %d data ptr %p frameIdx %d",
26613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                 data, data->size, data->data, frame_idx);
26623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int rc = gMuxer->storeJpeg(((qcamera_physical_descriptor_t*)(user))->type,
26633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                msg_type, data, index, metadata, user, frame_idx, release_cb,
26643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                release_cookie, release_data);
26653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if(rc != NO_ERROR) {
26663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            gMuxer->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0);
26673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
26683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
26693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        gMuxer->sendEvtNotify(CAMERA_MSG_ERROR, UNKNOWN_ERROR, 0);
26703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
26713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
26723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return;
26733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
26743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
26753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*===========================================================================
26763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION   : storeJpeg
26773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Stores jpegs from multiple related cam instances into a common Queue
26793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS :
26813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @cam_type : indicates whether main or aux camera sent the Jpeg callback
26823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @msg_type : callback msg type
26833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @data : data ptr of the buffer
26843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @index : index of the frame
26853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @metadata : metadata associated with the buffer
26863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @user : callback cookie returned back to the user
26873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @frame_idx : frame index for matching frames
26883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @release_cb : callback function for releasing the data memory
26893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @release_cookie : cookie for the release callback function
26903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *   @release_data :pointer indicating what needs to be released
26913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *
26923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN     : int32_t type of status
26933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              NO_ERROR  -- success
26943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *              none-zero failure code
26953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/
26963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint32_t QCameraMuxer::storeJpeg(cam_sync_type_t cam_type,
26973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        int32_t msg_type, const camera_memory_t *data, unsigned int index,
26983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_frame_metadata_t *metadata, void *user,uint32_t frame_idx,
26993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        camera_release_callback release_cb, void *release_cookie,
27003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        void *release_data)
27013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{
27023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("E jpeg received: data %p size %d data ptr %p frameIdx %d",
27033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel             data, data->size, data->data, frame_idx);
27043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    CHECK_MUXER_ERROR();
27063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!m_bMpoEnabled) {
27083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (cam_type == CAM_TYPE_MAIN) {
27093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // send data callback only incase of main camera
27103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            // aux image is ignored and released back
27113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            mDataCb(msg_type,
27123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    data,
27133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    index,
27143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    metadata,
27153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                    m_pMpoCallbackCookie);
27163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (release_cb) {
27183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            release_cb(release_data, release_cookie, NO_ERROR);
27193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGH("X");
27213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_ERROR;
27223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    cam_compose_jpeg_info_t* pJpegFrame =
27253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            (cam_compose_jpeg_info_t*)malloc(sizeof(cam_compose_jpeg_info_t));
27263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if (!pJpegFrame) {
27273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        LOGE("Allocation failed for MPO nodes");
27283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        return NO_MEMORY;
27293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    memset(pJpegFrame, 0, sizeof(*pJpegFrame));
27313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->msg_type = msg_type;
27333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->buffer = const_cast<camera_memory_t*>(data);
27343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->index = index;
27353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->metadata = metadata;
27363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->user = user;
27373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->valid = true;
27383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->frame_idx = frame_idx;
27393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->release_cb = release_cb;
27403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->release_cookie = release_cookie;
27413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    pJpegFrame->release_data = release_data;
27423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    if(cam_type == CAM_TYPE_MAIN) {
27433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (m_MainJpegQ.enqueue((void *)pJpegFrame)) {
27443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Main FrameIdx %d", pJpegFrame->frame_idx);
27453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_MainJpegQ.getCurrentSize() > 0) {
27463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGD("Trigger Compose");
27473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_ComposeMpoTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE);
27483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
27493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
27503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Enqueue Failed for Main Jpeg Q");
27513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ( pJpegFrame->release_cb ) {
27523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // release other buffer also here
27533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pJpegFrame->release_cb(
27543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        pJpegFrame->release_data,
27553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        pJpegFrame->release_cookie,
27563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        NO_ERROR);
27573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
27583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            free(pJpegFrame);
27593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pJpegFrame = NULL;
27603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return NO_MEMORY;
27613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    } else {
27643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        if (m_AuxJpegQ.enqueue((void *)pJpegFrame)) {
27653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGD("Aux FrameIdx %d", pJpegFrame->frame_idx);
27663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if (m_AuxJpegQ.getCurrentSize() > 0) {
27673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                LOGD("Trigger Compose");
27683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                m_ComposeMpoTh.sendCmd(CAMERA_CMD_TYPE_DO_NEXT_JOB, FALSE, FALSE);
27693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
27703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        } else {
27713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            LOGE("Enqueue Failed for Aux Jpeg Q");
27723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            if ( pJpegFrame->release_cb ) {
27733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                // release other buffer also here
27743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                pJpegFrame->release_cb(
27753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        pJpegFrame->release_data,
27763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        pJpegFrame->release_cookie,
27773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel                        NO_ERROR);
27783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            }
27793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            free(pJpegFrame);
27803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            pJpegFrame = NULL;
27813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel            return NO_MEMORY;
27823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel        }
27833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    }
27843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    LOGH("X");
27853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    return NO_ERROR;
27873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}
27883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel// Muxer Ops
27913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelcamera_device_ops_t QCameraMuxer::mCameraMuxerOps = {
27923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .set_preview_window =        QCameraMuxer::set_preview_window,
27933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .set_callbacks =             QCameraMuxer::set_callBacks,
27943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .enable_msg_type =           QCameraMuxer::enable_msg_type,
27953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .disable_msg_type =          QCameraMuxer::disable_msg_type,
27963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .msg_type_enabled =          QCameraMuxer::msg_type_enabled,
27973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
27983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .start_preview =             QCameraMuxer::start_preview,
27993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .stop_preview =              QCameraMuxer::stop_preview,
28003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .preview_enabled =           QCameraMuxer::preview_enabled,
28013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .store_meta_data_in_buffers= QCameraMuxer::store_meta_data_in_buffers,
28023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .start_recording =           QCameraMuxer::start_recording,
28043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .stop_recording =            QCameraMuxer::stop_recording,
28053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .recording_enabled =         QCameraMuxer::recording_enabled,
28063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .release_recording_frame =   QCameraMuxer::release_recording_frame,
28073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .auto_focus =                QCameraMuxer::auto_focus,
28093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .cancel_auto_focus =         QCameraMuxer::cancel_auto_focus,
28103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .take_picture =              QCameraMuxer::take_picture,
28123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .cancel_picture =            QCameraMuxer::cancel_picture,
28133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .set_parameters =            QCameraMuxer::set_parameters,
28153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .get_parameters =            QCameraMuxer::get_parameters,
28163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .put_parameters =            QCameraMuxer::put_parameters,
28173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .send_command =              QCameraMuxer::send_command,
28183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .release =                   QCameraMuxer::release,
28203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel    .dump =                      QCameraMuxer::dump,
28213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel};
28223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel
28243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; // namespace android
2825