13d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/* Copyright (c) 2012-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#include <stdlib.h> 313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <unistd.h> 323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <fcntl.h> 333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <time.h> 343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <semaphore.h> 353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <pthread.h> 363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/types.h> 383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/stat.h> 393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <sys/wait.h> 403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <ui/DisplayInfo.h> 423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <gui/Surface.h> 433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <gui/SurfaceComposerClient.h> 443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <gui/ISurfaceComposer.h> 453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <system/camera.h> 473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <camera/Camera.h> 493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <camera/ICamera.h> 503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <camera/CameraParameters.h> 513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <media/mediarecorder.h> 523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/RefBase.h> 543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Mutex.h> 553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <utils/Condition.h> 563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <binder/IPCThreadState.h> 573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <binder/ProcessState.h> 583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <binder/IServiceManager.h> 593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <cutils/properties.h> 603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <cutils/memory.h> 613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <SkImageDecoder.h> 623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <SkImageEncoder.h> 633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <MediaCodec.h> 643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <OMX_IVCommon.h> 653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <foundation/AMessage.h> 663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <media/ICrypto.h> 673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <MediaMuxer.h> 683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <foundation/ABuffer.h> 693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <MediaErrors.h> 703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <gralloc_priv.h> 713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include <math.h> 723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "qcamera_test.h" 743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "cam_types.h" 753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#include "mm_camera_dbg.h" 763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#define VIDEO_BUF_ALLIGN(size, allign) \ 783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (((size) + (allign-1)) & (typeof(size))(~(allign-1))) 793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelnamespace qcamera { 813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace android; 833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint CameraContext::JpegIdx = 0; 853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint CameraContext::mPiPIdx = 0; 863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelconst char CameraContext::KEY_ZSL[] = "zsl"; 873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : previewCallback 903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: preview callback preview mesages are enabled 923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mem : preview buffer 953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::previewCallback(const sp<IMemory>& mem) 993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("PREVIEW Callback %p", mem->pointer()); 1013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint8_t *ptr = (uint8_t*) mem->pointer(); 1023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != ptr) { 1033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("PRV_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", 1043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[0], 1053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[1], 1063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[2], 1073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[3], 1083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[4], 1093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[5], 1103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[6], 1113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[7], 1123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[8], 1133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptr[9]); 1143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 1153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE(" no preview for NULL CB\n"); 1163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 1203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : useLock 1213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Mutex lock for CameraContext 1233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 1253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 1273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 1283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::useLock() 1293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(mLock); 1313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel while (mInUse) { 1323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCond.wait(mLock); 1333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInUse = true; 1353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 1383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : signalFinished 1393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Mutex unlock CameraContext 1413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 1433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 1453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 1463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::signalFinished() 1473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(mLock); 1493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInUse = false; 1503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCond.signal(); 1513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 1523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 1543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : saveFile 1553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function for saving buffers on filesystem 1573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 1593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mem : buffer to save to filesystem 1603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @path: File path 1613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 1623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 1633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 1643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 1653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 1663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::saveFile(const sp<IMemory>& mem, String8 path) 1673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 1683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *buff = NULL; 1693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t size; 1703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd = -1; 1713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mem == NULL) { 1733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 1743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0655); 1773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(fd < 0) { 1783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Unable to open file %s %s\n", path.string(), strerror(fd)); 1793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return -errno; 1803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size = (ssize_t)mem->size(); 1833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (size <= 0) { 1843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("IMemory object is of zero size\n"); 1853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(fd); 1863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 1873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buff = (unsigned char *)mem->pointer(); 1903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!buff) { 1913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Buffer pointer is invalid\n"); 1923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(fd); 1933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 1943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 1953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 1963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (size != write(fd, buff, (size_t)size)) { 1973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Bad Write error (%d)%s\n", errno, strerror(errno)); 1983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(fd); 1993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return INVALID_OPERATION; 2003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("%s: buffer=%p, size=%lld stored at %s\n", 2033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel __FUNCTION__, buff, (long long int) size, path.string()); 2043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (fd >= 0) 2063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(fd); 2073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 2093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 2123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : PiPCopyToOneFile 2133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Copy the smaller picture to the bigger one 2153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 2173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @bitmap0 : Decoded image buffer 0 2183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @bitmap1 : Decoded image buffer 1 2193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : decoded picture in picture in SkBitmap 2213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 2223d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelSkBitmap * CameraContext::PiPCopyToOneFile( 2233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkBitmap *bitmap0, SkBitmap *bitmap1) 2243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size0; 2263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size1; 2273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkBitmap *src; 2283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkBitmap *dst; 2293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned int dstOffset; 2303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned int srcOffset; 2313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (bitmap0 == NULL || bitmap1 == NULL) { 2333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE(" bitmap0 : %p, bitmap1 : %p\n", bitmap0, bitmap1); 2343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size0 = bitmap0->getSize(); 2383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (size0 <= 0) { 2393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Decoded image 0 is of zero size\n"); 2403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size1 = bitmap1->getSize(); 2443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (size1 <= 0) { 2453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Decoded image 1 is of zero size\n"); 2463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (size0 > size1) { 2503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dst = bitmap0; 2513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel src = bitmap1; 2523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (size1 > size0){ 2533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dst = bitmap1; 2543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel src = bitmap0; 2553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 2563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Picture size should be with different size!\n"); 2573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 2583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (unsigned int i = 0; i < (unsigned int)src->height(); i++) { 2613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i * (unsigned int)dst->width() * mfmtMultiplier; 2623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i * (unsigned int)src->width() * mfmtMultiplier; 2633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy(((unsigned char *)dst->getPixels()) + dstOffset, 2643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ((unsigned char *)src->getPixels()) + srcOffset, 2653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (unsigned int)src->width() * mfmtMultiplier); 2663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 2673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return dst; 2693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 2703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 2723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : decodeJPEG 2733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: decode jpeg input buffer. 2753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 2773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mem : buffer to decode 2783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @skBM : decoded buffer 2793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 2803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 2813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 2823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 2833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 2853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::decodeJPEG(const sp<IMemory>& mem, SkBitmap *skBM) 2863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 2873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef USE_SDK_20_OR_HIGHER 2883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkBitmap::Config prefConfig = SkBitmap::kARGB_8888_Config; 2893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const void *buff = NULL; 2903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size; 2913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buff = (const void *)mem->pointer(); 2933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size= mem->size(); 2943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 2953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch(prefConfig) { 2963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case SkBitmap::kARGB_8888_Config: 2973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 2983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 4; 2993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case SkBitmap::kARGB_4444_Config: 3033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 2; 3053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case SkBitmap::kRGB_565_Config: 3093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 2; 3113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case SkBitmap::kIndex8_Config: 3153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 4; 3173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case SkBitmap::kA8_Config: 3213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 4; 3233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 3273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 0; 3293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Decode format is not correct!\n"); 3303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (SkImageDecoder::DecodeMemory(buff, size, skBM, prefConfig, 3353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkImageDecoder::kDecodePixels_Mode) == false) { 3363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("%s():%d:: Failed during jpeg decode\n",__FUNCTION__,__LINE__); 3373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 3383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#else 3403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkColorType prefConfig = kRGBA_8888_SkColorType; 3413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const void *buff = NULL; 3423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size; 3433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buff = (const void *)mem->pointer(); 3453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size= mem->size(); 3463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch(prefConfig) { 3483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case kRGBA_8888_SkColorType: 3493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 4; 3513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case kBGRA_8888_SkColorType: 3553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 4; 3573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case kARGB_4444_SkColorType: 3613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 2; 3633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case kRGB_565_SkColorType: 3673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 2; 3693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case kIndex_8_SkColorType: 3733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 4; 3753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case kAlpha_8_SkColorType: 3793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 4; 3813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 3853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 3863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier = 0; 3873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Decode format is not correct!\n"); 3883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 3903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (SkImageDecoder::DecodeMemory(buff, size, skBM, prefConfig, 3933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkImageDecoder::kDecodePixels_Mode) == false) { 3943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("%s():%d:: Failed during jpeg decode\n",__FUNCTION__,__LINE__); 3953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 3963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 3973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 3983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 3993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 4003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 4013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 4033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : encodeJPEG 4043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: encode the decoded input buffer. 4063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 4083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @stream : SkWStream 4093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @bitmap : SkBitmap decoded image to encode 4103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @path : File path 4113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 4123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 4133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 4143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 4153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 4173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::encodeJPEG(SkWStream * stream, 4183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const SkBitmap *bitmap, String8 path) 4193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 4203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int qFactor = 100; 4213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skJpegEnc = SkImageEncoder::Create(SkImageEncoder::kJPEG_Type); 4233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!skJpegEnc) { 4243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE(" skJpegEnc is NULL\n"); 4253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 4263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (skJpegEnc->encodeStream(stream, *bitmap, qFactor) == false) { 4293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 4303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel FILE *fh = fopen(path.string(), "r+"); 4333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( !fh ) { 4343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Could not open file %s\n", path.string()); 4353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 4363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fseek(fh, 0, SEEK_END); 4393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t len = (size_t)ftell(fh); 4403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rewind(fh); 4413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if( !len ) { 4433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("File %s is empty !\n", path.string()); 4443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fclose(fh); 4453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 4463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *buff = (unsigned char*)malloc(len); 4493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!buff) { 4503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Cannot allocate memory for buffer reading!\n"); 4513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 4523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t readSize = fread(buff, 1, len, fh); 4553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (readSize != len) { 4563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Reading error\n"); 4573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 4583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = ReadSectionsFromBuffer(buff, len, READ_ALL); 4613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ret != NO_ERROR) { 4623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Cannot read sections from buffer\n"); 4633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardData(); 4643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardSections(); 4653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 4663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(buff); 4683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rewind(fh); 4693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char temp = 0xff; 4713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t writeSize = fwrite(&temp, sizeof(unsigned char), 1, fh); 4723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (1 != writeSize) { 4733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Writing error\n"); 4743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 4753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel temp = 0xd8; 4763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(&temp, sizeof(unsigned char), 1, fh); 4773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mSectionsRead; i++) { 4793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch((mSections[i].Type)) { 4803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case 0x123: 4823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(mSections[i].Data, sizeof(unsigned char), 4833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[i].Size, fh); 4843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 4853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case 0xe0: 4873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel temp = 0xff; 4883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(&temp, sizeof(unsigned char), 1, fh); 4893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel temp = 0xe1; 4903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(&temp, sizeof(unsigned char), 1, fh); 4913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(mJEXIFSection.Data, sizeof(unsigned char), 4923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJEXIFSection.Size, fh); 4933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 4943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 4953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 4963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel temp = 0xff; 4973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(&temp, sizeof(unsigned char), 1, fh); 4983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(&mSections[i].Type, sizeof(unsigned char), 1, fh); 4993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fwrite(mSections[i].Data, sizeof(unsigned char), 5003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[i].Size, fh); 5013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 5023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fseek(fh, 0, SEEK_END); 5053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel len = (size_t)ftell(fh); 5063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rewind(fh); 5073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("%s: buffer=%p, size=%zu stored at %s\n", 5083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel __FUNCTION__, bitmap->getPixels(), len, path.string()); 5093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mJEXIFSection.Data); 5113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardData(); 5123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardSections(); 5133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fclose(fh); 5143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = NO_ERROR; 5153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 5173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 5183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 5203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : readSectionsFromBuffer 5213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: read all jpeg sections of input buffer. 5233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 5253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @mem : buffer to read from Metadata Sections 5263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @buffer_size: buffer size 5273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @ReadMode: Read mode - all, jpeg or exif 5283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 5293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 5303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 5313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 5323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 5333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::ReadSectionsFromBuffer (unsigned char *buffer, 5343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t buffer_size, ReadMode_t ReadMode) 5353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 5363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int a; 5373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t pos = 0; 5383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int HaveCom = 0; 5393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsAllocated = 10; 5403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections = (Sections_t *)malloc(sizeof(Sections_t) * mSectionsAllocated); 5423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mSections) { 5433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" not enough memory\n"); 5443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 5453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!buffer) { 5483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Input buffer is null\n"); 5493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 5503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (buffer_size < 1) { 5533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Input size is 0\n"); 5543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 5553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel a = (int) buffer[pos++]; 5583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (a != 0xff || buffer[pos++] != M_SOI){ 5603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("No valid image\n"); 5613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 5623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for(;;){ 5653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t itemlen; 5663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int marker = 0; 5673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t ll,lh; 5683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char * Data; 5693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CheckSectionsAllocated(); 5713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // The call to CheckSectionsAllocated() may reallocate mSections 5733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // so need to check for NULL again. 5743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mSections == NULL) { 5753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" not enough memory\n"); 5763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 5773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (a = 0; a <= 16; a++){ 5803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel marker = buffer[pos++]; 5813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (marker != 0xff) break; 5823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (a >= 16){ 5843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fprintf(stderr,"too many padding bytes\n"); 5853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 5863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 5883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[mSectionsRead].Type = marker; 5903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Read the length of the section. 5923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel lh = buffer[pos++]; 5933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ll = buffer[pos++]; 5943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel itemlen = (lh << 8) | ll; 5963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 5973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (itemlen < 2) { 5983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("invalid marker"); 5993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 6003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[mSectionsRead].Size = itemlen; 6033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Data = (unsigned char *)malloc(itemlen); 6053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (Data == NULL) { 6063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("Could not allocate memory"); 6073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_MEMORY; 6083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[mSectionsRead].Data = Data; 6103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Store first two pre-read bytes. 6123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Data[0] = (unsigned char)lh; 6133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Data[1] = (unsigned char)ll; 6143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (pos+itemlen-2 > buffer_size) { 6163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("Premature end of file?"); 6173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 6183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy(Data+2, buffer+pos, itemlen-2); // Read the whole section. 6213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pos += itemlen-2; 6223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsRead += 1; 6243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch(marker){ 6263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOS: // stop before hitting compressed data 6283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // If reading entire image is requested, read the rest of the 6293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // data. 6303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ReadMode & READ_IMAGE){ 6313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size; 6323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Determine how much file is left. 6333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size = buffer_size - pos; 6343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (size < 1) { 6363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("could not read the rest of the image"); 6373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 6383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Data = (unsigned char *)malloc(size); 6403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (Data == NULL) { 6413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("%d: could not allocate data for entire " 6423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "image size: %d", __LINE__, size); 6433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 6443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy(Data, buffer+pos, size); 6473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CheckSectionsAllocated(); 6493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // The call to CheckSectionsAllocated() 6513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // may reallocate mSections 6523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // so need to check for NULL again. 6533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mSections == NULL) { 6543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" not enough memory\n"); 6553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 6563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[mSectionsRead].Data = Data; 6593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[mSectionsRead].Size = size; 6603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[mSectionsRead].Type = PSEUDO_IMAGE_MARKER; 6613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsRead ++; 6623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHaveAll = 1; 6633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 6653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_EOI: // in case it's a tables-only JPEG stream 6673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("No image in jpeg!\n"); 6683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 6693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_COM: // Comment section 6713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (HaveCom || ((ReadMode & READ_METADATA) == 0)){ 6723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Discard this section. 6733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mSections[--mSectionsRead].Data); 6743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 6763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_JFIF: 6783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Regular jpegs always have this tag, exif images have the 6793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // exif marker instead, althogh ACDsee will write images 6803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // with both markers. 6813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // this program will re-create this marker on absence of exif 6823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // marker. 6833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // hence no need to keep the copy from the file. 6843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ReadMode & READ_METADATA){ 6853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memcmp(Data+2, "JFIF", 4) == 0) { 6863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 6873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mSections[--mSectionsRead].Data); 6893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 6903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 6913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 6923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_EXIF: 6933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // There can be different section using the same marker. 6943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ReadMode & READ_METADATA){ 6953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (memcmp(Data+2, "Exif", 4) == 0){ 6963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 6973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel }else if (memcmp(Data+2, "http:", 5) == 0){ 6983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Change tag for internal purposes. 6993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections[mSectionsRead-1].Type = M_XMP; 7003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 7013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Oterwise, discard this section. 7043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mSections[--mSectionsRead].Data); 7053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 7063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_IPTC: 7083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ReadMode & READ_METADATA){ 7093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Note: We just store the IPTC section. 7103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Its relatively straightforward 7113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // and we don't act on any part of it, 7123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // so just display it at parse time. 7133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel }else{ 7143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mSections[--mSectionsRead].Data); 7153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 7173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF0: 7193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF1: 7203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF2: 7213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF3: 7223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF5: 7233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF6: 7243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF7: 7253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF9: 7263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF10: 7273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF11: 7283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF13: 7293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF14: 7303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case M_SOF15: 7313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 7323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 7333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Skip any other sections. 7343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 7353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 7383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 7393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 7413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : CheckSectionsAllocated 7423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Check allocated jpeg sections. 7443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 7463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 7483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 7503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::CheckSectionsAllocated(void) 7513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 7523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mSectionsRead > mSectionsAllocated){ 7533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("allocation screw up"); 7543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mSectionsRead >= mSectionsAllocated){ 7563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsAllocated += mSectionsAllocated +1; 7573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections = (Sections_t *)realloc(mSections, 7583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sizeof(Sections_t) * mSectionsAllocated); 7593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mSections == NULL){ 7603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("could not allocate data for entire image"); 7613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 7643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 7663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : findSection 7673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: find the desired Section of the JPEG buffer. 7693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 7713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @SectionType: Section type 7723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : return the found section 7743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 7763d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelCameraContext::Sections_t *CameraContext::FindSection(int SectionType) 7773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 7783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (unsigned int a = 0; a < mSectionsRead; a++) { 7793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mSections[a].Type == SectionType){ 7803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return &mSections[a]; 7813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 7833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Could not be found. 7843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 7853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 7863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 7893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : DiscardData 7903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: DiscardData 7923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 7943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 7953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 7963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 7973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 7983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::DiscardData() 7993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (unsigned int a = 0; a < mSectionsRead; a++) { 8013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mSections[a].Data); 8023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsRead = 0; 8053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHaveAll = 0; 8063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : DiscardSections 8103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Discard allocated sections 8123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 8143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 8163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::DiscardSections() 8193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mSections); 8213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsAllocated = 0; 8223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHaveAll = 0; 8233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : notify 8273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: notify callback 8293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 8313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @msgType : type of callback 8323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @ext1: extended parameters 8333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @ext2: extended parameters 8343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 8363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::notify(int32_t msgType, int32_t ext1, int32_t ext2) 8383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Notify cb: %d %d %d\n", msgType, ext1, ext2); 8403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (( msgType & CAMERA_MSG_PREVIEW_FRAME) 8423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef VANILLA_HAL 8433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel && (ext1 == CAMERA_FRAME_DATA_FD) 8443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 8453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ) 8463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 8473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd = dup(ext2); 8483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("notify Preview Frame fd: %d dup fd: %d\n", ext2, fd); 8493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(fd); 8503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( msgType & CAMERA_MSG_FOCUS ) { 8533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("AutoFocus %s \n", 8543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (ext1) ? "OK" : "FAIL"); 8553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( msgType & CAMERA_MSG_SHUTTER ) { 8583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Shutter done \n"); 8593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( msgType & CAMERA_MSG_ERROR) { 8623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Camera Test CAMERA_MSG_ERROR\n"); 8633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stopPreview(); 8643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel closeCamera(); 8653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 8673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 8693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : postData 8703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: handles data callbacks 8723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 8743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @msgType : type of callback 8753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataPtr: buffer data 8763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @metadata: additional metadata where available 8773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 8783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 8793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 8803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::postData(int32_t msgType, 8813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const sp<IMemory>& dataPtr, 8823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera_frame_metadata_t *metadata) 8833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 8843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->PiPLock(); 8853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size currentPictureSize = mSupportedPictureSizes.itemAt( 8863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPictureSizeIdx); 8873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned char *buff = NULL; 8883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size; 8893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = 0; 8903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&mJEXIFSection, 0, sizeof(mJEXIFSection)), 8923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Data cb: %d\n", msgType); 8943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( msgType & CAMERA_MSG_PREVIEW_FRAME ) { 8963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewCallback(dataPtr); 8973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 8983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 8993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( msgType & CAMERA_MSG_RAW_IMAGE ) { 9003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("RAW done \n"); 9013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (msgType & CAMERA_MSG_POSTVIEW_FRAME) { 9043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Postview frame \n"); 9053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) { 9083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel String8 jpegPath; 9093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel jpegPath = jpegPath.format(QCAMERA_DUMP_FRM_LOCATION"img_%d.jpg", 9103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel JpegIdx); 9113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mPiPCapture) { 9123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Normal capture case 9133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("JPEG done\n"); 9143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel saveFile(dataPtr, jpegPath); 9153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel JpegIdx++; 9163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // PiP capture case 9183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SkFILEWStream *wStream; 9193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = decodeJPEG(dataPtr, &skBMtmp); 9203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NO_ERROR != ret) { 9213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Error in decoding JPEG!\n"); 9223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->PiPUnlock(); 9233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mWidthTmp = currentPictureSize.width; 9273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHeightTmp = currentPictureSize.height; 9283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel PiPPtrTmp = dataPtr; 9293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // If there are two jpeg buffers 9303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mPiPIdx == 1) { 9313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("PiP done\n"); 9323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Find the the capture with higher width and height and read 9343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // its jpeg sections 9353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((mInterpr->camera[0]->mWidthTmp * mInterpr->camera[0]->mHeightTmp) > 9363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mInterpr->camera[1]->mWidthTmp * mInterpr->camera[1]->mHeightTmp)) { 9373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buff = (unsigned char *)PiPPtrTmp->pointer(); 9383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size= PiPPtrTmp->size(); 9393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if ((mInterpr->camera[0]->mWidthTmp * mInterpr->camera[0]->mHeightTmp) < 9403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (mInterpr->camera[1]->mWidthTmp * mInterpr->camera[1]->mHeightTmp)) { 9413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel buff = (unsigned char *)PiPPtrTmp->pointer(); 9423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size= PiPPtrTmp->size(); 9433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 9443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Cannot take PiP. Images are with the same width" 9453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel " and height size!!!\n"); 9463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->PiPUnlock(); 9473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (buff != NULL && size != 0) { 9513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = ReadSectionsFromBuffer(buff, size, READ_ALL); 9523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ret != NO_ERROR) { 9533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Cannot read sections from buffer\n"); 9543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardData(); 9553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardSections(); 9563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->PiPUnlock(); 9573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJEXIFTmp = FindSection(M_EXIF); 9613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mJEXIFTmp) { 9623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("skBMDec is null\n"); 9633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardData(); 9643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardSections(); 9653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJEXIFSection = *mJEXIFTmp; 9683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJEXIFSection.Data = (unsigned char*)malloc(mJEXIFTmp->Size); 9693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mJEXIFSection.Data) { 9703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE(" Not enough memory\n"); 9713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardData(); 9723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardSections(); 9733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy(mJEXIFSection.Data, 9763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJEXIFTmp->Data, mJEXIFTmp->Size); 9773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardData(); 9783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DiscardSections(); 9793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel wStream = new SkFILEWStream(jpegPath.string()); 9813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel skBMDec = PiPCopyToOneFile(&mInterpr->camera[0]->skBMtmp, 9823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &mInterpr->camera[1]->skBMtmp); 9833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!skBMDec) { 9843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGE("skBMDec is null\n"); 9853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete wStream; 9863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 9893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (encodeJPEG(wStream, skBMDec, jpegPath) != false) { 9903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("%s():%d:: Failed during jpeg encode\n", 9913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel __FUNCTION__,__LINE__); 9923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->PiPUnlock(); 9933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 9943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPIdx = 0; 9963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel JpegIdx++; 9973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete wStream; 9983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 9993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 10003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPIdx++; 10013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel disablePiPCapture(); 10033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((msgType & CAMERA_MSG_PREVIEW_METADATA) && (NULL != metadata)) { 10073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Face detected %d \n", metadata->number_of_faces); 10083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->PiPUnlock(); 10103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 10123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 10143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : postDataTimestamp 10153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: handles recording callbacks 10173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 10193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @timestamp : timestamp of buffer 10203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @msgType : type of buffer 10213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataPtr : buffer data 10223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 10243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 10253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::postDataTimestamp(nsecs_t timestamp, 10263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t msgType, 10273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const sp<IMemory>& dataPtr) 10283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 10293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Recording cb: %d %lld %p\n", 10303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel msgType, (long long int)timestamp, dataPtr.get()); 10313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 10323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 10343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : dataCallbackTimestamp 10353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: handles recording callbacks. Used for ViV recording 10373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 10393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @timestamp : timestamp of buffer 10403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @msgType : type of buffer 10413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @dataPtr : buffer data 10423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 10433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 10443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 10453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::dataCallbackTimestamp(nsecs_t timestamp, 10463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int32_t msgType, 10473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const sp<IMemory>& dataPtr) 10483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 10493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->ViVLock(); 10503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Not needed check. Just avoiding warnings of not used variables. 10513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (timestamp > 0) 10523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel timestamp = 0; 10533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Not needed check. Just avoiding warnings of not used variables. 10543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (msgType > 0) 10553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel msgType = 0; 10563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t i = 0; 10573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * srcBuff = NULL; 10583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel void * dstBuff = NULL; 10593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t srcYStride = 0, dstYStride = 0; 10613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t srcUVStride = 0, dstUVStride = 0; 10623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t srcYScanLines = 0, dstYScanLines = 0; 10633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t srcUVScanLines = 0, dstUVScanLines = 0; 10643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t srcOffset = 0, dstOffset = 0; 10653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t srcBaseOffset = 0; 10663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t dstBaseOffset = 0; 10673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size currentVideoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx); 10683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t err = NO_ERROR; 10693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ANativeWindowBuffer* anb = NULL; 10703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstBuff = (void *) dataPtr->pointer(); 10723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL == dstBuff) { 10733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Cannot access destination buffer!!!\n"); 10743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->ViVUnlock(); 10753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 10763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 10773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mCameraIndex == mInterpr->mViVVid.sourceCameraID) { 10793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcYStride = calcStride(currentVideoSize.width); 10803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcUVStride = calcStride(currentVideoSize.width); 10813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcYScanLines = calcYScanLines(currentVideoSize.height); 10823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcUVScanLines = calcUVScanLines(currentVideoSize.height); 10833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.srcWidth = (size_t)currentVideoSize.width; 10843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.srcHeight = (size_t)currentVideoSize.height; 10853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.YStride = srcYStride; 10883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.UVStride = srcUVStride; 10893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.YScanLines = srcYScanLines; 10903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.UVScanLines = srcUVScanLines; 10913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy( mInterpr->mViVBuff.buff, dstBuff, 10933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.buffSize); 10943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 10953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.isBuffValid = true; 10963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (mCameraIndex == mInterpr->mViVVid.destinationCameraID) { 10973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(mInterpr->mViVVid.isBuffValid == true) { 10983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstYStride = calcStride(currentVideoSize.width); 10993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstUVStride = calcStride(currentVideoSize.width); 11003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstYScanLines = calcYScanLines(currentVideoSize.height); 11013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstUVScanLines = calcUVScanLines(currentVideoSize.height); 11023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcYStride = mInterpr->mViVBuff.YStride; 11043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcUVStride = mInterpr->mViVBuff.UVStride; 11053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcYScanLines = mInterpr->mViVBuff.YScanLines; 11063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcUVScanLines = mInterpr->mViVBuff.UVScanLines; 11073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < mInterpr->mViVBuff.srcHeight; i++) { 11103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i*srcYStride; 11113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i*dstYStride; 11123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) dstBuff + dstOffset, 11133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (unsigned char *) mInterpr->mViVBuff.buff + 11143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset, mInterpr->mViVBuff.srcWidth); 11153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcBaseOffset = srcYStride * srcYScanLines; 11173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstBaseOffset = dstYStride * dstYScanLines; 11183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < mInterpr->mViVBuff.srcHeight / 2; i++) { 11193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i*srcUVStride + srcBaseOffset; 11203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i*dstUVStride + dstBaseOffset; 11213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) dstBuff + dstOffset, 11223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (unsigned char *) mInterpr->mViVBuff.buff + 11233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset, mInterpr->mViVBuff.srcWidth); 11243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = native_window_dequeue_buffer_and_wait( 11273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.ANW.get(),&anb); 11283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err != NO_ERROR) { 11293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Cannot dequeue anb for sensor %d!!!\n", mCameraIndex); 11303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->ViVUnlock(); 11313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.graphBuf = new GraphicBuffer(anb, false); 11343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(NULL == mInterpr->mViVVid.graphBuf.get()) { 11353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Invalid Graphic buffer\n"); 11363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->ViVUnlock(); 11373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mInterpr->mViVVid.graphBuf->lock( 11403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel GRALLOC_USAGE_SW_WRITE_OFTEN, 11413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (void**)(&mInterpr->mViVVid.mappedBuff)); 11423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err != NO_ERROR) { 11433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Graphic buffer could not be locked %d!!!\n", err); 11443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->ViVUnlock(); 11453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 11463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcYStride = dstYStride; 11493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcUVStride = dstUVStride; 11503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcYScanLines = dstYScanLines; 11513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcUVScanLines = dstUVScanLines; 11523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcBuff = dstBuff; 11533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < (size_t)currentVideoSize.height; i++) { 11553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i*srcYStride; 11563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i*dstYStride; 11573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) mInterpr->mViVVid.mappedBuff + 11583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset, (unsigned char *) srcBuff + 11593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset, (size_t)currentVideoSize.width); 11603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcBaseOffset = srcYStride * srcYScanLines; 11633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstBaseOffset = dstUVStride * (size_t)currentVideoSize.height; 11643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < (size_t)currentVideoSize.height / 2; i++) { 11663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset = i*srcUVStride + srcBaseOffset; 11673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset = i*dstUVStride + dstBaseOffset; 11683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memcpy((unsigned char *) mInterpr->mViVVid.mappedBuff + 11693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel dstOffset, (unsigned char *) srcBuff + 11703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel srcOffset, (size_t)currentVideoSize.width); 11713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.graphBuf->unlock(); 11753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mInterpr->mViVVid.ANW->queueBuffer( 11773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.ANW.get(), anb, -1); 11783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(err) 11793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Failed to enqueue buffer to recorder!!!\n"); 11803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 11823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->releaseRecordingFrame(dataPtr); 11833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->ViVUnlock(); 11853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 11863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 11873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 11883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ViVEncoderThread 11893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Creates a separate thread for ViV recording 11913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 11933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 11943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 11953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 11963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t Interpreter::ViVEncoderThread() 11973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 11983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int ret = NO_ERROR; 11993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_attr_t attr; 12003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_attr_init(&attr); 12013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = pthread_create(&mViVEncThread, &attr, ThreadWrapper, this); 12033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = pthread_attr_destroy(&attr); 12043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 12063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 12073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 12093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ThreadWrapper 12103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Helper function for for ViV recording thread 12123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : Interpreter context 12143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 12163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 12173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid *Interpreter::ThreadWrapper(void *context) { 12183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter *writer = static_cast<Interpreter *>(context); 12193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel writer->ViVEncode(); 12203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 12213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 12223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 12243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ViVEncode 12253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Thread for ViV encode. Buffers from video codec are sent to 12273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * muxer and saved in a file. 12283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : Interpreter context 12303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 12313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 12323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 12333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid Interpreter::ViVEncode() 12343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 12353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t err = NO_ERROR; 12363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ssize_t trackIdx = -1; 12373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t debugNumFrames = 0; 12383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t bufIndex, offset, size; 12403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int64_t ptsUsec; 12413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t flags; 12423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel bool DoRecording = true; 12433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mTestContext->mViVVid.codec->getOutputBuffers( 12463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &mTestContext->mViVVid.buffers); 12473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err != NO_ERROR) { 12483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Unable to get output buffers (err=%d)\n", err); 12493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel while (DoRecording) { 12523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mTestContext->mViVVid.codec->dequeueOutputBuffer( 12533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &bufIndex, 12543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &offset, 12553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &size, 12563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &ptsUsec, 12573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &flags, -1); 12583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (err) { 12603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case NO_ERROR: 12623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // got a buffer 12633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((flags & MediaCodec::BUFFER_FLAG_CODECCONFIG) != 0) { 12643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // ignore this -- we passed the CSD into MediaMuxer when 12653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // we got the format change notification 12663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size = 0; 12673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (size != 0) { 12693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // If the virtual display isn't providing us with timestamps, 12703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // use the current time. 12713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ptsUsec == 0) { 12723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptsUsec = systemTime(SYSTEM_TIME_MONOTONIC) / 1000; 12733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 12753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // The MediaMuxer docs are unclear, but it appears that we 12763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // need to pass either the full set of BufferInfo flags, or 12773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // (flags & BUFFER_FLAG_SYNCFRAME). 12783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mTestContext->mViVVid.muxer->writeSampleData( 12793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.buffers[bufIndex], 12803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (size_t)trackIdx, 12813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ptsUsec, 12823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel flags); 12833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err != NO_ERROR) { 12843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fprintf(stderr, "Failed writing data to muxer (err=%d)\n", 12853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err); 12863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel debugNumFrames++; 12883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mTestContext->mViVVid.codec->releaseOutputBuffer(bufIndex); 12903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err != NO_ERROR) { 12913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fprintf(stderr, "Unable to release output buffer (err=%d)\n", 12923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err); 12933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((flags & MediaCodec::BUFFER_FLAG_EOS) != 0) { 12953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Not expecting EOS from SurfaceFlinger. Go with it. 12963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Received end-of-stream\n"); 12973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //DoRecording = false; 12983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 12993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 13003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case -EAGAIN: // INFO_TRY_AGAIN_LATER 13013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGV("Got -EAGAIN, looping"); 13023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 13033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case INFO_FORMAT_CHANGED: // INFO_OUTPUT_FORMAT_CHANGED 13043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 13053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // format includes CSD, which we must provide to muxer 13063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sp<AMessage> newFormat; 13073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec->getOutputFormat(&newFormat); 13083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel trackIdx = mTestContext->mViVVid.muxer->addTrack(newFormat); 13093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mTestContext->mViVVid.muxer->start(); 13103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err != NO_ERROR) { 13113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Unable to start muxer (err=%d)\n", err); 13123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 13153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case INFO_OUTPUT_BUFFERS_CHANGED: // INFO_OUTPUT_BUFFERS_CHANGED 13163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // not expected for an encoder; handle it anyway 13173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGV("Encoder buffers changed"); 13183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel err = mTestContext->mViVVid.codec->getOutputBuffers( 13193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &mTestContext->mViVVid.buffers); 13203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (err != NO_ERROR) { 13213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Unable to get new output buffers (err=%d)\n", err); 13223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 13243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case INVALID_OPERATION: 13253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DoRecording = false; 13263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 13273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 13283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Got weird result %d from dequeueOutputBuffer\n", err); 13293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 13303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 13343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 13353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 13373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : calcBufferSize 13383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Temp buffer size calculation. Temp buffer is used to store 13403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * the buffer from the camera with smaller resolution. It is 13413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * copied to the buffer from camera with higher resolution. 13423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 13443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @width : video size width 13453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @height : video size height 13463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : size_t 13483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 13493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelsize_t CameraContext::calcBufferSize(int width, int height) 13503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 13513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t size = 0; 13523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t UVAlignment; 13533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t YPlane, UVPlane, YStride, UVStride, YScanlines, UVScanlines; 13543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!width || !height) { 13553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return size; 13563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel UVAlignment = 4096; 13583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel YStride = calcStride(width); 13593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel UVStride = calcStride(width); 13603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel YScanlines = calcYScanLines(height); 13613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel UVScanlines = calcUVScanLines(height); 13623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel YPlane = YStride * YScanlines; 13633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel UVPlane = UVStride * UVScanlines + UVAlignment; 13643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size = YPlane + UVPlane; 13653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size = VIDEO_BUF_ALLIGN(size, 4096); 13663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return size; 13683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 13693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 13713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : calcStride 13723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Temp buffer stride calculation. 13743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 13763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @width : video size width 13773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : size_t 13793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 13803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelsize_t CameraContext::calcStride(int width) 13813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 13823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t alignment, stride = 0; 13833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!width) { 13843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return stride; 13853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 13863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel alignment = 128; 13873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stride = VIDEO_BUF_ALLIGN((size_t)width, alignment); 13883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return stride; 13903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 13913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 13923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 13933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : calcYScanLines 13943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Temp buffer scanlines calculation for Y plane. 13963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 13973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 13983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @width : video size height 13993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : size_t 14013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelsize_t CameraContext::calcYScanLines(int height) 14033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 14043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t alignment, scanlines = 0; 14053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!height) { 14063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return scanlines; 14073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel alignment = 32; 14093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel scanlines = VIDEO_BUF_ALLIGN((size_t)height, alignment); 14103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return scanlines; 14123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 14133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 14153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : calcUVScanLines 14163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Temp buffer scanlines calculation for UV plane. 14183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 14203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @width : video size height 14213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : size_t 14233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelsize_t CameraContext::calcUVScanLines(int height) 14253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 14263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t alignment, scanlines = 0; 14273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!height) { 14283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return scanlines; 14293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 14303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel alignment = 16; 14313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel scanlines = VIDEO_BUF_ALLIGN((size_t)((height + 1) >> 1), alignment); 14323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return scanlines; 14343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 14353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 14373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : printSupportedParams 14383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: dump common supported parameters 14403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 14423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 14433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 14443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 14453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::printSupportedParams() 14463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 14473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *camera_ids = mParams.get("camera-indexes"); 14483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *pic_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES); 14493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *pic_formats = mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS); 14503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *preview_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES); 14513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *video_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES); 14523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *preview_formats = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS); 14533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *frame_rates = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES); 14543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *thumb_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES); 14553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *wb_modes = mParams.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE); 14563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *effects = mParams.get(CameraParameters::KEY_SUPPORTED_EFFECTS); 14573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *scene_modes = mParams.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES); 14583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *focus_modes = mParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES); 14593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *antibanding_modes = mParams.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING); 14603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *flash_modes = mParams.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 14613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int focus_areas = mParams.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS); 14623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *fps_ranges = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE); 14633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *focus_distances = mParams.get(CameraParameters::KEY_FOCUS_DISTANCES); 14643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 14653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Cameras: %s", 14663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (camera_ids != NULL)? camera_ids : "NULL"); 14673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Picture Sizes: %s", 14683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pic_sizes != NULL)? pic_sizes : "NULL"); 14693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Picture Formats: %s", 14703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (pic_formats != NULL)? pic_formats : "NULL"); 14713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Preview Sizes: %s", 14723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (preview_sizes != NULL)? preview_sizes : "NULL"); 14733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Video Sizes: %s", 14743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (video_sizes != NULL)? video_sizes : "NULL"); 14753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Preview Formats: %s", 14763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (preview_formats != NULL)? preview_formats : "NULL"); 14773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Preview Frame Rates: %s", 14783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (frame_rates != NULL)? frame_rates : "NULL"); 14793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Thumbnail Sizes: %s", 14803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (thumb_sizes != NULL)? thumb_sizes : "NULL"); 14813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Whitebalance Modes: %s", 14823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (wb_modes != NULL)? wb_modes : "NULL"); 14833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Effects: %s", 14843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (effects != NULL)? effects : "NULL"); 14853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Scene Modes: %s", 14863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (scene_modes != NULL)? scene_modes : "NULL"); 14873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Focus Modes: %s", 14883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (focus_modes != NULL)? focus_modes : "NULL"); 14893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Antibanding Options: %s", 14903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (antibanding_modes != NULL)? antibanding_modes : "NULL"); 14913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Flash Modes: %s", 14923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (flash_modes != NULL)? flash_modes : "NULL"); 14933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported Focus Areas: %d", focus_areas); 14943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tSupported FPS ranges : %s", 14953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (fps_ranges != NULL)? fps_ranges : "NULL"); 14963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\r\tFocus Distances: %s \n", 14973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (focus_distances != NULL)? focus_distances : "NULL"); 14983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 14993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 15013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : createPreviewSurface 15023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: helper function for creating preview surfaces 15043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 15063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @width : preview width 15073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @height: preview height 15083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pixFormat : surface pixelformat 15093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 15113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 15123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 15133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 15143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::createPreviewSurface(int width, int height, int32_t pixFormat) 15153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 15163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int ret = NO_ERROR; 15173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel DisplayInfo dinfo; 15183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay( 15193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ISurfaceComposer::eDisplayIdMain)); 15203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel SurfaceComposerClient::getDisplayInfo(display, &dinfo); 15213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel uint32_t previewWidth, previewHeight; 15223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((0 >= width) || (0 >= height)) { 15243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Bad preview surface size %dx%d\n", width, height); 15253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return BAD_VALUE; 15263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((int)dinfo.w < width) { 15293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewWidth = dinfo.w; 15303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewWidth = (unsigned int)width; 15323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ((int)dinfo.h < height) { 15353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewHeight = dinfo.h; 15363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewHeight = (unsigned int)height; 15383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mClient = new SurfaceComposerClient(); 15413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == mClient.get() ) { 15433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Unable to establish connection to Surface Composer \n"); 15443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 15453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSurfaceControl = mClient->createSurface(String8("QCamera_Test"), 15483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewWidth, 15493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewHeight, 15503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pixFormat, 15513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 0); 15523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == mSurfaceControl.get() ) { 15533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Unable to create preview surface \n"); 15543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 15553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewSurface = mSurfaceControl->getSurface(); 15583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != mPreviewSurface.get() ) { 15593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mClient->openGlobalTransaction(); 15603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mSurfaceControl->setLayer(0x7fffffff); 15613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mCameraIndex == 0 ) 15623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mSurfaceControl->setPosition(0, 0); 15633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel else 15643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mSurfaceControl->setPosition((float)(dinfo.w - previewWidth), 15653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (float)(dinfo.h - previewHeight)); 15663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mSurfaceControl->setSize(previewWidth, previewHeight); 15683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mSurfaceControl->show(); 15693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mClient->closeGlobalTransaction(); 15703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NO_ERROR != ret ) { 15723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Preview surface configuration failed! \n"); 15733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 15753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = NO_INIT; 15763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 15793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 15803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 15823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : destroyPreviewSurface 15833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: closes previously open preview surface 15853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 15873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 15883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 15893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 15903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 15913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 15923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::destroyPreviewSurface() 15933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 15943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != mPreviewSurface.get() ) { 15953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewSurface.clear(); 15963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 15973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 15983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != mSurfaceControl.get() ) { 15993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSurfaceControl->clear(); 16003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSurfaceControl.clear(); 16013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != mClient.get() ) { 16043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mClient->dispose(); 16053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mClient.clear(); 16063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 16073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 16093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : CameraContext 16133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: camera context constructor 16153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 16173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 16193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 16203d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelCameraContext::CameraContext(int cameraIndex) : 16213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCameraIndex(cameraIndex), 16223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview(true), 16233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHardwareActive(false), 16243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewRunning(false), 16253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordRunning(false), 16263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVideoFd(-1), 16273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVideoIdx(0), 16283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordingHint(false), 16293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDoPrintMenu(true), 16303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPCapture(false), 16313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mfmtMultiplier(1), 16323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsRead(false), 16333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSectionsAllocated(0), 16343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSections(NULL), 16353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mJEXIFTmp(NULL), 16363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHaveAll(false), 16373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera(NULL), 16383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mClient(NULL), 16393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSurfaceControl(NULL), 16403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewSurface(NULL), 16413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInUse(false) 16423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 16433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecorder = new MediaRecorder(String16("camera")); 16443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setTestCtxInstance 16483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Sends TestContext instance to CameraContext 16503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 16523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @instance : TestContext instance 16533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 16553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 16563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::setTestCtxInstance(TestContext *instance) 16573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 16583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr = instance; 16593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setTestCtxInst 16633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Sends TestContext instance to Interpreter 16653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 16673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @instance : TestContext instance 16683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 16703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 16713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid Interpreter::setTestCtxInst(TestContext *instance) 16723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 16733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext = instance; 16743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~CameraContext 16783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: camera context destructor 16803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 16823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 16843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 16853d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelCameraContext::~CameraContext() 16863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 16873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stopPreview(); 16883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel closeCamera(); 16893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 16903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 16913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 16923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : openCamera 16933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: connects to and initializes camera 16953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 16973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 16983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 16993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 17003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 17013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 17023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::openCamera() 17033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 17043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 17053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *ZSLStr = NULL; 17063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t ZSLStrSize = 0; 17073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != mCamera.get() ) { 17093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Camera already open! \n"); 17103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 17113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 17123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("openCamera(camera_index=%d)\n", mCameraIndex); 17153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef USE_JB_MR1 17173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel String16 packageName("CameraTest"); 17193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera = Camera::connect(mCameraIndex, 17213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel packageName, 17223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Camera::USE_CALLING_UID); 17233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#else 17253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera = Camera::connect(mCameraIndex); 17273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 17293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == mCamera.get() ) { 17313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Unable to connect to CameraService\n"); 17323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 17333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 17343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams = mCamera->getParameters(); 17373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.getSupportedPreviewSizes(mSupportedPreviewSizes); 17383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.getSupportedPictureSizes(mSupportedPictureSizes); 17393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.getSupportedVideoSizes(mSupportedVideoSizes); 17403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPictureSizeIdx = mSupportedPictureSizes.size() / 2; 17423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPreviewSizeIdx = mSupportedPreviewSizes.size() / 2; 17433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentVideoSizeIdx = mSupportedVideoSizes.size() / 2; 17443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setListener(this); 17463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHardwareActive = true; 17473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->setViVSize((Size) mSupportedVideoSizes.itemAt( 17493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentVideoSizeIdx), 17503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCameraIndex); 17513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ZSLStr = mParams.get(CameraContext::KEY_ZSL); 17533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != ZSLStr) { 17543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ZSLStrSize = strlen(ZSLStr); 17553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!strncmp(ZSLStr, "on", ZSLStrSize)) { 17563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mIsZSLOn = true; 17573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (!strncmp(ZSLStr, "off", ZSLStrSize)) { 17583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mIsZSLOn = false; 17593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 17603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("zsl value is not valid!\n"); 17613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 17633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("zsl is NULL\n"); 17643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 17653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 17673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 17693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 17703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 17723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : onAsBinder 17733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: onAsBinder 17753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 17773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : Pointer to IBinder 17793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 17803d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelIBinder* CameraContext::onAsBinder() { 17813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NULL; 17823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 17833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 17853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getNumberOfCameras 17863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: returns the number of supported camera by the system 17883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 17903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 17913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : supported camera count 17923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 17933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint CameraContext::getNumberOfCameras() 17943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 17953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int ret = -1; 17963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 17973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL != mCamera.get() ) { 17983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mCamera->getNumberOfCameras(); 17993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 18023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 18033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 18053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : closeCamera 18063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: closes a previously the initialized camera reference 18083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 18103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 18123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 18133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 18143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 18153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::closeCamera() 18163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 18173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 18183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == mCamera.get() ) { 18193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 18203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->disconnect(); 18233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera.clear(); 18243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecorder->init(); 18263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecorder->close(); 18273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecorder->release(); 18283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecorder.clear(); 18293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mHardwareActive = false; 18313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewRunning = false; 18323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordRunning = false; 18333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 18353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 18363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 18373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 18393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : startPreview 18403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: starts camera preview 18423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 18443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 18453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 18463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 18473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 18483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 18493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::startPreview() 18503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 18513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 18523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int ret = NO_ERROR; 18543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int previewWidth, previewHeight; 18553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size calculatedPreviewSize; 18563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size currentPreviewSize = mSupportedPreviewSizes.itemAt( 18573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPreviewSizeIdx); 18583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size currentPictureSize = mSupportedPictureSizes.itemAt( 18593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPictureSizeIdx); 18603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size currentVideoSize = mSupportedVideoSizes.itemAt( 18613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentVideoSizeIdx); 18623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef USE_JB_MR1 18643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sp<IGraphicBufferProducer> gbp; 18663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 18683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mHardwareActive ) { 18703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Camera not active! \n"); 18713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_INIT; 18723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mPreviewRunning) { 18753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Preview is already running! \n"); 18763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 18773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 18783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mResizePreview) { 18813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewRunning = false; 18823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mRecordingHint ) { 18843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel calculatedPreviewSize = 18853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel getPreviewSizeFromVideoSizes(currentVideoSize); 18863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewWidth = calculatedPreviewSize.width; 18873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewHeight = calculatedPreviewSize.height; 18883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 18893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewWidth = currentPreviewSize.width; 18903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewHeight = currentPreviewSize.height; 18913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 18923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 18933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = createPreviewSurface(previewWidth, 18943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewHeight, 18953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel HAL_PIXEL_FORMAT_YCrCb_420_SP); 18963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NO_ERROR != ret ) { 18973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Error while creating preview surface\n"); 18983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 18993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // set rdi mode if system prop is set for front camera 19023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mCameraIndex == 1) { 19033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char value[32]; 19043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel property_get("persist.camera.rdimode", value, "0"); 19053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int rdimode = atoi(value); 19063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("rdi mode = %d\n", rdimode); 19073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (rdimode == 1) { 19083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set("rdi-mode", "enable"); 19093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 19103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set("rdi-mode", "disable"); 19113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 19133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set("rdi-mode", "disable"); 19143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //mParams.set("rdi-mode", "enable"); 19173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set("recording-hint", "true"); 19183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setPreviewSize(previewWidth, previewHeight); 19193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setPictureSize(currentPictureSize.width, 19203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentPictureSize.height); 19213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setVideoSize( 19223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentVideoSize.width, currentVideoSize.height); 19233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mCamera->setParameters(mParams.flatten()); 19253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#ifndef USE_JB_MR1 19273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel gbp = mPreviewSurface->getIGraphicBufferProducer(); 19293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mCamera->setPreviewTarget(gbp); 19303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#else 19323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mCamera->setPreviewDisplay(mPreviewSurface); 19343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel#endif 19363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview = false; 19373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( !mPreviewRunning ) { 19403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret |= mCamera->startPreview(); 19413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NO_ERROR != ret ) { 19423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Preview start failed! \n"); 19433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 19443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewRunning = true; 19473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 19503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 19523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 19533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 19553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getPreviewSizeFromVideoSizes 19563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Get the preview size from video size. Find all resolutions with 19583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * the same aspect ratio and choose the same or the closest 19593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * from them. 19603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 19623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @currentVideoSize: current video size 19633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 19653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : PreviewSize 19663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 19673d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelSize CameraContext::getPreviewSizeFromVideoSizes(Size currentVideoSize) 19683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 19693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size tmpPreviewSize; 19713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size PreviewSize; 19723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size PreviewSizes[mSupportedPreviewSizes.size()]; 19733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel double tolerance = 0.00001; 19743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel double videoRatio; 19753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel double previewRatio; 19763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t i = 0; 19773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t j = 0; 19783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int delta; 19793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Find all the resolutions with the same aspect ratio and choose the 19813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // same or the closest resolution from them. Choose the closest resolution 19823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // in case same aspect ratio is not found 19833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (currentVideoSize.width * currentVideoSize.height > 0 && 19843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSupportedPreviewSizes.size() > 0) { 19853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoRatio = (float)currentVideoSize.width / 19863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (float)currentVideoSize.height; 19873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i=0; i<mSupportedPreviewSizes.size(); i++) { 19883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel tmpPreviewSize = mSupportedPreviewSizes.itemAt(i); 19893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewRatio = (float)tmpPreviewSize.width / 19903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (float)tmpPreviewSize.height; 19913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (fabs(videoRatio - previewRatio) < tolerance) { 19923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel PreviewSizes[j] = tmpPreviewSize; 19933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel j++; 19943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 19963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 19973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( j > 0 ) { 19983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delta = abs((currentVideoSize.width *currentVideoSize.height)- 19993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (PreviewSizes[0].width * PreviewSizes[0].height)); 20003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel PreviewSize = PreviewSizes[0]; 20013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i=0; i<j; i++) { 20023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(abs(currentVideoSize.width * currentVideoSize.height) - 20033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (PreviewSizes[i].width * PreviewSizes[i].height) < 20043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delta) { 20053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel PreviewSize = PreviewSizes[i]; 20063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delta = abs((currentVideoSize.width * 20073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentVideoSize.height) - 20083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (PreviewSizes[i].width * PreviewSizes[i].height)); 20093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 20123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // Choose the closest resolution in case same aspect ratio is 20133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel // not found 20143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel tmpPreviewSize = mSupportedPreviewSizes.itemAt(j); 20153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel PreviewSize = tmpPreviewSize; 20163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delta = abs( 20173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (currentVideoSize.width * currentVideoSize.height)- 20183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (tmpPreviewSize.width * tmpPreviewSize.height)); 20193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i=0; i<mSupportedPreviewSizes.size(); i++) { 20203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel tmpPreviewSize = mSupportedPreviewSizes.itemAt(i); 20213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if(abs( 20223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (currentVideoSize.width * currentVideoSize.height)- 20233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (tmpPreviewSize.width * tmpPreviewSize.height)) < 20243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delta) { 20253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel PreviewSize = tmpPreviewSize; 20263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delta = abs( 20273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (currentVideoSize.width * currentVideoSize.height)- 20283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (tmpPreviewSize.width * tmpPreviewSize.height)); 20293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 20333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&PreviewSize, 0, sizeof(PreviewSize)); 20343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return PreviewSize; 20363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 20373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 20393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : autoFocus 20403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Triggers autofocus 20423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 20443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 20463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 20473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 20483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 20493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::autoFocus() 20503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 20513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 20523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 20533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mPreviewRunning ) { 20553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mCamera->autoFocus(); 20563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 20593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 20603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 20613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 20633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : enablePreviewCallbacks 20643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enables preview callback messages 20663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 20683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 20703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 20713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 20723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 20733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::enablePreviewCallbacks() 20743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 20753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 20763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 20773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setPreviewCallbackFlags( 20783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); 20793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 20803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 20823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 20833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 20843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 20853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 20863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : takePicture 20873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: triggers image capture 20893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 20913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 20923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 20933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 20943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 20953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 20963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::takePicture() 20973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 20983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 20993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 21003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mPreviewRunning ) { 21013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mCamera->takePicture( 21023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAMERA_MSG_COMPRESSED_IMAGE| 21033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel CAMERA_MSG_RAW_IMAGE); 21043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!mRecordingHint && !mInterpr->mIsZSLOn) { 21053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewRunning = false; 21063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 21083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Please resume/start the preview before taking a picture!\n"); 21093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 21113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 21133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 21153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : configureRecorder 21163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 21173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Configure video recorder 21183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 21193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 21203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 21213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 21223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 21233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 21243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 21253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::configureRecorder() 21263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 21273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 21283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 21293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview = true; 21313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set("recording-hint", "true"); 21323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordingHint = true; 21333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 21343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx); 21363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setParameters( 21373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel String8("video-param-encoding-bitrate=64000")); 21383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not configure recorder (%d)", ret); 21403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setCamera( 21443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->remote(), mCamera->getRecordingProxy()); 21453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set camera (%d)", ret); 21473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setVideoSource(VIDEO_SOURCE_CAMERA); 21503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set video soruce (%d)", ret); 21523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setAudioSource(AUDIO_SOURCE_DEFAULT); 21553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set audio source (%d)", ret); 21573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setOutputFormat(OUTPUT_FORMAT_DEFAULT); 21603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set output format (%d)", ret); 21623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setVideoEncoder(VIDEO_ENCODER_DEFAULT); 21663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set video encoder (%d)", ret); 21683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char fileName[100]; 21723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(fileName, sizeof(fileName) / sizeof(char), 21743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "/sdcard/vid_cam%d_%dx%d_%d.mpeg", mCameraIndex, 21753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoSize.width, videoSize.height, mVideoIdx++); 21763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mVideoFd < 0 ) { 21783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVideoFd = open(fileName, O_CREAT | O_RDWR ); 21793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mVideoFd < 0 ) { 21823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not open video file for writing %s!", fileName); 21833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 21843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setOutputFile(mVideoFd, 0, 0); 21873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set output file (%d)", ret); 21893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setVideoSize(videoSize.width, videoSize.height); 21933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 21943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set video size %dx%d", videoSize.width, 21953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoSize.height); 21963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 21973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 21983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 21993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setVideoFrameRate(30); 22003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 22013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set video frame rate (%d)", ret); 22023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 22033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->setAudioEncoder(AUDIO_ENCODER_DEFAULT); 22063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 22073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not set audio encoder (%d)", ret); 22083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 22093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 22123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 22133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 22143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 22163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : unconfigureViVRecording 22173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Unconfigures video in video recording 22193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 22213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 22233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 22243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 22253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 22263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::unconfigureRecorder() 22273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 22283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 22293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( !mRecordRunning ) { 22313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview = true; 22323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set("recording-hint", "false"); 22333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordingHint = false; 22343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 22353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 22383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 22393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 22403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 22423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : configureViVRecording 22433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Configures video in video recording 22453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 22473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 22493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 22503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 22513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 22523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::configureViVRecording() 22533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 22543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 22553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview = true; 22573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set("recording-hint", "true"); 22583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordingHint = true; 22593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 22603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setRecordingProxyListener(this); 22613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 22633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 22643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 22653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 22673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : startRecording 22683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: triggers start recording 22703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 22723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 22733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 22743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 22753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 22763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 22773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::startRecording() 22783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 22793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 22803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 22813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mPreviewRunning ) { 22843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->unlock(); 22863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->prepare(); 22883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 22893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not prepare recorder"); 22903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 22913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mRecorder->start(); 22943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ret != NO_ERROR ) { 22953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Could not start recorder"); 22963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 22973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 22983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 22993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordRunning = true; 23003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 23023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 23033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 23043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 23063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stopRecording 23073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: triggers start recording 23093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 23113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 23133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 23143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 23153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 23163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::stopRecording() 23173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 23183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 23193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 23203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mRecordRunning ) { 23223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecorder->stop(); 23233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel close(mVideoFd); 23243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mVideoFd = -1; 23253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mRecordRunning = false; 23273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 23303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 23323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 23333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 23353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : startViVRecording 23363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Starts video in video recording 23383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 23403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 23423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 23433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 23443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 23453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::startViVRecording() 23463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 23473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 23483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret; 23493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mInterpr->mViVVid.VideoSizes[0].width * 23513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.VideoSizes[0].height >= 23523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.VideoSizes[1].width * 23533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.VideoSizes[1].height) { 23543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.buffSize = calcBufferSize( 23553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.VideoSizes[1].width, 23563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.VideoSizes[1].height); 23573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mInterpr->mViVBuff.buff == NULL) { 23583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.buff = 23593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (void *)malloc(mInterpr->mViVBuff.buffSize); 23603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.sourceCameraID = 1; 23623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.destinationCameraID = 0; 23633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 23653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.buffSize = calcBufferSize( 23663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.VideoSizes[0].width, 23673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.VideoSizes[0].height); 23683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mInterpr->mViVBuff.buff == NULL) { 23693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVBuff.buff = 23703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (void *)malloc(mInterpr->mViVBuff.buffSize); 23713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.sourceCameraID = 0; 23733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->mViVVid.destinationCameraID = 1; 23743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 23753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mCamera->startRecording(); 23773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 23793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 23803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 23813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 23833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stopViVRecording 23843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Stops video in video recording 23863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 23883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 23893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 23903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 23913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 23923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 23933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::stopViVRecording() 23943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 23953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 23963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 23973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 23983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->stopRecording(); 23993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 24013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 24023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 24033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 24053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : stopPreview 24063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: stops camera preview 24083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 24103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 24123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 24133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 24143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 24153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::stopPreview() 24163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 24173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 24183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 24193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 24213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->stopPreview(); 24223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = destroyPreviewSurface(); 24233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewRunning = false; 24263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview = true; 24273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 24293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 24313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 24323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 24343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : resumePreview 24353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: resumes camera preview after image capture 24373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 24393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 24413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 24423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 24433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 24443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::resumePreview() 24453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 24463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 24473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 24483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 24503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mCamera->startPreview(); 24513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPreviewRunning = true; 24523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 24533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = NO_INIT; 24543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 24573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 24583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 24593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 24613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : nextPreviewSize 24623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Iterates through all supported preview sizes. 24643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 24663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 24673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 24683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 24693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 24703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 24713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::nextPreviewSize() 24723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 24733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 24743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 24753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPreviewSizeIdx += 1; 24763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPreviewSizeIdx %= mSupportedPreviewSizes.size(); 24773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size previewSize = mSupportedPreviewSizes.itemAt( 24783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPreviewSizeIdx); 24793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setPreviewSize(previewSize.width, 24803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewSize.height); 24813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview = true; 24823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mPreviewRunning ) { 24843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->stopPreview(); 24853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 24863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->startPreview(); 24873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 24883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 24893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 24913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 24933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 24943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 24953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 24973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 24983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setPreviewSize 24993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Sets exact preview size if supported 25013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : format size in the form of WIDTHxHEIGHT 25033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 25053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 25063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 25073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 25083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::setPreviewSize(const char *format) 25093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 25103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 25113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 25123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int newHeight; 25133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int newWidth; 25143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sscanf(format, "%dx%d", &newWidth, &newHeight); 25153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned int i; 25173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < mSupportedPreviewSizes.size(); ++i) { 25183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size previewSize = mSupportedPreviewSizes.itemAt(i); 25193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( newWidth == previewSize.width && 25203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newHeight == previewSize.height ) 25213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 25223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 25233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( i == mSupportedPreviewSizes.size()) 25273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 25283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Preview size %dx%d not supported !\n", 25293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newWidth, newHeight); 25303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return INVALID_OPERATION; 25313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setPreviewSize(newWidth, 25343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newHeight); 25353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mResizePreview = true; 25363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mPreviewRunning ) { 25383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->stopPreview(); 25393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 25403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->startPreview(); 25413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 25423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 25433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 25473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 25483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 25493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 25513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getCurrentPreviewSize 25523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: queries the currently configured preview size 25543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 25563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @previewSize : preview size currently configured 25573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 25593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 25603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 25613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 25623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::getCurrentPreviewSize(Size &previewSize) 25633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 25643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 25653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 25663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel previewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx); 25673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 25693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 25703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 25713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 25733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : nextPictureSize 25743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Iterates through all supported picture sizes. 25763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 25783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 25793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 25803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 25813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 25823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 25833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::nextPictureSize() 25843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 25853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 25863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 25873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPictureSizeIdx += 1; 25883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPictureSizeIdx %= mSupportedPictureSizes.size(); 25893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size pictureSize = mSupportedPictureSizes.itemAt( 25903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentPictureSizeIdx); 25913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setPictureSize(pictureSize.width, 25923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pictureSize.height); 25933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 25943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 25953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 25963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 25973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 25983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 25993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 26003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setPictureSize 26013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Sets exact preview size if supported 26033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : format size in the form of WIDTHxHEIGHT 26053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 26073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 26083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 26093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 26103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::setPictureSize(const char *format) 26113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 26123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 26133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 26143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int newHeight; 26153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int newWidth; 26163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sscanf(format, "%dx%d", &newWidth, &newHeight); 26173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned int i; 26193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < mSupportedPictureSizes.size(); ++i) { 26203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size PictureSize = mSupportedPictureSizes.itemAt(i); 26213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( newWidth == PictureSize.width && 26223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newHeight == PictureSize.height ) 26233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 26243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 26253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( i == mSupportedPictureSizes.size()) 26293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 26303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Preview size %dx%d not supported !\n", 26313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newWidth, newHeight); 26323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return INVALID_OPERATION; 26333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setPictureSize(newWidth, 26363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newHeight); 26373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 26383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 26413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 26423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 26433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 26453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : nextVideoSize 26463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Select the next available video size 26483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 26503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 26523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 26533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 26543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 26553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::nextVideoSize() 26563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 26573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 26583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 26593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentVideoSizeIdx += 1; 26603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentVideoSizeIdx %= mSupportedVideoSizes.size(); 26613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx); 26623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setVideoSize(videoSize.width, 26633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoSize.height); 26643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 26653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpr->setViVSize((Size) mSupportedVideoSizes.itemAt( 26663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentVideoSizeIdx), mCameraIndex); 26673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 26683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 26693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 26703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 26713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 26733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setVideoSize 26743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Set video size 26763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 26783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @format : format 26793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 26803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 26813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 26823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 26833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 26843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::setVideoSize(const char *format) 26853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 26863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 26873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 26883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int newHeight; 26893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int newWidth; 26903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sscanf(format, "%dx%d", &newWidth, &newHeight); 26913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 26923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel unsigned int i; 26933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (i = 0; i < mSupportedVideoSizes.size(); ++i) { 26943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size PictureSize = mSupportedVideoSizes.itemAt(i); 26953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( newWidth == PictureSize.width && 26963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newHeight == PictureSize.height ) 26973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 26983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 26993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( i == mSupportedVideoSizes.size()) 27033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 27043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Preview size %dx%d not supported !\n", 27053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newWidth, newHeight); 27063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return INVALID_OPERATION; 27073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.setVideoSize(newWidth, 27103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel newHeight); 27113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 27123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 27153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 27163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 27173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 27193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getCurrentVideoSize 27203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Get current video size 27223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 27243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @videoSize: video Size 27253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 27273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 27283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 27293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 27303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::getCurrentVideoSize(Size &videoSize) 27313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 27323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 27333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 27343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx); 27353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 27373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 27383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 27393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 27413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getCurrentPictureSize 27423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: queries the currently configured picture size 27443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 27463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @pictureSize : picture size currently configured 27473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 27493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 27503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 27513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 27523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t CameraContext::getCurrentPictureSize(Size &pictureSize) 27533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 27543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel useLock(); 27553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mHardwareActive ) { 27563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx); 27573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 27583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel signalFinished(); 27593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 27603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 27613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel}; //namespace qcamera ends here 27633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelusing namespace qcamera; 27653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 27673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : printMenu 27683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: prints the available camera options 27703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 27723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @currentCamera : camera context currently being used 27733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 27743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 27753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 27763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::printMenu(sp<CameraContext> currentCamera) 27773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 27783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( !mDoPrintMenu ) return; 27793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Size currentPictureSize, currentPreviewSize, currentVideoSize; 27803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *zsl_mode = mParams.get(CameraContext::KEY_ZSL); 27813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel assert(currentCamera.get()); 27833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->getCurrentPictureSize(currentPictureSize); 27853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->getCurrentPreviewSize(currentPreviewSize); 27863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->getCurrentVideoSize(currentVideoSize); 27873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n"); 27893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 27903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" \n\nSTART / STOP / GENERAL SERVICES \n"); 27913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" -----------------------------\n"); 27923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Switch camera - Current Index: %d\n", 27933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::SWITCH_CAMERA_CMD, 27943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->getCameraIndex()); 27953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Resume Preview after capture \n", 27963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::RESUME_PREVIEW_CMD); 27973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Quit \n", 27983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::EXIT_CMD); 27993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Camera Capability Dump", 28003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::DUMP_CAPS_CMD); 28013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" \n\n PREVIEW SUB MENU \n"); 28033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" -----------------------------\n"); 28043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Start Preview\n", 28053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::START_PREVIEW_CMD); 28063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Stop Preview\n", 28073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::STOP_PREVIEW_CMD); 28083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Preview size: %dx%d\n", 28093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::CHANGE_PREVIEW_SIZE_CMD, 28103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentPreviewSize.width, 28113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentPreviewSize.height); 28123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Video size: %dx%d\n", 28133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::CHANGE_VIDEO_SIZE_CMD, 28143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentVideoSize.width, 28153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentVideoSize.height); 28163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Start Recording\n", 28173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::START_RECORD_CMD); 28183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Stop Recording\n", 28193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::STOP_RECORD_CMD); 28203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Start ViV Recording\n", 28213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::START_VIV_RECORD_CMD); 28223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Stop ViV Recording\n", 28233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::STOP_VIV_RECORD_CMD); 28243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Enable preview frames\n", 28253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::ENABLE_PRV_CALLBACKS_CMD); 28263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Trigger autofocus \n", 28273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::AUTOFOCUS_CMD); 28283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" \n\n IMAGE CAPTURE SUB MENU \n"); 28303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" -----------------------------\n"); 28313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Take picture/Full Press\n", 28323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::TAKEPICTURE_CMD); 28333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Take picture in picture\n", 28343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::TAKEPICTURE_IN_PICTURE_CMD); 28353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. Picture size: %dx%d\n", 28363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::CHANGE_PICTURE_SIZE_CMD, 28373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentPictureSize.width, 28383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentPictureSize.height); 28393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf(" %c. zsl: %s\n", Interpreter::ZSL_CMD, 28403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel (zsl_mode != NULL) ? zsl_mode : "NULL"); 28413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("\n Choice: "); 28433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 28443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 28463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : enablePrintPreview 28473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enables printing the preview 28493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 28513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 28533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 28543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::enablePrintPreview() 28553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 28563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDoPrintMenu = true; 28573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 28583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 28603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : disablePrintPreview 28613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Disables printing the preview 28633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 28653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 28673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 28683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::disablePrintPreview() 28693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 28703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mDoPrintMenu = false; 28713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 28723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 28743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : enablePiPCapture 28753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Enables picture in picture capture 28773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 28793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 28813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 28823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::enablePiPCapture() 28833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 28843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPCapture = true; 28853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 28863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 28873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 28883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : disablePiPCapture 28893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Disables picture in picture capture 28913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 28933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 28943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 28953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 28963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::disablePiPCapture() 28973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 28983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPCapture = false; 28993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 29003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 29023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getZSL 29033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: get ZSL value of current camera 29053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 29073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : current zsl value 29093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 29103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelconst char *CameraContext::getZSL() 29113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 29123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mParams.get(CameraContext::KEY_ZSL); 29133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 29143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 29163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setZSL 29173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: set ZSL value of current camera 29193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : zsl value to be set 29213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 29233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 29243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid CameraContext::setZSL(const char *value) 29253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 29263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mParams.set(CameraContext::KEY_ZSL, value); 29273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCamera->setParameters(mParams.flatten()); 29283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 29293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 29313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : configureViVCodec 29323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Configures video in video codec 29343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 29363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 29373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 29383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 29393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 29403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 29413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t Interpreter::configureViVCodec() 29423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 29433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 29443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char fileName[100]; 29453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sp<AMessage> format = new AMessage; 29463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sp<ALooper> looper = new ALooper; 29473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mTestContext->mViVVid.VideoSizes[0].width * 29493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[0].height >= 29503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].width * 29513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].height) { 29523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(fileName, sizeof(fileName) / sizeof(char), "/sdcard/ViV_vid_%dx%d_%d.mp4", 29533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[0].width, 29543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[0].height, 29553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.ViVIdx++); 29563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setInt32("width", mTestContext->mViVVid.VideoSizes[0].width); 29573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setInt32("height", mTestContext->mViVVid.VideoSizes[0].height); 29583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 29593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel snprintf(fileName, sizeof(fileName) / sizeof(char), "/sdcard/ViV_vid_%dx%d_%d.mp4", 29603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].width, 29613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].height, 29623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.ViVIdx++); 29633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setInt32("width", mTestContext->mViVVid.VideoSizes[1].width); 29643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setInt32("height", mTestContext->mViVVid.VideoSizes[1].height); 29653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int fd = open(fileName, O_CREAT | O_RDWR ); 29673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (fd < 0) { 29683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel LOGE("Error opening file"); 29693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 29703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.muxer = new MediaMuxer( 29723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fd, MediaMuxer::OUTPUT_FORMAT_MPEG_4); 29733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setString("mime", "video/avc"); 29753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setInt32("color-format", OMX_COLOR_FormatAndroidOpaque); 29763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setInt32("bitrate", 1000000); 29783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setFloat("frame-rate", 30); 29793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel format->setInt32("i-frame-interval", 10); 29803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel looper->setName("ViV_recording_looper"); 29823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel looper->start(); 29833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGV("Creating codec"); 29843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec = MediaCodec::CreateByType( 29853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel looper, "video/avc", true); 29863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mTestContext->mViVVid.codec == NULL) { 29873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fprintf(stderr, "ERROR: unable to create video/avc codec instance\n"); 29883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return UNKNOWN_ERROR; 29893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mTestContext->mViVVid.codec->configure(format, NULL, NULL, 29913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel MediaCodec::CONFIGURE_FLAG_ENCODE); 29923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ret != NO_ERROR) { 29933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec->release(); 29943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec.clear(); 29953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 29963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fprintf(stderr, "ERROR: unable to configure codec (err=%d)\n", ret); 29973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 29983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 29993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGV("Creating buffer producer"); 30013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mTestContext->mViVVid.codec->createInputSurface( 30023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel &mTestContext->mViVVid.bufferProducer); 30033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ret != NO_ERROR) { 30043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec->release(); 30053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec.clear(); 30063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fprintf(stderr, 30083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "ERROR: unable to create encoder input surface (err=%d)\n", ret); 30093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 30103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = mTestContext->mViVVid.codec->start(); 30133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (ret != NO_ERROR) { 30143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec->release(); 30153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec.clear(); 30163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fprintf(stderr, "ERROR: unable to start codec (err=%d)\n", ret); 30183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 30193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ALOGV("Codec prepared"); 30213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.surface = new Surface( 30233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.bufferProducer); 30243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.ANW = mTestContext->mViVVid.surface; 30253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = native_window_api_connect(mTestContext->mViVVid.ANW.get(), 30263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NATIVE_WINDOW_API_CPU); 30273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mTestContext->mViVVid.VideoSizes[0].width * 30283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[0].height >= 30293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].width * 30303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].height) { 30313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_window_set_buffers_format(mTestContext->mViVVid.ANW.get(), 30323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel HAL_PIXEL_FORMAT_NV12_ENCODEABLE); 30333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_window_set_buffers_dimensions(mTestContext->mViVVid.ANW.get(), 30343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[0].width, 30353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[0].height); 30363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 30373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_window_set_buffers_format(mTestContext->mViVVid.ANW.get(), 30383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel HAL_PIXEL_FORMAT_NV12_ENCODEABLE); 30393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_window_set_buffers_dimensions(mTestContext->mViVVid.ANW.get(), 30403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].width, 30413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.VideoSizes[1].height); 30423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_window_set_usage(mTestContext->mViVVid.ANW.get(), 30443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); 30453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel native_window_set_buffer_count(mTestContext->mViVVid.ANW.get(), 30463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.buff_cnt); 30473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ViVEncoderThread(); 30493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 30513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 30523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 30543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : unconfigureViVCodec 30553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Unconfigures video in video codec 30573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 30593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 30613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 30623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 30633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 30643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t Interpreter::unconfigureViVCodec() 30653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 30663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t ret = NO_ERROR; 30673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ret = native_window_api_disconnect(mTestContext->mViVVid.ANW.get(), 30693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel NATIVE_WINDOW_API_CPU); 30703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.bufferProducer = NULL; 30713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec->stop(); 30723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel pthread_join(mViVEncThread, NULL); 30733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.muxer->stop(); 30743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec->release(); 30753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.codec.clear(); 30763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.muxer.clear(); 30773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVVid.surface.clear(); 30783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return ret; 30793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 30803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 30813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 30823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : Interpreter 30833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Interpreter constructor 30853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 30873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 30883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 30893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 30903d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelInterpreter::Interpreter(const char *file) 30913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel : mCmdIndex(0) 30923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel , mScript(NULL) 30933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 30943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!file){ 30953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("no File Given\n"); 30963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mUseScript = false; 30973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 30983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 30993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel FILE *fh = fopen(file, "r"); 31013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( !fh ) { 31023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Could not open file %s\n", file); 31033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mUseScript = false; 31043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 31053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fseek(fh, 0, SEEK_END); 31083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t len = (size_t)ftell(fh); 31093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel rewind(fh); 31103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if( !len ) { 31123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Script file %s is empty !\n", file); 31133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fclose(fh); 31143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 31153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mScript = new char[len + 1]; 31183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( !mScript ) { 31193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fclose(fh); 31203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return; 31213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fread(mScript, sizeof(char), len, fh); 31243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mScript[len] = '\0'; // ensure null terminated; 31253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel fclose(fh); 31263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char *p1; 31293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel char *p2; 31303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel p1 = p2 = mScript; 31313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel do { 31333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (*p1) { 31343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case '\0': 31353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case '|': 31363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel p1++; 31373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 31383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case SWITCH_CAMERA_CMD: 31393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case RESUME_PREVIEW_CMD: 31403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case START_PREVIEW_CMD: 31413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case STOP_PREVIEW_CMD: 31423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CHANGE_PREVIEW_SIZE_CMD: 31433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case CHANGE_PICTURE_SIZE_CMD: 31443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case START_RECORD_CMD: 31453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case STOP_RECORD_CMD: 31463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case START_VIV_RECORD_CMD: 31473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case STOP_VIV_RECORD_CMD: 31483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case DUMP_CAPS_CMD: 31493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case AUTOFOCUS_CMD: 31503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case TAKEPICTURE_CMD: 31513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case TAKEPICTURE_IN_PICTURE_CMD: 31523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case ENABLE_PRV_CALLBACKS_CMD: 31533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case EXIT_CMD: 31543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case ZSL_CMD: 31553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case DELAY: 31563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel p2 = p1; 31573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel while( (p2 != (mScript + len)) && (*p2 != '|')) { 31583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel p2++; 31593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *p2 = '\0'; 31613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (p2 == (p1 + 1)) 31623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCommands.push_back(Command( 31633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static_cast<Interpreter::Commands_e>(*p1))); 31643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel else 31653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCommands.push_back(Command( 31663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static_cast<Interpreter::Commands_e>(*p1), (p1 + 1))); 31673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel p1 = p2; 31683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 31693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 31703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Invalid cmd %c \n", *p1); 31713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel do { 31723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel p1++; 31733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } while(*p1 != '|' && p1 != (mScript + len)); 31753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 31773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } while(p1 != (mScript + len)); 31783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mUseScript = true; 31793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~Interpreter 31833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Interpreter destructor 31853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 31873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 31883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 31893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 31903d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelInterpreter::~Interpreter() 31913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 31923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( mScript ) 31933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete[] mScript; 31943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCommands.clear(); 31963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 31973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 31983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 31993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : getCommand 32003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Get a command from interpreter 32023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 32043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @currentCamera: Current camera context 32053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : command 32073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32083d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelInterpreter::Command Interpreter::getCommand( 32093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sp<CameraContext> currentCamera) 32103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if( mUseScript ) { 32123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mCommands[mCmdIndex++]; 32133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 32143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->printMenu(currentCamera); 32153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return Interpreter::Command( 32163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel static_cast<Interpreter::Commands_e>(getchar())); 32173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : TestContext 32223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : TestContext constructor 32243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 32263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 32283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32293d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelTestContext::TestContext() 32303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int i = 0; 32323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestRunning = false; 32333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpreter = NULL; 32343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.ViVIdx = 0; 32353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.buff_cnt = 9; 32363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.graphBuf = 0; 32373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.mappedBuff = NULL; 32383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.isBuffValid = false; 32393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.sourceCameraID = -1; 32403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.destinationCameraID = -1; 32413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPinUse = false; 32423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVinUse = false; 32433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mIsZSLOn = false; 32443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel memset(&mViVBuff, 0, sizeof(ViVBuff_t)); 32453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ProcessState::self()->startThreadPool(); 32473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel do { 32493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[i] = new CameraContext(i); 32503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NULL == camera[i].get() ) { 32513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 32523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[i]->setTestCtxInstance(this); 32543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel //by default open only back camera 32563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (i==0) { 32573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t stat = camera[i]->openCamera(); 32583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( NO_ERROR != stat ) { 32593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Error encountered Openging camera id : %d\n", i); 32603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 32613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mAvailableCameras.add(camera[i]); 32643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel i++; 32653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } while ( i < camera[0]->getNumberOfCameras() ) ; 32663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (i < camera[0]->getNumberOfCameras() ) { 32683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t j = 0; j < mAvailableCameras.size(); j++) { 32693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[j] = mAvailableCameras.itemAt(j); 32703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[j]->closeCamera(); 32713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[j].clear(); 32723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mAvailableCameras.clear(); 32753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 32793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ~TestContext 32803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : TestContext destructor 32823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 32843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 32853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 32863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 32873d63919a23d7e7954e160c48c36713267106c3c2Thierry StrudelTestContext::~TestContext() 32883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 32893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel delete mInterpreter; 32903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t j = 0; j < mAvailableCameras.size(); j++) { 32923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[j] = mAvailableCameras.itemAt(j); 32933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[j]->closeCamera(); 32943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel camera[j].clear(); 32953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 32963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 32973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mAvailableCameras.clear(); 32983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 32993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 33013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : GetCamerasNum 33023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Get the number of available cameras 33043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 33063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : Number of cameras 33083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 33093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelsize_t TestContext::GetCamerasNum() 33103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 33113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return mAvailableCameras.size(); 33123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 33133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 33153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : AddScriptFromFile 33163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Add script from file 33183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 33203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @scriptFile : Script file 33213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 33233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- success 33243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero failure code 33253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 33263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t TestContext::AddScriptFromFile(const char *scriptFile) 33273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 33283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpreter = new Interpreter(scriptFile); 33293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpreter->setTestCtxInst(this); 33303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 33323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 33333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 33353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : releasePiPBuff 33363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Release video in video temp buffer 33383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : None 33403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : None 33423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 33433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid Interpreter::releasePiPBuff() { 33443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel free(mTestContext->mViVBuff.buff); 33453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestContext->mViVBuff.buff = NULL; 33463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 33473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 33493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : functionalTest 33503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: queries and executes client supplied commands for testing a 33523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * particular camera. 33533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 33553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @availableCameras : List with all cameras supported 33563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 33573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : status_t type of status 33583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * NO_ERROR -- continue testing 33593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * none-zero -- quit test 33603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 33613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelstatus_t TestContext::FunctionalTest() 33623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 33633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel status_t stat = NO_ERROR; 33643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel const char *ZSLStr = NULL; 33653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel size_t ZSLStrSize = 0; 33663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel assert(mAvailableCameras.size()); 33683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( !mInterpreter ) { 33703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpreter = new Interpreter(); 33713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpreter->setTestCtxInst(this); 33723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mAvailableCameras.size() == 0) { 33753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("no cameras supported... exiting test app\n"); 33763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 33773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestRunning = true; 33783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel while (mTestRunning) { 33813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel sp<CameraContext> currentCamera = 33823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mAvailableCameras.itemAt(mCurrentCameraIndex); 33833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Interpreter::Command command = 33843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpreter->getCommand(currentCamera); 33853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->enablePrintPreview(); 33863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel switch (command.cmd) { 33883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::SWITCH_CAMERA_CMD: 33893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex++; 33913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex %= mAvailableCameras.size(); 33923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera = mAvailableCameras.itemAt(mCurrentCameraIndex); 33933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->openCamera(); 33943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 33953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 33963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 33973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::RESUME_PREVIEW_CMD: 33983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 33993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->resumePreview(); 34003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::START_PREVIEW_CMD: 34043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->startPreview(); 34063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::STOP_PREVIEW_CMD: 34103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->stopPreview(); 34123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::CHANGE_VIDEO_SIZE_CMD: 34163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( command.arg ) 34183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->setVideoSize(command.arg); 34193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel else 34203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->nextVideoSize(); 34213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::CHANGE_PREVIEW_SIZE_CMD: 34253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( command.arg ) 34273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->setPreviewSize(command.arg); 34283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel else 34293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->nextPreviewSize(); 34303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::CHANGE_PICTURE_SIZE_CMD: 34343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( command.arg ) 34363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->setPictureSize(command.arg); 34373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel else 34383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->nextPictureSize(); 34393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::DUMP_CAPS_CMD: 34433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->printSupportedParams(); 34453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::AUTOFOCUS_CMD: 34493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->autoFocus(); 34513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::TAKEPICTURE_CMD: 34553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->takePicture(); 34573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::TAKEPICTURE_IN_PICTURE_CMD: 34613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mAvailableCameras.size() == 2) { 34633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSaveCurrentCameraIndex = mCurrentCameraIndex; 34643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for (size_t i = 0; i < mAvailableCameras.size(); i++) { 34653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex = i; 34663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera = mAvailableCameras.itemAt(mCurrentCameraIndex); 34673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->enablePiPCapture(); 34683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->takePicture(); 34693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex = mSaveCurrentCameraIndex; 34713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 34723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Number of available sensors should be 2\n"); 34733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::ENABLE_PRV_CALLBACKS_CMD: 34783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->enablePreviewCallbacks(); 34803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::START_RECORD_CMD: 34843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->stopPreview(); 34863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->configureRecorder(); 34873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->startPreview(); 34883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->startRecording(); 34893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 34903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 34913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::STOP_RECORD_CMD: 34933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 34943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->stopRecording(); 34953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 34963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->stopPreview(); 34973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->unconfigureRecorder(); 34983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->startPreview(); 34993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::START_VIV_RECORD_CMD: 35033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 35043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mAvailableCameras.size() == 2) { 35063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSaveCurrentCameraIndex = mCurrentCameraIndex; 35073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = mInterpreter->configureViVCodec(); 35083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for ( size_t i = 0; i < mAvailableCameras.size(); i++ ) { 35093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex = i; 35103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera = mAvailableCameras.itemAt( 35113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex); 35123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->stopPreview(); 35133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->configureViVRecording(); 35143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->startPreview(); 35153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->startViVRecording(); 35163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex = mSaveCurrentCameraIndex; 35183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Number of available sensors should be 2\n"); 35203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::STOP_VIV_RECORD_CMD: 35263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 35273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (mAvailableCameras.size() == 2) { 35283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mSaveCurrentCameraIndex = mCurrentCameraIndex; 35293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel for ( size_t i = 0; i < mAvailableCameras.size(); i++ ) { 35303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex = i; 35313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera = mAvailableCameras.itemAt( 35323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex); 35333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->stopViVRecording(); 35343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->stopPreview(); 35353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->unconfigureRecorder(); 35363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = currentCamera->startPreview(); 35373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel stat = mInterpreter->unconfigureViVCodec(); 35393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex = mSaveCurrentCameraIndex; 35403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mInterpreter->releasePiPBuff(); 35423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Number of available sensors should be 2\n"); 35443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::EXIT_CMD: 35493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 35503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->stopPreview(); 35513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mTestRunning = false; 35523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::DELAY: 35563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 35573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( command.arg ) { 35583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel int delay = atoi(command.arg); 35593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (0 < delay) { 35603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel usleep(1000U * (unsigned int)delay); 35613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel case Interpreter::ZSL_CMD: 35673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 35683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera = mAvailableCameras.itemAt( 35693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mCurrentCameraIndex); 35703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ZSLStr = currentCamera->getZSL(); 35713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (NULL != ZSLStr) { 35733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ZSLStrSize = strlen(ZSLStr); 35743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (!strncmp(ZSLStr, "off", ZSLStrSize)) { 35753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->setZSL("on"); 35763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mIsZSLOn = true; 35773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else if (!strncmp(ZSLStr, "on", ZSLStrSize)) { 35783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->setZSL("off"); 35793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mIsZSLOn = false; 35803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Set zsl failed!\n"); 35823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } else { 35843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("zsl is NULL\n"); 35853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel default: 35903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel { 35913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel currentCamera->disablePrintPreview(); 35923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel break; 35943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Command status 0x%x \n", stat); 35963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 35973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 35983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return NO_ERROR; 35993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : PiPLock 36033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Mutex lock for PiP capture 36053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 36073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 36093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid TestContext::PiPLock() 36113d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36123d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(mPiPLock); 36133d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel while (mPiPinUse) { 36143d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPCond.wait(mPiPLock); 36153d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 36163d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPinUse = true; 36173d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36183d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36193d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36203d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : PiPUnLock 36213d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36223d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Mutex unlock for PiP capture 36233d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36243d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 36253d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36263d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 36273d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36283d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid TestContext::PiPUnlock() 36293d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36303d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(mPiPLock); 36313d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPinUse = false; 36323d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mPiPCond.signal(); 36333d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36343d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36353d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36363d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ViVLock 36373d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36383d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Mutex lock for ViV Video 36393d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36403d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 36413d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36423d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 36433d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36443d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid TestContext::ViVLock() 36453d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36463d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(mViVLock); 36473d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel while (mViVinUse) { 36483d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVCond.wait(mViVLock); 36493d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 36503d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVinUse = true; 36513d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36523d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36533d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36543d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : ViVUnlock 36553d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36563d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION: Mutex unlock for ViV Video 36573d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36583d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : none 36593d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36603d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 36613d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36623d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid TestContext::ViVUnlock() 36633d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36643d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel Mutex::Autolock l(mViVLock); 36653d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVinUse = false; 36663d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVCond.signal(); 36673d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36683d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36693d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36703d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : setViVSize 36713d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36723d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : Set video in video size 36733d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36743d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 36753d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @VideoSize : video size 36763d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @camIndex : camera index 36773d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36783d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : none 36793d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36803d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelvoid TestContext::setViVSize(Size VideoSize, int camIndex) 36813d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36823d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel mViVVid.VideoSizes[camIndex] = VideoSize; 36833d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 36843d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 36853d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel/*=========================================================================== 36863d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * FUNCTION : main 36873d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36883d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * DESCRIPTION : main function 36893d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36903d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * PARAMETERS : 36913d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @argc : argc 36923d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * @argv : argv 36933d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * 36943d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel * RETURN : int status 36953d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel *==========================================================================*/ 36963d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudelint main(int argc, char *argv[]) 36973d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel{ 36983d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel TestContext ctx; 36993d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 37003d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if (argc > 1) { 37013d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel if ( ctx.AddScriptFromFile((const char *)argv[1]) ) { 37023d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel printf("Could not add script file... " 37033d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel "continuing in normal menu mode! \n"); 37043d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 37053d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel } 37063d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 37073d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel ctx.FunctionalTest(); 37083d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel 37093d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel return 0; 37103d63919a23d7e7954e160c48c36713267106c3c2Thierry Strudel} 3711