16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundataion. All rights reserved. 26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * Redistribution and use in source and binary forms, with or without 46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * modification, are permitted provided that the following conditions are 56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * met: 66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Redistributions of source code must retain the above copyright 76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * notice, this list of conditions and the following disclaimer. 86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Redistributions in binary form must reproduce the above 96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * copyright notice, this list of conditions and the following 106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * disclaimer in the documentation and/or other materials provided 116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * with the distribution. 126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * contributors may be used to endorse or promote products derived 146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * from this software without specific prior written permission. 156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev */ 296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <stdlib.h> 316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <unistd.h> 326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <fcntl.h> 336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <time.h> 346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <semaphore.h> 356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <pthread.h> 366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/types.h> 386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/stat.h> 396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <sys/wait.h> 406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <ui/DisplayInfo.h> 426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gui/Surface.h> 436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gui/SurfaceComposerClient.h> 446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <gui/ISurfaceComposer.h> 456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <system/camera.h> 476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <camera/Camera.h> 486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <camera/ICamera.h> 496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <camera/CameraParameters.h> 506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/RefBase.h> 526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <binder/IPCThreadState.h> 536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <binder/ProcessState.h> 546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <binder/IServiceManager.h> 556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cutils/properties.h> 566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <cutils/memory.h> 576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "qcamera_test.h" 596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera { 616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevusing namespace android; 636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint CameraContext::JpegIdx = 0; 656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : previewCallback 686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: preview callback preview mesages are enabled 706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @mem : preview buffer 736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::previewCallback(const sp<IMemory>& mem) 776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("PREVIEW Callback 0x%x", ( unsigned int ) mem->pointer()); 796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev uint8_t *ptr = (uint8_t*) mem->pointer(); 806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("PRV_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", 816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[0], 826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[1], 836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[2], 846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[3], 856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[4], 866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[5], 876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[6], 886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[7], 896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[8], 906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ptr[9]); 916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : saveFile 956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: helper function for saving buffers on filesystem 976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @mem : buffer to save to filesystem 1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @path: File path 1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::saveFile(const sp<IMemory>& mem, String8 path) 1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev unsigned char *buff = NULL; 1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int size; 1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int fd = -1; 1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mem == NULL) { 1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0655); 1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if(fd < 0) { 1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Unable to open file %s %s\n", path.string(), strerror(fd)); 1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return -errno; 1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev size = mem->size(); 1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (size <= 0) { 1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("IMemory object is of zero size\n"); 1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev close(fd); 1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev buff = (unsigned char *)mem->pointer(); 1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (!buff) { 1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Buffer pointer is invalid\n"); 1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev close(fd); 1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return BAD_VALUE; 1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( size != write(fd, buff, size) ) { 1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Bad Write error (%d)%s\n", 1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev errno, 1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev strerror(errno)); 1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev close(fd); 1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return INVALID_OPERATION; 1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("%s: buffer=%08X, size=%d stored at %s\n", 1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev __FUNCTION__, (int)buff, size, path.string()); 1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (fd >= 0) 1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev close(fd); 1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : notify 1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: notify callback 1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msgType : type of callback 1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ext1: extended parameters 1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @ext2: extended parameters 1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::notify(int32_t msgType, int32_t ext1, int32_t ext2) 1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Notify cb: %d %d %d\n", msgType, ext1, ext2); 1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( msgType & CAMERA_MSG_FOCUS ) { 1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("AutoFocus %s \n", 1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (ext1) ? "OK" : "FAIL"); 1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( msgType & CAMERA_MSG_SHUTTER ) { 1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Shutter done \n"); 1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( msgType & CAMERA_MSG_ERROR) { 1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Camera Test CAMERA_MSG_ERROR\n"); 1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopPreview(); 1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev closeCamera(); 1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : postData 1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: handles data callbacks 1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msgType : type of callback 1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @dataPtr: buffer data 1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @metadata: additional metadata where available 1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::postData(int32_t msgType, 1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev const sp<IMemory>& dataPtr, 1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_frame_metadata_t *metadata) 2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Data cb: %d\n", msgType); 2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( msgType & CAMERA_MSG_PREVIEW_FRAME ) { 2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewCallback(dataPtr); 2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( msgType & CAMERA_MSG_RAW_IMAGE ) { 2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("RAW done \n"); 2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (msgType & CAMERA_MSG_POSTVIEW_FRAME) { 2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Postview frame \n"); 2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) { 2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("JPEG done\n"); 2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev String8 jpegPath; 2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev jpegPath = jpegPath.format("/sdcard/img_%d.jpg", JpegIdx); 2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev saveFile(dataPtr, jpegPath); 2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev JpegIdx++; 2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( ( msgType & CAMERA_MSG_PREVIEW_METADATA ) && 2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ( NULL != metadata ) ) { 2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Face detected %d \n", metadata->number_of_faces); 2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : postDataTimestamp 2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: handles recording callbacks 2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @timestamp : timestamp of buffer 2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @msgType : type of buffer 2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @dataPtr : buffer data 2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::postDataTimestamp(nsecs_t timestamp, 2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t msgType, 2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev const sp<IMemory>& dataPtr) 2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Recording cb: %d %lld %p\n", msgType, timestamp, dataPtr.get()); 2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : printSupportedParams 2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: dump common supported parameters 2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid CameraContext::printSupportedParams() 2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Cameras: %s", 2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get("camera-indexes")? mParams.get("camera-indexes") : "NULL"); 2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Picture Sizes: %s", 2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES)? 2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES) : "NULL"); 2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Picture Formats: %s", 2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS)? 2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS) : "NULL"); 2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Preview Sizes: %s", 2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES)? 2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES) : "NULL"); 2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Preview Formats: %s", 2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS)? 2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS) : "NULL"); 2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Preview Frame Rates: %s", 2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES)? 2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES) : "NULL"); 2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Thumbnail Sizes: %s", 2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES)? 2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES) : "NULL"); 2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Whitebalance Modes: %s", 2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE)? 2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE) : "NULL"); 2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Effects: %s", 2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_EFFECTS)? 2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_EFFECTS) : "NULL"); 2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Scene Modes: %s", 2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES)? 2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES) : "NULL"); 2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Focus Modes: %s", 2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES)? 2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES) : "NULL"); 2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Antibanding Options: %s", 2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING)? 2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING) : "NULL"); 2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Flash Modes: %s", 2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES)? 2966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES) : "NULL"); 2976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported Focus Areas: %d", 2986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS)); 2996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tSupported FPS ranges : %s", 3006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE)? 3016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE) : "NULL"); 3026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\r\tFocus Distances: %s \n", 3036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_FOCUS_DISTANCES)? 3046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.get(CameraParameters::KEY_FOCUS_DISTANCES) : "NULL"); 3056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : createPreviewSurface 3096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: helper function for creating preview surfaces 3116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 3136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @width : preview width 3146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @height: preview height 3156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pixFormat : surface pixelformat 3166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 3186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 3196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 3206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::createPreviewSurface(unsigned int width, 3226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev unsigned int height, 3236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int32_t pixFormat) 3246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 3266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev DisplayInfo dinfo; 3276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay( 3286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ISurfaceComposer::eDisplayIdMain)); 3296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev SurfaceComposerClient::getDisplayInfo(display, &dinfo); 3306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev unsigned int previewWidth, previewHeight; 3316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( dinfo.w < width ) { 3336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewWidth = dinfo.w; 3346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 3356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewWidth = width; 3366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( dinfo.h < height ) { 3396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewHeight = dinfo.h; 3406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 3416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewHeight = height; 3426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mClient = new SurfaceComposerClient(); 3456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == mClient.get() ) { 3476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Unable to establish connection to Surface Composer \n"); 3486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_INIT; 3496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mSurfaceControl = mClient->createSurface(String8("QCamera_Test"), 3526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewWidth, 3536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewHeight, 3546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pixFormat, 3556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 0); 3566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == mSurfaceControl.get() ) { 3576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Unable to create preview surface \n"); 3586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_INIT; 3596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mPreviewSurface = mSurfaceControl->getSurface(); 3626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL != mPreviewSurface.get() ) { 3636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mClient->openGlobalTransaction(); 3646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret |= mSurfaceControl->setLayer(0x7fffffff); 3656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret |= mSurfaceControl->setPosition(0, 0); 3666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret |= mSurfaceControl->setSize(previewWidth, previewHeight); 3676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret |= mSurfaceControl->show(); 3686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mClient->closeGlobalTransaction(); 3696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NO_ERROR != ret ) { 3716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Preview surface configuration failed! \n"); 3726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 3746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = NO_INIT; 3756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 3786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 3796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 3816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : destroyPreviewSurface 3826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: closes previously open preview surface 3846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 3866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 3876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 3886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 3896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 3906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 3916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::destroyPreviewSurface() 3926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 3936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL != mPreviewSurface.get() ) { 3946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mPreviewSurface.clear(); 3956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 3966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 3976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL != mSurfaceControl.get() ) { 3986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mSurfaceControl->clear(); 3996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mSurfaceControl.clear(); 4006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL != mClient.get() ) { 4036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mClient->dispose(); 4046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mClient.clear(); 4056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 4086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~CameraContext 4126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: camera context destructor 4146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 4166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 4186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevCameraContext::~CameraContext() 4206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stopPreview(); 4226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev closeCamera(); 4236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : openCamera 4276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: connects to and initializes camera 4296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 4316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 4336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 4346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 4356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::openCamera() 4376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL != mCamera.get() ) { 4396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Camera already open! \n"); 4406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 4416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("openCamera(camera_index=%d)\n", mCameraIndex); 4446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera = Camera::connect(mCameraIndex); 4456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == mCamera.get() ) { 4476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Unable to connect to CameraService\n"); 4486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_INIT; 4496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams = mCamera->getParameters(); 4526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.getSupportedPreviewSizes(mSupportedPreviewSizes); 4536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.getSupportedPictureSizes(mSupportedPictureSizes); 4546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCurrentPictureSizeIdx = mSupportedPictureSizes.size() / 2; 4556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCurrentPreviewSizeIdx = mSupportedPreviewSizes.size() / 2; 4566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->setListener(this); 4586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mHardwareActive = true; 4596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 4616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getNumberOfCameras 4656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: returns the number of supported camera by the system 4676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 4696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : supported camera count 4716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint CameraContext::getNumberOfCameras() 4736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = -1; 4756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL != mCamera.get() ) { 4776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mCamera->getNumberOfCameras(); 4786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 4816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 4826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 4836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 4846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : closeCamera 4856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: closes a previously the initialized camera reference 4876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 4896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 4906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 4916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 4926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 4936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 4946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::closeCamera() 4956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 4966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == mCamera.get() ) { 4976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_INIT; 4986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 4996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->disconnect(); 5016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera.clear(); 5026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mHardwareActive = false; 5036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mPreviewRunning = false; 5046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 5066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : startPreview 5106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: starts camera preview 5126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 5146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 5166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::startPreview() 5206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int ret = NO_ERROR; 5226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int previewWidth, previewHeight; 5236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev Size currentPreviewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx); 5246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev Size currentPictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx); 5256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mPreviewRunning || !mHardwareActive ) { 5276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Preview already running or camera not active! \n"); 5286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_INIT; 5296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (mResizePreview) { 5326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewWidth = currentPreviewSize.width; 5336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewHeight = currentPreviewSize.height; 5346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = createPreviewSurface(previewWidth, 5366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewHeight, 5376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev HAL_PIXEL_FORMAT_YCrCb_420_SP); 5386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NO_ERROR != ret ) { 5396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Error while creating preview surface\n"); 5406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 5416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.setPreviewSize(previewWidth, previewHeight); 5446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.setPictureSize(currentPictureSize.width, currentPictureSize.height); 5456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret |= mCamera->setParameters(mParams.flatten()); 5476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret |= mCamera->setPreviewDisplay(mPreviewSurface); 5486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret |= mCamera->startPreview(); 5496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NO_ERROR != ret ) { 5506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Preview start failed! \n"); 5516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 5526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mPreviewRunning = true; 5556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mResizePreview = false; 5566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 5596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : autoFocus 5636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Triggers autofocus 5656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 5676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 5696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::autoFocus() 5736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev status_t ret = NO_ERROR; 5756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mPreviewRunning ) { 5776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mCamera->autoFocus(); 5786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 5816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 5826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 5836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 5846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : enablePreviewCallbacks 5856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Enables preview callback messages 5876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 5896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 5906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 5916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 5926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 5936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 5946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::enablePreviewCallbacks() 5956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 5966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mHardwareActive ) { 5976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); 5986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 5996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 6016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : takePicture 6056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: triggers image capture 6076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 6096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 6116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::takePicture() 6156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev status_t ret = NO_ERROR; 6176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mPreviewRunning ) { 6196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mCamera->takePicture(CAMERA_MSG_COMPRESSED_IMAGE|CAMERA_MSG_RAW_IMAGE); 6206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 6236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : stopPreview 6276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: stops camera preview 6296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 6316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 6336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::stopPreview() 6376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev status_t ret = NO_ERROR; 6396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mHardwareActive ) { 6416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->stopPreview(); 6426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = destroyPreviewSurface(); 6436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mPreviewRunning = false; 6466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mResizePreview = true; 6476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 6496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : resumePreview 6536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: resumes camera preview after image capture 6556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 6576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 6596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::resumePreview() 6636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev status_t ret = NO_ERROR; 6656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mHardwareActive ) { 6676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = mCamera->startPreview(); 6686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 6696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ret = NO_INIT; 6706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 6716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return ret; 6736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 6746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 6766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : nextPreviewSize 6776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Iterates through all supported preview sizes. 6796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 6816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 6826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 6836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 6846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 6856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 6866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::nextPreviewSize() 6876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 6886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mHardwareActive ) { 6896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCurrentPreviewSizeIdx += 1; 6906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCurrentPreviewSizeIdx %= mSupportedPreviewSizes.size(); 6916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev Size previewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx); 6926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.setPreviewSize(previewSize.width, 6936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewSize.height); 6946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mResizePreview = true; 6956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 6966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mPreviewRunning ) { 6976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->stopPreview(); 6986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->setParameters(mParams.flatten()); 6996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->startPreview(); 7006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 7016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->setParameters(mParams.flatten()); 7026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 7066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getCurrentPreviewSize 7106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: queries the currently configured preview size 7126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @previewSize : preview size currently configured 7156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 7176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 7186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 7196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::getCurrentPreviewSize(Size &previewSize) 7216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mHardwareActive ) { 7236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev previewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx); 7246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 7276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : nextPictureSize 7316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: Iterates through all supported picture sizes. 7336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 7356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 7376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 7386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 7396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::nextPictureSize() 7416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mHardwareActive ) { 7436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCurrentPictureSizeIdx += 1; 7446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCurrentPictureSizeIdx %= mSupportedPictureSizes.size(); 7456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev Size pictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx); 7466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mParams.setPictureSize(pictureSize.width, 7476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pictureSize.height); 7486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev mCamera->setParameters(mParams.flatten()); 7496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 7516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : getCurrentPictureSize 7556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: queries the currently configured picture size 7576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @pictureSize : picture size currently configured 7606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 7626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- success 7636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero failure code 7646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t CameraContext::getCurrentPictureSize(Size &pictureSize) 7666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( mHardwareActive ) { 7686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx); 7696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 7706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 7726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 7736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; //namespace qcamera ends here 7756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevusing namespace qcamera; 7776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 7796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : printMenu 7806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: prints the available camera options 7826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 7846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @currentCamera : camera context currently being used 7856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 7866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 7876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 7886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid printMenu(sp<CameraContext> currentCamera) 7896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 7906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev Size currentPictureSize, currentPreviewSize; 7916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev assert(currentCamera.get()); 7936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCamera->getCurrentPictureSize(currentPictureSize); 7956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCamera->getCurrentPreviewSize(currentPreviewSize); 7966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n"); 7986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 7996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" \n\nSTART / STOP / GENERAL SERVICES \n"); 8006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" -----------------------------\n"); 8016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Switch camera - Current Index: %d\n", 8026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev SWITCH_CAMERA_CMD, 8036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCamera->getCameraIndex()); 8046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Resume Preview after capture \n", 8056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev RESUME_PREVIEW_CMD); 8066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Quit \n", 8076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev EXIT_CMD); 8086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Camera Capability Dump", 8096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev DUMP_CAPS_CMD); 8106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" \n\n PREVIEW SUB MENU \n"); 8126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" -----------------------------\n"); 8136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Start Preview\n", 8146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev START_PREVIEW_CMD); 8156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Stop Preview\n", 8166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev STOP_PREVIEW_CMD); 8176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Preview size: %dx%d\n", 8186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CHANGE_PREVIEW_SIZE_CMD, 8196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentPreviewSize.width, 8206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentPreviewSize.height); 8216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Enable preview frames\n", 8226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ENABLE_PRV_CALLBACKS_CMD); 8236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Trigger autofocus \n", 8246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev AUTOFOCUS_CMD); 8256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" \n\n IMAGE CAPTURE SUB MENU \n"); 8276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" -----------------------------\n"); 8286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Take picture/Full Press\n", 8296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev TAKEPICTURE_CMD); 8306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" %c. Picture size: %dx%d\n", 8316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev CHANGE_PICTURE_SIZE_CMD, 8326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentPictureSize.width, 8336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentPictureSize.height); 8346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("\n"); 8366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf(" Choice: "); 8376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 8386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 8406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : functionalTest 8416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: queries and executes client supplied commands for testing a 8436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * particular camera. 8446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 8466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @availableCameras : List with all cameras supported 8476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 8486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : status_t type of status 8496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * NO_ERROR -- continue testing 8506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * none-zero -- quit test 8516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 8526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevstatus_t functionalTest(Vector< sp<CameraContext> > &availableCameras) 8536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 8546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int cmd; 8556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev status_t stat = NO_ERROR; 8566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev static int currentCameraIdx = 0; 8576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev assert(availableCameras.size()); 8596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sp<CameraContext> currentCamera = availableCameras.itemAt(currentCameraIdx); 8616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printMenu(currentCamera); 8626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cmd = getchar(); 8636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev switch (cmd) { 8656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case SWITCH_CAMERA_CMD: 8666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 8676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCameraIdx++; 8686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCameraIdx %= availableCameras.size(); 8696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCamera = availableCameras.itemAt(currentCameraIdx); 8706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 8726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case RESUME_PREVIEW_CMD: 8746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 8756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->resumePreview(); 8766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 8786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case START_PREVIEW_CMD: 8806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 8816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->startPreview(); 8826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 8846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case STOP_PREVIEW_CMD: 8866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 8876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->stopPreview(); 8886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 8906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CHANGE_PREVIEW_SIZE_CMD: 8926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 8936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->nextPreviewSize(); 8946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 8956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 8966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 8976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case CHANGE_PICTURE_SIZE_CMD: 8986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 8996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->nextPictureSize(); 9006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case DUMP_CAPS_CMD: 9046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 9056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCamera->printSupportedParams(); 9066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case AUTOFOCUS_CMD: 9106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 9116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->autoFocus(); 9126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case TAKEPICTURE_CMD: 9166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 9176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->takePicture(); 9186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case ENABLE_PRV_CALLBACKS_CMD: 9226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 9236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev stat = currentCamera->enablePreviewCallbacks(); 9246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev case EXIT_CMD: 9286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 9296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev currentCamera->stopPreview(); 9306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return -1; 9316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev default: 9366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev { 9376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Command status 0x%x \n", stat); 9416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_ERROR; 9436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 9446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint main() 9466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 9476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sp<ProcessState> proc(ProcessState::self()); 9486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev Vector< sp<CameraContext> > availableCameras; 9496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev sp<CameraContext> camera; 9506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev int i = 0; 9516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ProcessState::self()->startThreadPool(); 9536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev do { 9556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera = new CameraContext(i); 9566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == camera.get() ) { 9576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return NO_INIT; 9586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev status_t stat = camera->openCamera(); 9616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NO_ERROR != stat ) { 9626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev printf("Error encountered during camera open \n"); 9636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return stat; 9646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev availableCameras.add(camera); 9676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev i++; 9686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } while ( i < camera->getNumberOfCameras() ) ; 9696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev while ( true ) { 9716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NO_ERROR != functionalTest(availableCameras) ) { 9726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev break; 9736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev }; 9756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev for ( size_t j = 0 ; j < availableCameras.size() ; j++ ) { 9776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera = availableCameras.itemAt(j); 9786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera->closeCamera(); 9796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera.clear(); 9806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 9816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev availableCameras.clear(); 9836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 9846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return 0; 9856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 986