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