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